Perlsgrep
関数は、特定の条件に一致するリストからすべての要素を選択/フィルタリングします。あなたの場合、配列/Number/
から正規表現に一致するすべての要素を選択しました。@input_file
Number
この正規表現を使用した後に非空白文字列を選択するには、次のようにします。
my $regex = qr{
Number # Match the literal string 'Number'
\s+ # match any number of whitespace characters
([^\s;]+) # Capture the following non-spaces-or-semicolons into $1
# using a negated character class
}x; # use /x modifier to allow whitespaces in pattern
# for better formatting
私の提案は、入力ファイルハンドルを直接ループすることです。
while(defined(my $line = <$input>)) {
$line =~ /$regex/;
print "Found: $1" if length $1; # skip if nothing was found
}
配列を使用する必要がある場合は、foreach
-loopを使用することをお勧めします。
foreach my $line (@input_lines) {
$line =~ /$regex/;
print "Found: $1" if length $1; # skip if nothing was found
}
一致を直接出力せずに配列に格納する場合はpush
、ループ内の配列に値を格納するか(両方とも機能します)、map
関数を使用します。map関数は、各入力要素を指定された操作の値に置き換えます。
my @result = map {/$regex/; length $1 ? $1 : ()} @input_file;
また
my @result = map {/$regex/; length $1 ? $1 : ()} <$input>;
ブロック内map
で、正規表現を現在の配列要素と照合します。一致するものがある場合はを返し$1
、そうでない場合は空のリストを返します。これは不可視に平坦化されるため、にエントリを作成しません@result
。undef
これは、配列にundef要素を作成するものを返す別の形式です。