2

如果我有一个变量:我将整个文件文本分配给它

$var = `cat file_name`

假设在文件中,单词 'mine' 出现在第 17 行(位置不可用,只是举例说明),如果模式 'word ' 是否存在于这些行中。我如何在不使用数组的情况下在正则表达式中做到这一点

例子:

$var = "I am good in perl\n but would like to know about the \n grep command in details";

我想在特定行中搜索特定模式(仅限第 2 到 3 行)。我怎么能不使用数组来做到这一点。

4

3 回答 3

1

这里有一个不使用数组的有效案例 - 当文件非常大时。

这是一个非常具体的要求。与其拐弯抹角地找到那个 Perl 习语,我会开一个子例程:

 sub n_lines_apart {

    my ( $file, $n, $first_pattern, $second_pattern ) = @_;

    open my $fh, '<', $file or die $!;

    my $lines_apart;

    while (<$fh>) {

        $lines_apart++ if qr/$first_pattern/ .. qr/$second_pattern/;
    }

    return $lines_apart && $lines_apart <= $n+1;
}

警告

上面的子代码并非旨在处理单个文件中的多个匹配项。让这成为读者的练习。

于 2012-07-12T10:58:14.860 回答
0

您可以使用这样的正则表达式匹配来做到这一点:

my $var = `cat $filename`;
while ( $var =~ /foo/g ) {
    print $1, "\n";
    print "match occurred at position ", pos($var), " in the string.\n";
}

这将从您的字符串中打印出字符串 'foo' 的所有匹配项,类似于 grep 但不使用数组(或列表)。/$regexp/g 语法使正则表达式从左到右迭代匹配字符串。

我建议阅读perlrequick以获取有关与正则表达式匹配的教程。

于 2012-07-12T08:29:41.953 回答
-1

尝试这个:

perl -ne '$m=$. if !$m && /first-pattern/;
print if $m && ($.-$m >= 2 && $.-$m <= 3) && /second-pattern/'
于 2012-07-12T08:28:43.317 回答