これは実際のコードではないと思います。そうであれば、機能しないからです。
foreach my $line (split("\n", $file)) {
if ($line =~ /^(\S+)\s*(\S+)\s*(\S+)$/) {
my ($val1, $val2, $val3) = ($1, $2, $3);
}
# all the $valX variables are now out of scope
}
\s*
は空の文字列にも一致し、微妙なエラーが発生する可能性があることにも注意してください。例えば:
"a bug" =~ /^(\S+)\s*(\S+)\s*(\S+)$/;
# the captures are now: $1 = "a"; $2 = "bu"; $3 = "g"
貪欲であるという事実にもかかわらず、\S+
アンカー^ ... $
は正規表現を強制的に適合させるため、空の文字列が単語を分割できるようにします。
空白で区切られたすべての単語をキャプチャすることを意図している場合split
は、他の人が既に述べたように、使用が最良のオプションです。
open my $fh, "<", "file.txt" or die $!;
my @stored;
while (<$fh>) {
my @vals = split;
push(@stored, \@vals) if @vals; # ignore empty values
}
これにより、キャプチャされた値が 2 次元配列に格納されます。なんらかの理由で実際にファイル全体をメモリに格納する必要がない限り、ファイル ハンドルを直接使用して行単位で読み取る方法が推奨されます。