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"来解决它,就像我的例子一样。