如何将变量添加到我的 Perl 单行程序中?

Har*_*mer 1 variables scripting perl

我有以下 Perl 单行:

perl -MLingua::EN::Sentence=get_sentences -ne 'print "$_\n" for grep { /replace_me/i } @{get_sentences($_)}' "${filePath}"
Run Code Online (Sandbox Code Playgroud)

我如何重构它,以便我能够用可以作为参数传递到脚本中的任何文本字符串(也称为变量)替换“replace_me”部分?

我知道您不能在单引号内添加变量,但我目前不确定如何使用双引号重新构造它。任何帮助,将不胜感激。

zdi*_*dim 7

“one-liner”是一个程序,它可以像任何其他输入一样接受输入——在​​调用时传递给程序的内容是@ARGV数组。

然后有两个特殊问题需要考虑

  • 下面-n的代码''是循环的主体(在处理的文件中的行上),因此您希望BEGIN在运行时之前以及循环开始之前在块中提取输入

  • 由于命令行上也给出了文件名@ARGV,因此必须从 中删除传递给脚本的参数,这样剩下的就是文件名,然后可以根据需要使用-n

然后

perl -wnE'BEGIN { $input = shift };  ... '  "input string" filename(s)
Run Code Online (Sandbox Code Playgroud)

where...代表您的代码,就像以前一样,但现在可以使用$input.

另一种方法是使用-sswitch启用参数的基本机制

perl -s -wnE'...code using $input...' -- -input="input string"  filename(s)
Run Code Online (Sandbox Code Playgroud)

后面给出的名称-(我在input上面使用过)是存储输入的变量的名称。在--那里标记论点的开始。传递给脚本的所有参数都必须在文件名之前给出。

最后,您可以设置一个shell 变量,然后脚本将看到该变量

input="input string"  perl -wnE'...$ENV{input}...' filenames
Run Code Online (Sandbox Code Playgroud)

或者,事先设置好export

export input="input string"
perl -wnE'... $ENV{input} ...'
Run Code Online (Sandbox Code Playgroud)

有关所有三种方式的详细信息,请参阅此帖子

一旦在正则表达式中使用此输入,请使用quotemeta , 将/...\Q$input\E.../i其转义,除非它是现成的正则表达式模式。请参阅链接的文档。