将命名变量作为命令行参数传递给 perl 脚本

将命名变量作为命令行参数传递给 perl 脚本

awk-v提供了一种使用标志(例如)将命名变量传递到脚本的便捷方法awk -v var="value" ...,这种工具在编写临时脚本时非常有用。使用 Perl 可以完成同样的操作吗?或者是否需要通过 shell 通过适当的引用等进行插值argv?该选项可以提供所需的效果,但仅限于布尔值。getopts%ENV-s

答案1

感谢您meuh指出使用该-s选项来传递任意数据,而不是简单地切换开关;经过进一步调查,单行使用该-s选项的正确语法如下:

$ perl -se 'print "xyz=$xyz\n"' -- -xyz="abc"
xyz=abc

答案2

下面演示了从命令行读取类似 awk 的变量赋值以及在 shell 脚本中接受内联 perl 代码:

# cat test.sh
perl - FS=':' GRP='50' <<'EOF'
eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
print "$FS\n";
print "$GRP\n";
EOF

这是证明:

# sh test.sh
:
50

这是OP答案的另一种形式,它接受内联、多行perl代码:

# cat test.sh
perl -s -- - -xyz="abc" <<'EOF'
print "xyz=$xyz\n";
EOF

以及证明:

# sh xyz.sh
xyz=abc

这种格式看起来与 shell 脚本中编写的非常相似,并且可以轻松地用生成的代码awk替换翻译的重要awk代码,而无需将代码放在单独的文件中。a2pperl

相关内容