您好,我正在制作一个将一组给定的关键字与文件匹配的程序。
我想将匹配的数据输出到文本文件,并包含触发匹配的正则表达式关键字。
以下是与我的问题相关的代码:
my $counter = 0;
foreach($words)
{
while($line = <FILE>)
{
if($line =~ /$words/)
{
print "@array[$counter] $linen";
print OUTPUT $line;
}
}
$counter ++;
}
这不会产生预期的结果。它非常适合数组中的第一个元素,但对于其余元素,它只是简单地再次打印第一个元素。我相信计数器没有增加。
有没有更好/更简单的方法来获取循环中使用的当前元素? 甚至获取当前的正则表达式匹配?
问题是<FILE>
耗尽第一个单词的文件。对于下一个单词,<FILE>
尝试在文件末尾读取,这意味着跳过整个循环。
您可以遍历文件循环中的单词,也可以查找返回到循环末尾的文件开头。
这是你应该做的:
use strict;
use warnings;
use 5.016;
my $fname = 'data.txt';
my @patterns = (
'do.',
'.at',
'.ir.',
);
open my $INFILE, '<', $fname
or die "Couldn't read from $fname: $!";
while (my $line = <$INFILE>) {
for my $pattern (@patterns) {
if ($line =~ /($pattern)/) {
print "$pattern --> $1";
}
}
}
close $INFILE:
在正则表达式的某些部分周围加上括号会导致 perl 设置匹配变量 $1、$2、$3 等,其中包含每个括号组的匹配项。
$line行尾将有一个换行符,因此如果您编写
print "$linen"
,您将添加另一个换行符,因此输出文件在您打印的每一行之间都会有空行。