加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – foreach和特殊变量$_不按预期运行

发布时间:2020-12-15 23:34:44 所属栏目:大数据 来源:网络整理
导读:我正在学习Perl并编写了一个小脚本来打开perl文件并删除注释 #将删除此评论 我的$name =“”; #不会删除此评论 #!/usr/bin/perl -w - 不会删除此特殊评论 要编辑的文件名称通过终端作为参数传递 die "You need to a give atleast one file-name as an argue
我正在学习Perl并编写了一个小脚本来打开perl文件并删除注释

#将删除此评论

我的$name =“”; #不会删除此评论

#!/usr/bin/perl -w< - 不会删除此特殊评论 要编辑的文件名称通过终端作为参数传递

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

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

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

我得到了输出:
完成!请看文件:

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

问题1:为什么$_没有打印文件的名称?

问题2:由于循环运行3次,为什么要完成!请看文件:只打印一次?

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

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

谢谢.

解决方法

while存储由钻石运算符读取的行<>进入$_,所以你要写的是存储文件名的变量.

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

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

$^I = "";
/^s*#[^!]/ || print while(<>);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读