foreach和特殊变量$ _的行为不符合预期

GrS*_*Srv 5 perl

我正在学习Perl并编写了一个小脚本来打开perl文件并删除注释

# Will remove this comment

my $name = ""; # Will not remove this comment

#!/usr/bin/perl -w < - 不要删除此特别评论

要编辑的文件名称通过终端作为参数传递

die "You need to a give atleast one file-name as an arguement\n" unless (@ARGV);

foreach (@ARGV) {
    $^I = "";
    (-w && open FILE, $_) || die "Oops: $!";
    /^\s*#[^!]/ || print while(<>);
    close FILE;
    print "Done! Please see file: $_\n";
}
Run Code Online (Sandbox Code Playgroud)

现在我通过终端运行它: perl removeComments file1.pl file2.pl file3.pl

我得到了输出: Done! Please see file:

这个脚本正如我所期待的那样完全正常工作

问题1:为什么$_不打印文件名?

问题2:由于循环运行3次,为什么Done! Please see file:只打印一次?

如何在尽可能少的行中编写此脚本?

如果你有时间,请评论我的代码.

谢谢.

Jon*_*oni 9

while将菱形运算符<>读取的行存储到$ _中,因此您将写入存储文件名的变量.

另一方面,您打开文件open但实际上并没有使用句柄来阅读; 它使用空钻石运算符代替.空菱形运算符对文件进行隐式循环@ARGV,删除文件名,因此foreach只运行一次.

要修复你可以使用的第二个问题while(<FILE>),或者重写循环以利用隐式循环<>并将整个程序写为:

$^I = "";
/^\s*#[^!]/ || print while(<>);
Run Code Online (Sandbox Code Playgroud)