加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用perl的qx {} /`…`运算符和参数列表

发布时间:2020-12-15 21:47:27 所属栏目:大数据 来源:网络整理
导读:system,exec,open’| – ‘,open2等都允许我指定命令作为参数列表运行,这些参数将直接传递给execvp而不是通过 shell运行. 即使perl足够聪明,如果它看起来像一个“简单”的命令,也可以直接运行它,这样可以省去正确的shell逃避参数所带来的所有令人讨厌的陷阱
system,exec,open’| – ‘,open2等都允许我指定命令作为参数列表运行,这些参数将直接传递给execvp而不是通过 shell运行.

即使perl足够聪明,如果它看起来像一个“简单”的命令,也可以直接运行它,这样可以省去正确的shell逃避参数所带来的所有令人讨厌的陷阱的麻烦.

例:

open my $out,'|-',$prog,@args;
system $prog,@args;
exec $prog,@args;

代替

open my $out,"|$prog @args";
system "$prog @args";
exec "$prog @args";

qx //运算符是否有这样的等价物?或者你必须总是手工完成,例如.

sub slurpcmd {
   open my $h,'-|',@_ or die "open $_[0]|: $!";
   local $/ unless wantarray;
   <$h>
}

解决方法

模块 IPC::System::Simple提供qx运算符的列表形式作为函数capturex(另外与该模块中的其他函数一样,如果存在执行错误或非零响应代码,它将抛出异常,您可以调整它) .或者,您可以使用 Capture::Tiny来包装核心系统调用并提供相同的行为,但它也有其他功能可以将STDERR包装在一起或与STDOUT分开.
use strict;
use warnings;
use IPC::System::Simple 'capturex';
my $output = capturex $prog,@args;

use Capture::Tiny 'capture_stdout';
my ($output,$exit) = capture_stdout { system $prog,@args };
# standard system() error checking required here

在核心中,管道打开在很大程度上是唯一的选择,除了IPC::Open3,它同样复杂但也允许指向STDERR.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读