2016-09-09 19 views
0

テキストファイルのような行列が与えられているので、3番目の列(pos 2)に値> 60、値> 80を含むすべての行(\tは区切り記号です) 6番目(pos 5)に出力して別のファイルに出力してください。これまでのところ私は次のようになりました:Perl:行列ファイルから特定の値を抽出する

#!/usr/bin/perl; 
use strict; 
use warnings; 
use diagnostics; 

open(my $in, "file.txt")or die $!; 
my $line = <$in>; 
my $count; 
while (<$in>) { 
    chomp; 
    my @element = split (/\t/,$_); 
    if ($element[2] >= 60 && $element[5] > 80){ 
     $count++; 
    } 
} 
close $in; 
print $count; 

何が問題なのですか?ありがとうPS。私は同様の質問を見つけましたが、私の低レベルのPerlスキルは解決策を抽出できませんでした。

+0

されるのではなく$カウントをインクリメントするの、あなたが印刷「$ _ \ n」を単に行うことができます。行を画面に印刷します。そうすれば、if文から正しい行が得られているかどうかを確認することができます。あなたが要素の数を取得していない分割に問題がある場合は、別のバックスラッシュでバックスラッシュをエスケープする必要があります。 – Glenn

答えて

0
  1. openに読み取りモード(<)を追加していません。
  2. ファイル内の行が実際にタブで区切られていることを確認してください。

以下は私にとってうまく機能しました。ファイルのfile.txtを

10 20 60 40 50 90 70 80 
10 20 20 40 50 30 70 80 
10 20 40 40 50 50 70 80 
10 20 65 40 50 80 70 80 
10 20 70 40 50 90 70 80 
10 20 50 40 50 90 70 80 

即ち、第1及び第五行はif条件を満たし

#!/usr/bin/perl 
use strict; 
use warnings; 

open(my $in, "<", "file.txt") or die $!; 

my $count; 

while (<$in>) { 
    chomp; 
    my @element = split (/\t/,$_); 
    if ($element[2] >= 60 && $element[5] > 80){ 
     $count++; 
    } 
} 

close $in; 
print $count; 

。あなたはそれを書いて、私のENEVは、テキストファイルの内容を置き換えるよう

0

私はコピーを持って、コードを貼り付けたが、それでも私は、次のエラーメッセージが表示されます。

Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 1. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 2. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 3. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 4. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 5. 
Use of uninitialized value $element[2] in numeric ge (>=) at C:\Perl64\Temp1\ex.pl line 12, <$in> line 6. 
Use of uninitialized value $count in print at C:\Perl64\Temp1\ex.pl line 18. 

はどれそれに取りますか?

+0

次に、ファイル内の行は実際にタブ区切りではないと思います。 –

0

私は、ファイルを再作成し、タブ区切り、まだ得られます。

Use of uninitialized value $count in print at C:\Perl64\Temp1\ex.pl line 19. 

ライン19はprint $count;

+0

これは、$カウントが増加しなかったことを意味します。つまり、if条件が成功しなかったことを意味します。 3番目と6番目の列がそれぞれ60と80より大きい値を持たない場合に該当します。このデモが正しく動作しているのを見てください:http://ideone.com/evjXgj –

+0

また、回答の追加/削除をしないでください。代わりに質問を編集して、データを追加することもできます。 –

+0

実際、再作成されたファイルでは、1つの条件だけが真です。ありがとうございました。 – Megiddo

関連する問題