現在、ファイルを読み取っており、そのデータを@lines
という名前の配列に格納しています。次に、for
ループを使用してこの配列をループし、ループ内で特定の値を照合します。
$find = "fever";
if ($_ =~ /$find/) {
print "$_\n";
$number++;
#@lines =
#print ("there are : " . $number);
}
現時点では、各フィルターに対して繰り返しステートメントを実行する代わりに、fever
の値を持つスカラー$find
を使用しています。
スカラーキーワードの代わりに比較のために配列を渡すことはできますか?
ファイルをリストに読み込んだ場合、一度にすべてが取得されます
@array = <$fh>; # Reads all lines into array
これをスカラーコンテキストの読み取りと比較してください。
$singleLine = <$fh>; # Reads just one line
ファイル全体を一度に読み取ることは問題になる可能性がありますが、あなたはそのアイデアを理解します。
次に、grep
を使用して配列をフィルタリングできます。
@filteredArray = grep /fever/, @array;
次に、scalar
を使用してフィルターされた行の数を取得できます。これにより、配列の解釈にスカラー(つまり、単一の値)コンテキストが強制され、この場合は数が返されます。
print scalar @filteredArray;
すべてを一緒に入れて...
C:\temp>cat test.pl
use strict; use warnings; # always
my @a=<DATA>; # Read all lines from __DATA__
my @f = grep /fever/, @a; # Get just the fevered lines
print "Filtered lines = ", scalar @f; # Print how many filtered lines we got
__DATA__
abc
fevered
frier
forever
111fever111
abc
C:\temp>test.pl
Filtered lines = 2
C:\temp>
Tie :: File を使用します。ファイルを配列にロードし、配列操作を使用して操作できます。ファイルの結合を解除すると、そのコンポーネントがファイルに保存されます。
Perl 5.10以降を使用している場合は、スマートマッチング(~~
):
my @patterns = (qr/foo/, qr/bar/);
if ($line ~~ @patterns) {
print "matched\n";
}
File::Slurp
モジュール、これは便利です。
use strict;
use warnings;
use File::Slurp 'read_file';
my $fname = shift or die 'filename!';
my @lines = grep /fever/, read_file $fname; # grep with regular expression
print @lines;
Perlを初めて使用する場合は、リストの処理に便利なmap
演算子とgrep
演算子をご覧ください。
また、ack
/find
に代わる優れた grep
ユーティリティもご覧ください。 (実際には、これは優れた代替手段です。)