如何将变量添加到我的 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 单行中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 python 命令行工具添加到我的 PATH?

将多个正则表达式匹配之一分配给变量作为 Perl 单行(取消引用数组?)

如何将实例变量或属性添加到 XCTestCase?

如何将 .NET 框架添加到我的项目中?

如何将背景音乐添加到我的程序中?

如何将外部 dll 添加到我的 VS2019 项目中? [复制]