作者:数字货币交易所贺顾问 | 来源:互联网 | 2023-05-28 14:30
以下是我正在尝试的代码:
echo "a b c" | perl -e 'print $ARGV[0]; print $ARGV[1]; print $_;' "abc" "def"
此代码的输出是:
abcdef
我无法弄清楚为什么"打印$ _;" 不像往常一样打印"ab c".有任何想法吗?
1> TLP..:
您没有使用-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 () { print } ' foo bar
另一个选择是@ARGV
预先清除数组,如下所示:
echo "a b c"|perl -ne'BEGIN { @x = @ARGV; @ARGV = () }; print @x; print;' foo bar
但是,@x
每次输入的输入也会打印一次,这可能是不可取的.