如果我有一个变量:我将整个文件分配给它
$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行)。如何在不使用数组的情况下完成。
答案 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/'