【问题标题】:concatenating variables inside linux commands in perl在perl中连接linux命令中的变量
【发布时间】:2019-06-17 19:17:30
【问题描述】:

我需要使用一个系统命令 (grep),它有一个与字符串连接的变量作为正则表达式来搜索文件。 是否可以在 Perl 中的变量和字符串之间连接 grep 的正则表达式??

我尝试过使用. 运算符,但它不起作用。

if(`grep -e "$fubname._early_exit_indicator = 1" $golden_path/early_exit_information.tsv`){
    print "-D- The golden data indicates early exit should occur\n";
    $golden_early_exit_indicator=1;
}

应与正则表达式 "$fubname._early_exit_indicator = 1" 匹配,但未按要求匹配。 预期的结果应该是: -D- The golden data indicates early exit should occur 但在目前的代码中,它不会打印这个。

输出链接:(https://drive.google.com/open?id=1N0SaZ-r3bYPlljKUgTOH5AbxCAaHw7zD)

【问题讨论】:

  • 这里,$fubname 是我的变量,我正在尝试将 _early_exit_indicator 字符串连接到它。
  • 使用${fubname}_early_exit_indicator
  • Read the fine manual: "在某些 shell 中,您可以将变量名括在大括号中,以消除其与后面的字母数字(和下划线)的歧义。"

标签: linux perl unix


【解决方案1】:

问题是. 运算符未被识别为引号内的运算符。点运算符使用 between 字符串,而不是 inside 字符串。在字符串中使用点,按字面意思插入。模式中的这个文字点会导致代码中的 grep 命令失败。

还要注意,在引号内,Perl 尝试使用某些标识符解析规则来插入变量。 请参阅 perldoc perlop 了解 Perl 中使用的不同类型的引用,并参阅 perldoc perldata 了解有关标识符解析规则的信息。

总之,为了在反引号参数中插入变量$fubname,请使用

"${fubname}_early_exit_indicator = 1"

请注意,我们需要在标识符周围加上大括号,因为下面的下划线是有效的标识符字符。 (相反,文字点不是有效的标识符字符,因此如果后面的字符是文字​​点,则不需要在标识符周围加上大括号。)

【讨论】:

  • 另一种方法是转义字符串以将其与变量名分开:"$fubname\_early_exit_indicator = 1"
【解决方案2】:

.运算符在引号内不起作用。使用类似的东西-

if(`grep -e "${fubname}_early_exit_indicator = 1" ...

我希望这行得通

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多