没有数组的perl中的grep

时间:2012-07-12 08:11:21

标签: perl grep

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

$var = `cat file_name`

假设在文件中,'mine'这个词出现在第17行(位置不可用但只是举例)我想在N(例如10)行'mine'之后搜索一个模式'word'如果模式'word'存在于这些行中或不存在。如何在不使用数组'

的情况下在正则表达式中执行此操作

示例:

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

我想在特定行中搜索特定模式(仅限第2行到第3行)。如何在不使用数组的情况下完成。

3 个答案:

答案 0 :(得分: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;
}

<强>买者

上面的子目录不是为处理单个文件中的多个匹配而设计的。让这成为读者的练习。

答案 1 :(得分: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以获取与正则表达式匹配的教程。

答案 2 :(得分:-1)

试试这个:

perl -ne '$m=$. if !$m && /first-pattern/;
print if $m && ($.-$m >= 2 && $.-$m <= 3) && /second-pattern/'