gpt4 book ai didi

bash - Bash 中的 Perl : How to read from pipe and pass arguments to perl at the same time?

转载 作者:行者123 更新时间:2023-11-29 09:08:30 24 4
gpt4 key购买 nike

以下是我正在尝试的代码:

echo "a b c" | perl -e 'print $ARGV[0]; print $ARGV[1]; print $_;' "abc" "def"

这段代码的输出是:

abcdef

我不明白为什么要“print $_;”没有像往常一样打印“a b c”。有什么想法吗?

最佳答案

您没有使用 -n-p , 所以你没有使用 <>用于标准输入。如果您有争论,无论如何您都不会这样做。

说明:

当您使用 -n 时或 -p , 它放了一个 while(<>)像这样循环你的代码:

perl -ne ' print ' 

等于

perl -e ' while (<>) { print }'

如果你使用 -p它是:

perl -e ' while (<>) { print } continue { print $_ }'

在这个阶段,Perl 将决定如何 <>将通过检查 @ARGV 来工作,其中存储脚本的参数。如果其中有任何内容,它会将参数视为文件名,并尝试打开并读取这些文件。文件句柄将被称为 ARGV .此时,<>不能用于从标准输入读取。

解决方案

换句话说,使用参数将覆盖来自 STDIN 的读数.所以如果你想从标准输入读取,你可以使用那个文件句柄:

echo "a b c" | perl -e ' print @ARGV[0,1]; while (<STDIN>) { print } ' foo bar

另一种选择是清除 @ARGV预先排列,像这样:

echo "a b c"|perl -ne'BEGIN { @x = @ARGV; @ARGV = () }; print @x; print;' foo bar

但这也会打印 @x每行输入一次,这可能是不可取的。

关于bash - Bash 中的 Perl : How to read from pipe and pass arguments to perl at the same time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766811/

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