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

-l $_在Perl中做了什么,它是如何工作的?

发布时间:2020-12-15 23:29:57 所属栏目:大数据 来源:网络整理
导读:嵌套代码的含义是什么? foreach (@items){ if (-l $_) ## this is what I don't understand: the meaning of -l { ... }} 谢谢你的帮助. 解决方法 让我们看看每件事: foreach (@items) { ...} 这个for循环(foreach和for是Perl中的相同命令)从@items列表中
嵌套代码的含义是什么?

foreach (@items)
{
    if (-l $_)    ## this is what I don't understand: the meaning of -l
    {
        ...
    }
}

谢谢你的帮助.

解决方法

让我们看看每件事:

foreach (@items) {
    ...
}

这个for循环(foreach和for是Perl中的相同命令)从@items列表中获取每个项目,并将其设置为$_. $_是Perl中的一个特殊变量,用作默认变量的一种.这个想法是你可以做这样的事情:

foreach (@items) {
    s/foo/bar/;
    uc;
    print;
}

并且每个命令都会对$_变量进行操作!如果你只是说没有别的东西打印,它会打印$_中的任何内容.如果你说uc并没有提到变量,它会大写$_中的任何内容.

由于几个原因,现在不鼓励这样做.首先,$_是全局的,因此可能存在无意的副作用.例如,假设您调用的子程序的值为$_.您会突然惊讶于您的程序不起作用.

另一个-l是一个test操作符.此运算符检查给定的文件是否为符号链接.我已经链接到解释所有测试操作符的Perldoc.

如果您不熟悉Unix或BASH / Korn / Bourne shell脚本,那么使用以破折号开头的命令看起来很奇怪.但是,Perl的大部分语法都被盗了……我的意思是借用Unix shell和awk命令.在Unix中,有一个名为test的命令,您可以这样使用:

if test -L $FILE
then
    ....
fi

在Unix中,-L是test命令的参数,在Unix中,命令的大多数参数都以短划线开头. Perl只是借用了相同的语法破折号和所有.

有趣的是,如果您为这些测试命令读取Perldoc,您会注意到,与foreach循环一样,如果您没有给它变量或文件名,各种测试命令将使用$_变量.编写该脚本的人可以像这样编写循环:

foreach (@items)
{
    if (-l)   ## Notice no mention of the `$_` variable
    {
        ...
    }
}

是的,那太清楚了!

只是为了您的信息,许多Perl专家(咳嗽Damian Conway咳嗽)推荐的现代方法是尽可能避免$_变量,因为它不会真正增加清晰度并可能导致问题.他还建议只说和忘记foreach,并在同一行使用花括号:

for my $file (@items) {
    if ( -l $file ) {
        ...
    }
}

这可能对-l命令没有帮助,但至少你可以看到你正在处理文件,所以你可能会怀疑-l与文件有关.

不幸的是,Perldoc将所有这些文件测试放在-X部分下并按字母顺序排列在X下,所以如果你在Perldoc中搜索-l命令,或者用破折号开头的任何命令,你将找不到它,除非你懂.但是,至少你现在知道将来在哪里看到这样的东西:-s $file.

(编辑:李大同)

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

    推荐文章
      热点阅读