加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash中的Perl:如何从管道中读取并同时将参数传递给perl?

发布时间:2020-12-15 22:14:53 所属栏目:安全 来源:网络整理
导读:以下是我正在尝试的代码: echo "a b c" | perl -e 'print $ARGV[0]; print $ARGV[1]; print $_;' "abc" "def" 此代码的输出是: abcdef 我无法弄清楚为什么“打印$_;”不像往常一样打
以下是我正在尝试的代码:

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

此代码的输出是:

abcdef

我无法弄清楚为什么“打印$_;”不像往常一样打印“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一次,这可能并不理想.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读