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 元素。