私はそうならば、それは動作しませんので、これは、あなたの実際のコードではないことを前提としています
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次元配列に格納します。何らかの理由でファイル全体を実際にメモリに保存する必要がないかぎり、ファイルハンドルを直接使用して行単位で読み取ることをお勧めします。
出典
2012-04-18 15:16:57
TLP
http://stackoverflow.com/questions/2304577/how-can-i-store-regex-captures-in-an-array-in-perl? – Scroog1
私はいつもsplitを使用するhttp://stackoverflow.com/questions/874915/perl-extracting-data-from-text-using-regexが好きです。あなたの正規表現は候補者のようです。 – Konerak