【问题标题】:Splitting perl array into separate arguments in qx operator在 qx 运算符中将 perl 数组拆分为单独的参数
【发布时间】:2014-05-10 11:07:18
【问题描述】:

我正在尝试将一组参数传递给qx 运算符。考虑

my @files=qw(A.txt B.txt);
print qx/ls "@files"/;

这给出了错误:

ls: cannot access A.txt B.txt: No such file or directory

而显式替换数组参数:

print qx/ls A.txt B.txt/;

工作正常。如何将 perl 数组传递给 qx 运算符,以便每个数组元素成为 shell 命令的单独参数?

【问题讨论】:

  • 当前目录中是否有名为 A.txt 和 B.txt 的文件。如果不是,这是 ls 的预期错误消息
  • @Tejas:这是一个名为“A.txt B.txt”的文件的错误消息,而不是两个文件。

标签: perl


【解决方案1】:

去掉引号,就好像你在 shell 中输入了 ls "A.txt B.txt"

print qx/ls @files/;

警告:如果您的数组中有名称中包含空格的文件,这将不起作用。您可以单独引用它们,但这听起来不是一个好主意,并且处理所有特殊字符肯定会在某些时候中断。在这一点上,我建议根本不要使用外部程序,而是使用 Perl 功能。

【讨论】:

    【解决方案2】:

    在你的情况下,使用

    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
    

    【讨论】:

    • 只是一个挑剔:它不适用于带有换行符的文件名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多