我想对使用反引号的我的Perl程序进行单元测试.有没有办法模拟反引号,以便他们可以做一些与执行外部命令不同的东西?
另一个问题显示了我需要的东西,但是在Ruby中.不幸的是,我不能选择在这个项目中使用Ruby,也不想避免反引号.
我试图将curl调用的响应转换为perl中的变量.
my $foo = `curl yadd yadda`;
print $foo;
Run Code Online (Sandbox Code Playgroud)
不起作用.当我在命令行运行它时,curl调用在终端中正确打印其所有输出,但该变量未填充该数据.
有没有办法在不安装和调用Perl curl lib的情况下执行此操作?
system,exec,open '|-',open2,等方面都让我来指定作为将直接传递到参数列表运行命令execvp通过一个外壳,而不是运行.
即使perl它足够聪明,如果它看起来像一个"简单"的命令,它可以直接运行它,这样可以省去正确的shell转义所带来的所有令人讨厌的陷阱的麻烦.
例:
open my $out, '|-', $prog, @args;
system $prog, @args;
exec $prog, @args;
Run Code Online (Sandbox Code Playgroud)
代替
open my $out, "|$prog @args";
system "$prog @args";
exec "$prog @args";
Run Code Online (Sandbox Code Playgroud)
qx//运营商是否有这样的等价物?或者你必须总是手工完成,例如.
sub slurpcmd {
open my $h, '-|', @_ or die "open $_[0]|: $!";
local $/ unless wantarray;
<$h>
}
Run Code Online (Sandbox Code Playgroud) $SIG{CHLD} = ‘IGNORE’; # or waitpid($pid,0) in the parent process
$pid = fork();
if($pid == 0)
{
close STDOUT; # So that the parent sends the response to the client right away.
@errorMsgs = qx(tar up big directories over 50G…); # This can go on for a few minutes.
if($? ==0) { Send a ‘success’ email } # Is always false ($? == -1)
else { Send a ‘failure’ email }
}
elsif($pid){ sendResponse; waitpid($pid,0) …Run Code Online (Sandbox Code Playgroud) 我试图在Perl脚本的顶部分配一个常量,如下所示:
use constant {
# ...
CONSTNAME => qx{readlink -e __FILE__} || __FILE__,
# ...
};
Run Code Online (Sandbox Code Playgroud)
__FILE__不会在qx运算符内插入,这会导致失败.我怎样才能实现我想要的,即__FILE__ 在调用readlinkshell 之前插入.
请注意:不能将命令存储在中间变量中.
如何在这段代码中实现超时:如果"hwinfo --usb"命令在一段时间后没有返回任何内容,(停止命令并且)从子_usb_device返回或死掉.
#!/usr/bin/env perl
use warnings;
use strict;
sub _usb_device {
my @array;
{
local $/ = "";
@array = qx( hwinfo --usb );
}
...
...
}
Run Code Online (Sandbox Code Playgroud) 这里有一些Perl代码可以满足我的需求:
my $value = get_value();
my $result = qx(some-shell-command $value);
sub get_value {
...
return ...
}
Run Code Online (Sandbox Code Playgroud)
没有使用可以达到相同的效果$value吗?就像是
my $result = qx (some-shell-command . ' '. get_value());
Run Code Online (Sandbox Code Playgroud)
我知道为什么第二种方法不起作用,只是为了证明这个想法.