2016-04-04 10 views
-1

まず最初に、私はPerlを全く知らない。私は主に最後の1/2年のC++を勉強してきました。私はLinuxコマンドを教えているクラスに入っています。Linuxで使われている言語については、少し話題があります。Perlはループのために私を投げかけています。私は空白とタブで区切られた一連の乱数を含むテキストファイルを持っています。おそらく改行でさえ、ファイルハンドルを介してプログラムに読み込まれます。私は、数値の行を分割し、foreachループの内部で1つの配列にそれらをマージするコードの2行を書くことになっています。私は答えを探しているわけではなく、ちょうど正しい方向に微笑んでいます。私は何時間も違うことを試してきましたが、まったく愚かではありません。私はそれを得ることができません。私は完全に構文が失われています。ちょっとちょっと奇妙なことに、コンパイラの中で動作していないし、C++の外で働いている私の快適ゾーン外で働いている。ほんとうにありがとう。私はいくつかの写真を含んでいます。基本的には、数字とプログラムの残りの部分を保存するために書いているコードは、すべての数字の最小数と合計を決定します。私は何をすべきかわからないので、私の現在は間違っています。出力写真では、テキストファイルを介して入力されたすべての数値が表示されるので、それらを見ることができます。Perlの分割とマージの機能に問題がある

code

output

答えて

5

ここで解決するべきことはいくつかあります。まず、サンプルデータやコードのスクリーンショットを投稿しないでください。コードやデータをテストするためにコピー&ペーストすることは不可能です。あなたのコード/データを、4つのスペースとコードブロックの前の改行でインデントして投稿します。

お客様のスクリプトにuse strict;を追加してください。これはあなたのクラスのレッスン0でなければなりません。その後、すべての変数宣言にmyを追加します。

pushを使用せずに、あなたはこのようなものを使用することができ、各ラインの数字の内容で@all_numbersを移入するには、次の

foreach my $line (@output_lines) 
{ 
    my @numbers = split /\s/, $line; 
    @all_numbers = (@all_numbers, @numbers); 
} 
+0

私はそれが非常に不便だったことを認識します。私は検索可能にならないように、コードとコードの写真を掲載しました。私の教授がスタックオーバーフローをどの程度見ているのかは分かりません。彼らの誰も、しかし、コミュニティからの助けを使わないことに言及してきた人はいません。それは私の唯一の理由です。第二に、クラスはそれが進むにつれて巨大ですが、いずれかのトピックでかなりの時間を費やすことはありません。たとえば、Perlの講義では4時間しか費やしていませんが、私の2つの学期はすでにC++に専念しています。ありがとう、私はこれが本当に望んでいるものに近いと思う。 –

+0

私はちょうど2番目のマージライン、おかげでトンをnotateする方法がわからなかった。 –

+0

これはまさにそれでした。 100パーセント。ありがとう、トン。 –

4

私はあなたの配列にすべての分割要素を格納する必要が願っていますので、あなたはpush機能を探しています。

foreach $line (@input_lines) 
{ 
    push(@all_numbers,split(/\s/,$line)); 

} 

あなたの問題は、すべての反復で、分割さ値が一緒に追加しない配列で書かれた上にあります。これは新しい値で再初期化されるので、例えば、

@array = qw(one two three); 
@array = qw(five four seven); 
print "@array"; 

出力がfive four sevenone two three five four sevenではありません。

:あなたは前にまたは例

@array = qw(one two three); 
push(@array,qw(five four seven)); 
+0

を参照してくださいにコードブロック、私はあなたに小さなタイプミスがあり、 '$ _'の代わりに' $ line'を分割するつもりだと思っています –

+0

@CraigEstey Yaありがとうございました...投稿編集: – mkHun

+0

私はそれについて "ニット"には嫌ったが、OPは彼が[おそらく]例で精度を必要とする段階にあります。また、これまでのところ、最もクリーンな/最速の方法であるpushを実行しているのは唯一の人です[sferncik _did_はそのドキュメントをリンクしてください] –

4

あなたはしていると言うために使用unshiftまたはpush 後、配列に新たな価値を付加したい「の回答を探していない、」ので、ここであなたのナッジですあなたはほとんどそこにいます。各行をよく分割し(split/\s/を使用)、数値を@all_numbersに格納します。しかし、ループのたびに、の内容全体を現在の行にある番号に置き換えます(割り当てを使用して、@all_numbers = ...を使用することに注意してください)。効果的には、前の行から保存したものすべてを捨ててしまいます。

には、@all_numbersを置き換えずに、@all_numbersを追加します。これを行う方法についてはpush() functionをご覧ください。

注:split()の電話は問題ありませんが、この場合はsplit(' ', $line)を使用するのがより一般的です。 (split()を参照してください:任意の空白で分割する場合は、/\s/というパターンの代わりに、単一のスペース' 'を使用してください)

+0

出力を見ると、出力が最後の行と私はそれを上書きしていると考えていましたが、配列の各要素へのアクセス方法はわかりませんでした。 C++では、配列の添え字内のループのインクリメントまたはデクリメントカウンタを使って新しい要素にアクセスしますが、ここではその方法を知りませんでした。私はプッシュ機能を見ていきますが、学習しているレッスンの範囲外になっている可能性があるので、代替案を見つけなければならないかもしれません。 –

+0

ここでは 'push()'に慣れて使いたいと思っています。 Perl言語の中心にあります。そして、使用するのも簡単です。それから恥ずかしがり屋:-) – sferencik

関連する問題