为什么在 Perl 中,大括号不能被周围的反引号解释

  • 本文关键字:不能 周围 解释 Perl perl bash
  • 更新时间 :
  • 英文 :

my @cmd=`ls {??_in,??}.pl`;
print @cmd;

如果运行该程序,则说错误

    `ls: cannot access {??_in,??}.pl: No such file or directory`

现在它已经在终端上运行了

cmd>ls {??,??_in}.pl

cmd>aa_in.pl aa.pl ls.pl

所以它在 Commad 行中产生输出,为什么在 Perl 中不考虑那个大括号。

你可以使用 Perl 的内置glob来获取该文件列表,而不是对ls进行系统调用。

use Data::Dump;
dd [ glob '{??_in,??}.pl' ];

将打印与模式匹配的文件列表。glob将负责填写通配符和查找文件。


另请注意,您正在将反引号的返回值分配给标量变量 $cmd ,但您正在尝试打印数组@cmd 。这些是不同的变量。它还会导致错误全局符号"@cmd"需要明确的包名称...如果您打开了use strict(您应该这样做!)。

我认为这是基于调用哪个外壳。 您使用的是特定于 bash 的大括号扩展,POSIX 外壳不支持。

在我的系统上,我得到以下结果:

$ perl -e '`sh -c "ls src/{*.pl,*.h}"` and print "successn"'
ls: cannot access src/{*.pl,*.h}: No such file or directory
$ perl -e '`bash -c "ls src/{*.pl,*.h}"` and print "successn"'
success

所以,我的结论是perl是调用"sh"。 你可以通过使用"bash -c"来解决它,就像我的例子一样。

相关内容

  • 没有找到相关文章

最新更新