gpt4 book ai didi

perl - 为什么 Perl 的 $.和 $ARGV 在设置 @ARGV 并使用 <> 后表现异常

转载 作者:行者123 更新时间:2023-12-04 17:23:16 26 4
gpt4 key购买 nike

我编写了一个 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 中的每个文件在它开始迭代之前放入一个临时列表。

关于perl - 为什么 Perl 的 $.和 $ARGV 在设置 @ARGV 并使用 <> 后表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16697489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com