1

如何将文件传递给 perl 脚本进行处理,并为多行 perl 脚本使用 heredoc 语法?我已经尝试过这些但没有运气:

cat ng.input | perl -nae <<EOF
if (@F==2) {print $F[0] . "\t". $F[1] . "\n"} else { print "\t" . $F[0] . "\n" }
EOF

cat ng.input | perl -nae - <<EOF
if (@F==2) {print $F[0] . "\t". $F[1] . "\n"} else { print "\t" . $F[0] . "\n" }
EOF
4

3 回答 3

3

真的不需要here-docs。您可以简单地使用多行参数:

perl -nae'
    if (@F==2) {
       print $F[0] . "\t". $F[1] . "\n"
    } else {
       print "\t" . $F[0] . "\n"
    }
' ng.input

干净,比 Barmar 的更便携,并且只使用一个过程而不是 Barmar 的三个。


请注意,您的代码可能会缩小到

perl -lane'unshift @F, "" if @F!=2; print "$F[0]\t$F[1]";' ng.input

甚至

perl -pale'unshift @F, "" if @F!=2; $_="$F[0]\t$F[1]";' ng.input
于 2013-04-23T01:21:59.437 回答
1

使用进程替换:

cat ng.input | perl -na <(cat <<'EOF'
if (@F==2) {print $F[0] . "\t". $F[1] . "\n"} else { print "\t" . $F[0] . "\n" }
EOF
)

还要在标签周围加上单引号,EOF这样$F在 perl 脚本中就不会被扩展为 shell 变量。

于 2013-04-23T00:12:38.123 回答
0

也可以将heredoc 作为“-”第一个参数传递给perl:

perl -lna - ng.input <<'EOF'
if (@F==2) {print $F[0] . "\t". $F[1] . "\n"} else { print "\t" . $F[0] . "\n" }
EOF
于 2021-11-02T08:52:29.883 回答