在Perl中,<*>是什么意思?

8
在下面的代码中,<*> 命令到底是做什么用的?
my @usbHddFileList = <*>;
foreach $usbHddFile (@usbHddFileList)
{
    system("rm -f $curMountDir/$usbHddFile < /dev/null > /dev/null 2>&1");
}

18
除:使用 system("rm ...") 命令删除文件是极其不规范的方式,并带来安全风险(考虑一下文件名中带有 $(rm -rf ~) 的情况)。应改用 unlink() 命令。 - Charles Duffy
回复:"也许搜索引擎不喜欢特殊字符"。在谷歌中,您可以引用特殊字符,例如这个谷歌搜索,除非您包括周围的引号,否则无法找到文件测试运算符。 - Håkon Hægland
4
谷歌会丢弃大多数特殊字符,即使用引号引起来(例如我搜索 perl Xperl "-X" 的结果相同)。例如,在 perlop 中出现无数次的 <>,可以搜索这个问题的主题,或者使用 symbolhound 进行搜索,虽然 perlop、perlvar 等更好。请注意,这里没有解释性内容。 - ThisSuitIsBlackNot
@ThisSuitIsBlackNot 哇,我之前不知道这个.. Symbolhound 看起来很好用。 - Håkon Hægland
2个回答

9

这是一个 glob。根据 perlop 的说法:

如果尖括号内的内容既不是文件句柄,也不是包含文件句柄名称、类型环境或者类型环境引用的简单标量变量,那么它就会被解释为文件名模式进行 glob 匹配,返回文件名列表或者下一个文件名(取决于上下文)。这种区分仅基于语法。


在OP的代码中,它特别返回当前工作目录中所有(非点)文件的名称,并将它们存储在@usbHddFileList中。 - ThisSuitIsBlackNot

9
  • <>的意思是readline(ARGV)
  • <IDENTIFIER>的意思是readline(IDENTIFIER)
  • <$IDENTIFIER>的意思是readline($IDENTIFIER)[1]
  • <...>(其他任何内容)的意思是glob(qq<...>)

因此,<*>的意思是glob(qq<*>)glob('*')

glob用于从模式生成多个字符串或文件名。

在列表上下文中,<*>也就是glob('*')返回当前工作目录中除以点开头的文件之外的所有文件。


  1. 请注意,<$$x><${$x}><$h{x}>不符合此规则。这些都是通配符。如果要间接访问文件句柄,请使用临时变量或使用readline代替<>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接