|\"$\'`\s\\"; qx{echo $_ | foo} 这里有两个问题。先是$_的-6ren">
gpt4 book ai didi

perl - 如何在 Perl 的 qx{} 语句中将变量的内容作为 STDIN 传送?

转载 作者:行者123 更新时间:2023-12-01 08:51:40 27 4
gpt4 key购买 nike

我基本上想这样做:

$_ = "some content that need to be escaped &>|\"$\'`\s\\";
qx{echo $_ | foo}

这里有两个问题。先是 $_的内容需要转义,因为它可以包含二进制数据。二、调用 echo可能有点低效。

如何简单地将一些内容作为 STDIN 传送到 Perl 中的命令?

最佳答案

以下假设@cmd包含程序及其参数(如果有)。

my @cmd = ('foo');

如果要捕获输出,可以使用以下任一方法:
use String::ShellQuote qw( shell_quote );
my $cmd1 = shell_quote('printf', '%s', $_);
my $cmd2 = shell_quote(@cmd);
my $output = qx{$cmd1 | $cmd2};


use IPC::Run3 qw( run3 );
run3(\@cmd, \$_, \my $output);


use IPC::Run qw( run );
run(\@cmd, \$_, \my $output);

如果您不想捕获输出,可以使用以下任何一种:
use String::ShellQuote qw( shell_quote );
my $cmd1 = shell_quote('printf', '%s', $_);
my $cmd2 = shell_quote(@cmd);
system("$cmd1 | $cmd2");


system('/bin/sh', '-c', 'printf "%s" "$0" | "$@"', $_, @cmd);


use String::ShellQuote qw( shell_quote );
my $cmd = shell_quote(@cmd);
open(my $pipe, '|-', $cmd);
print($pipe $_);
close($pipe);


open(my $pipe, '|-', '/bin/sh', '-c', '"$@"', 'dummy', @cmd);
print($pipe $_);
close($pipe);


use IPC::Run3 qw( run3 );
run3(\@cmd, \$_);


use IPC::Run qw( run );
run(\@cmd, \$_);

如果您不想捕获输出,但也不想看到它,则可以使用以下任一方法:
use String::ShellQuote qw( shell_quote );
my $cmd1 = shell_quote('printf', '%s', $_);
my $cmd2 = shell_quote(@cmd);
system("$cmd1 | $cmd2 >/dev/null");


system('/bin/sh', '-c', 'printf "%s" "$0" | "$@" >/dev/null', $_, @cmd);


use String::ShellQuote qw( shell_quote );
my $cmd = shell_quote(@cmd);
open(my $pipe, '|-', "$cmd >/dev/null");
print($pipe $_);
close($pipe);


open(my $pipe, '|-', '/bin/sh', '-c', '"$@" >/dev/null', 'dummy', @cmd);
print($pipe $_);
close($pipe);


use IPC::Run3 qw( run3 );
run3(\@cmd, \$_, \undef);


use IPC::Run qw( run );
run(\@cmd, \$_, \undef);

笔记:
  • 使用 printf 的解决方案将对传递给程序的 STDIN 的数据大小施加限制。
  • 使用 printf 的解决方案无法将 NUL 传递给程序的 STDIN。
  • 所提出的使用 IPC::Run3 和 IPC::Run 的解决方案不涉及 shell 。这避免了问题。
  • 您可能应该使用 systemcapture来自 IPC::System::Simple 而不是内置的 systemqx获得“免费”错误检查。
  • 关于perl - 如何在 Perl 的 qx{} 语句中将变量的内容作为 STDIN 传送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172951/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com