我编写了一个perl程序,从命令行获取正则表达式,并对当前目录进行某些文件名和文件类型的递归搜索,为正则表达式grep每一个,并输出结果,包括文件名和行号。 [基本的grep +查找我可以进入并根据需要自定义的功能]
cat <<'EOF' >perlgrep2.pl
#!/usr/bin/env perl
$expr = join ' ', @ARGV;
my @filetypes = qw(cpp c h m txt log idl java pl csv);
my @filenames = qw(Makefile);
my $find="find . ";
my $nfirst = 0;
foreach(@filenames) {
$find .= " -o " if $nfirst++;
$find .= "-name \"$_\"";
}
foreach(@filetypes) {
$find .= " -o " if $nfirst++;
$find .= "-name \\*.$_";
}
@files=`$find`;
foreach(@files) {
s#^\./##;
chomp;
}
@ARGV = @files;
foreach(<>) {
print "$ARGV($.): $_" if m/\Q$expr/;
close ARGV if eof;
}
EOF
cat <<'EOF' >a.pl
print "hello ";
$a=1;
print "there";
EOF
cat <<'EOF' >b.pl
print "goodbye ";
print "all";
$a=1;
EOF
chmod ugo+x perlgrep2.pl
./perlgrep2.pl print
如果您将其复制并粘贴到终端中,您会看到:
perlgrep2.pl(36): print "hello ";
perlgrep2.pl(0): print "there";
perlgrep2.pl(0): print "goodbye ";
perlgrep2.pl(0): print "all";
perlgrep2.pl(0): print "$ARGV($.): $_" if m/\Q$expr/;
这对我来说非常令人惊讶。该程序似乎正在工作,除了$。和$ ARGV变量没有我期望的值。从变量的状态看,perl在执行循环的第一次迭代时已经读取了所有三个文件(总共36行)&lt;&gt ;.这是怎么回事 ?怎么修 ?这是Perl 5.12.4。
答案 0 :(得分:10)
您正在使用foreach(<>)
,您应该使用while(<>)
。 foreach(<>)
会在开始迭代之前将@ARGV
中的每个文件读入临时列表。