在你的情况下,使用
qx/ls @files/;
够了。
@files会被插入到qx//的参数(字符串)中,不需要放在字符串中。
如果您的@files 的任何元素有空格,那么qx/ls @files/ 将不起作用。比如下面的代码
my @files=('A.txt', 'B.txt', 'C .txt');
print qx/ls @files/;
会给出这些错误:
ls: .txt: No such file or directory
ls: A.txt: No such file or directory
ls: B.txt: No such file or directory
ls: C: No such file or directory
这可以通过引用@files 的每个元素来解决,实现此目的的一种方法是
my @files=('A.txt', 'B.txt', 'C .txt');
my $files;
$files .= " \Q$_" for @files;
print qx/ls $files/;
另一种方法是使用map:
my @files=('A.txt', 'B.txt', 'C .txt');
@files = map { "\Q$_" } @files;
print qx/ls @files/;
上面的代码会出现以下错误(如预期的那样)
ls: A.txt: No such file or directory
ls: B.txt: No such file or directory
ls: C .txt: No such file or directory
更新:
\Q 无法处理文件名中嵌入的换行符,正如@choroba 所指出的那样。此问题的可能修复,\'$_\',无法处理嵌入的单引号。看起来我们需要将它们组合在一起:
my @files=('A.txt', 'B.txt', 'C .txt', "D\t.txt", "E\n.txt", "F'.txt", 'G".txt');
my $files;
$files .= m/\n/ ? " \'$_\'" : " \Q$_" for @files;
print qx/ls $files/;
这将产生以下预期错误
ls: A.txt: No such file or directory
ls: B.txt: No such file or directory
ls: C .txt: No such file or directory
ls: D\t.txt: No such file or directory
ls: E\n.txt: No such file or directory
ls: F'.txt: No such file or directory
ls: G".txt: No such file or directory