【问题标题】:Is it possible to call a function within qx?是否可以在 qx 中调用函数?
【发布时间】:2014-06-18 12:29:11
【问题描述】:

这里有一些 Perl 代码可以满足我的要求:

 my $value  = get_value();
 my $result = qx(some-shell-command $value);

 sub get_value {
   ...
   return ...
 }

不使用$value也能达到同样的效果吗?类似的东西

my $result = qx (some-shell-command . ' '. get_value());

我知道为什么第二种方法行不通,只是为了演示这个想法。

【问题讨论】:

    标签: perl qx


    【解决方案1】:
    my $result = qx(some-shell-command  @{[ get_value() ]});
    
    # or dereferencing single scalar value 
    # (last one from get_value if it returns more than one)
    my $result = qx(some-shell-command  ${ \get_value() });
    

    但我宁愿使用您的第一个选项。

    解释: perl 数组在""qx() 等内部进行插值。

    上面是数组引用[]保存函数的结果,被@{}解引用,并在qx()内插值。

    【讨论】:

    • 感谢您的聪明解决方案。不过,我和你在一起,我仍然会使用 $value。
    • 这是因为qx 期望STDIN 成为一个列表吗?但是即使get_value() 返回一个列表,我们仍然需要[ ](匿名列表/数组),然后我们将其取消引用以提供给qx 的第一个元素......为什么需要这一步?这种语法是否以某种方式将所有内容都放在qx 分隔符内的一个列表中?
    • @G.Cito perl -e 'print qx( echo @{[ 3..7 ]} )' qx 接受字符串,@{} 插入提到的数组。
    • 啊好吧当然需要插值 anon 数组列表中的任何内容。换句话说:这是@{[ ]}"Babycart" list interpolation operator 的一个例子! +1 感谢您的解释:-)
    • @salva tnx 发表评论。
    【解决方案2】:

    反引号和qx 等效于内置的readpipe 函数,因此您可以显式使用它:

    $result = readpipe("some-shell-command " . get_value());
    

    【讨论】:

    • 酷,学到了新东西。主要是尝试纯 perl 解决方案,而不是把事情搞砸,但这很高兴知道。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2021-07-04
    • 1970-01-01
    • 2013-06-20
    • 2021-01-14
    相关资源
    最近更新 更多