web-dev-qa-db-ja.com

Perlを使用してファイルを配列に読み込む

現在、ファイルを読み取っており、そのデータを@linesという名前の配列に格納しています。次に、forループを使用してこの配列をループし、ループ内で特定の値を照合します。

$find = "fever";

if ($_ =~ /$find/) {
    print "$_\n";
    $number++;
    #@lines =
    #print ("there are : " . $number);
}

現時点では、各フィルターに対して繰り返しステートメントを実行する代わりに、feverの値を持つスカラー$findを使用しています。

スカラーキーワードの代わりに比較のために配列を渡すことはできますか?

14
alex

ファイルをリストに読み込んだ場合、一度にすべてが取得されます

@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>
33
Ed Guiness

Tie :: File を使用します。ファイルを配列にロードし、配列操作を使用して操作できます。ファイルの結合を解除すると、そのコンポーネントがファイルに保存されます。

5
Geo

Perl 5.10以降を使用している場合は、スマートマッチング(~~):

my @patterns = (qr/foo/, qr/bar/);

if ($line ~~ @patterns) {
    print "matched\n";  
}
5
Eugene Yarmash

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 ユーティリティもご覧ください。 (実際には、これは優れた代替手段です。)

4
Lumi