使用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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |