【问题标题】:How can I add variables into my Perl one-liner?如何将变量添加到我的 Perl 单行中?
【发布时间】: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

标签: perl variables scripting


【解决方案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'...$ENV{input}...' filenames

或者,预先设置并export

export input="input string"
perl -wnE'... $ENV{input} ...'

有关所有三种方式的详细信息,请参阅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$ENV{TEXT}/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 { /$ENV{REPLACEMENT}/i } @{get_sentences($_)}' "${filePath}"
      

      \Q\E 引用正则表达式中使用的字符串可能也是明智的,例如grep { /\Q$ENV{REPLACEMENT}\E/i }.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-29
        • 2016-10-11
        • 2020-11-22
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多