【问题标题】:Perl qq and underscoreperl qq 和下划线
【发布时间】:2016-10-25 06:43:30
【问题描述】:

所以我有两个变量

$x = q(foo);
$y = q(bar);

我的目标是在第三个变量中使用它们,它们之间有一个下划线,即foo_bar。有很多方法可以做到这一点,但我想使用qq

所以

$z = qq($x_$y);

这会产生以下错误

Global symbol "$x_" requires explicit package name at test.pl line 45.
Execution of C:\test.pl aborted due to compilation errors.

所以我必须使用带有变量 x 的大括号来使其工作

$z = qq(${x}_$y);

为什么下划线不适用于qq?为什么在这种情况下我需要大括号?

【问题讨论】:

  • qq($x_$y)$x_ . $y 完全相同。你需要卷曲,因为那不是你想要的。
  • 回复:Why does underscore not work with qq? 不仅仅是qq()"$x_$y"; 也会遇到同样的问题,原因在答案中进行了解释。

标签: string perl quotes


【解决方案1】:

这是因为_ 在标识符(例如变量名)中算作字母。

当您编写"$x_$y" 时,Perl 认为您正在尝试插入两个变量,$x_$y。同样,当您编写 "$foo$bar" 时,Perl 认为您正在尝试插入 $foo$bar(不是 $f . 'oo' . $bar$fo . 'o' . $bar 或任何其他组合)。

一般规则是:名称尽可能向右延伸(也就是说,Perl 为标识符选择尽可能长的解释)。

【讨论】:

    【解决方案2】:

    下划线_ 是在变量名称中使用的合法字符,因此当您说"$x_$y" 时,您指的是(评估)一个变量$x_,它显然尚未定义。

    例如,请参阅this post 中已接受的答案以及更多此类问题。

    【讨论】:

    • 说真的,你是我们这里最好的,当你的“分数”与你的能力相匹配时,我会很高兴
    • @Borodin 哦,呃,您说得太客气了,谢谢。 (现在那个很尴尬。)现在我需要非常非常努力地工作!所以也许几年后它有点真实:)。感谢您一路上的帮助。我现在收拾一下,这都是个人的,所以OT
    【解决方案3】:

    因为下划线可能是标识符的一部分。否则,解析器应该如何区分 $x 和 $x_ ?

    所以大括号表示只有 x 是标识符,而不是 x_

    【讨论】:

      【解决方案4】:

      如果你想按照自己的方式,那么你应该转义下划线字符。

      use strict;
      use warnings;
      
      my $x =qq(foo);
      my $y=qq(bar);
      my $z = qq($x\_$y);
      
      print $z;
      

      当然我想说这不是更好的方法。花括号方式是最好的方法。

      【讨论】:

        【解决方案5】:

        根据 perl 变量命名规则,'下划线'可以是变量名的一部分。参考:http://sivasakthikumar.blogspot.in/2009/03/variable-names-can-start-with-letter_16.html

        这就是为什么它不能正确理解你的变量名。所以你需要括号。

        【讨论】:

          猜你喜欢
          • 2015-05-20
          • 1970-01-01
          • 2012-04-20
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 2013-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多