我正在学习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:只打印一次?
如何在尽可能少的行中编写此脚本?
如果你有时间,请评论我的代码.
谢谢.
while将菱形运算符<>读取的行存储到$ _中,因此您将写入存储文件名的变量.
另一方面,您打开文件open但实际上并没有使用句柄来阅读; 它使用空钻石运算符代替.空菱形运算符对文件进行隐式循环@ARGV,删除文件名,因此foreach只运行一次.
要修复你可以使用的第二个问题while(<FILE>),或者重写循环以利用隐式循环<>并将整个程序写为:
$^I = "";
/^\s*#[^!]/ || print while(<>);
Run Code Online (Sandbox Code Playgroud)