为什么Perl是$.设置@ARGV并使用<>后,$ARGV表现得很奇怪
发布时间:2020-12-15 21:47:03 所属栏目:大数据 来源:网络整理
导读:我编写了一个perl程序,从命令行获取正则表达式,并对当前目录进行某些文件名和文件类型的递归搜索,为每个正则表达式grep,并输出结果,包括文件名和行号. [基本的grep查找功能,我可以进入并根据需要自定义] cat 'EOF' perlgrep2.pl#!/usr/bin/env perl$expr = j
我编写了一个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行)<> ;.这是怎么回事 ?怎么修 ?这是Perl 5.12.4. 解决方法
您正在使用foreach(<>),而您应该使用while(<>). foreach(<>)会在开始迭代之前将@ARGV中的每个文件读入临时列表.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |