如何将变量添加到我的 Perl 单行中?
Posted
技术标签:
【中文标题】如何将变量添加到我的 Perl 单行中?【英文标题】:How can I add variables into my Perl one-liner? 【发布时间】:2020-09-24 03:58:03 【问题描述】:我在 Perl 中有以下单行代码:
perl -MLingua::EN::Sentence=get_sentences -ne 'print "$_\n" for grep /replace_me/i @get_sentences($_)' "$filePath"
我如何重新构建它,以便能够将“replace_me”部分替换为可以作为参数传递到脚本中的任何文本字符串(也称为变量)?
我了解您不能在单引号内添加变量,但我目前不确定如何使用双引号重新构造它。任何帮助将不胜感激。
【问题讨论】:
使用-s
选项传递变量perl
,例如perl -sE 'say $foo' -- -foo=Foo
【参考方案1】:
“单线”是可以像任何其他程序一样接受输入的程序——在调用时传递给程序的内容位于 @ARGV
数组中。
那么有两个特殊的问题需要考虑
对于-n
,''
下的代码是循环的主体(在处理的文件中的行上),因此您希望在运行时之前提取BEGIN
块中的输入,因此之前循环开始
由于在命令行中也给出了文件名,因此必须从 @ARGV
中删除传递给脚本的参数,这样剩下的就是文件名,然后可以在 -n
下根据需要使用
然后
perl -wnE'BEGIN $input = shift ; ... ' "input string" filename(s)
其中...
代表您的代码,就像以前一样,但现在可以使用$input
。
另一种方法是使用-s
switch,它为参数启用基本机制
perl -s -wnE'...code using $input...' -- -input="input string" filename(s)
在-
(我在上面使用input
)之后给出的名称是存储输入的变量的名称。 --
用于标记参数的开始。传递给脚本的所有参数都必须在文件名之前给出。
最后,您可以设置一个shell variable,然后脚本将看到它
input="input string" perl -wnE'...$ENVinput...' filenames
或者,预先设置并export
它
export input="input string"
perl -wnE'... $ENVinput ...'
有关所有三种方式的详细信息,请参阅this post。
一旦在正则表达式中使用此输入,则使用quotemeta、/...\Q$input\E.../i
转义它,除非它是一个现成的正则表达式模式。请参阅链接文档。
【讨论】:
【参考方案2】:在不使用 STDIN 或外部存储的情况下向 Perl 传递信息的主要方式有三种。
参数
perl -ne'BEGIN $text=shift(@ARGV) print if /\Q$text/i' -- "$text"
命令行选项
在完整的程序中,您可以使用Getopt::Long,但perl -s
在这里也可以。
perl -sne'print if /\Q$text/i' -- -text="$text" --
环境变量
TEXT="$text" perl -ne'print if /\Q$ENVTEXT/i' --
在您的情况下,您可以使用以下内容:
perl -ne'
use Lingua::EN::Sentence qw( get_sentences );
CORE::say for grep /\Q$text/i @ get_sentences($_) ;
' -- -text="$text" -- "$filePath"
我使用/Q$text/i
而不是/$text/i
,因为我假设输入是要查找的文本而不是正则表达式模式。 \Q..\E
将文本转换为与该文本匹配的模式。 (\E
在文字末尾是可选的。)
【讨论】:
【参考方案3】:前提是你定义了REPLACEMENT
环境变量:
export REPLACEMENT=replace_me
您应该能够做到:
perl -MLingua::EN::Sentence=get_sentences -ne 'print "$_\n" for grep /'$REPLACEMENT'/i @get_sentences($_)' "$filePath"
或:
perl -MLingua::EN::Sentence=get_sentences -ne 'print "$_\n" for grep /$ENVREPLACEMENT/i @get_sentences($_)' "$filePath"
用\Q
和\E
引用正则表达式中使用的字符串可能也是明智的,例如grep /\Q$ENVREPLACEMENT\E/i
.
【讨论】:
以上是关于如何将变量添加到我的 Perl 单行中?的主要内容,如果未能解决你的问题,请参考以下文章