【问题标题】:What's the difference between single and double quotes in Perl?Perl 中的单引号和双引号有什么区别?
【发布时间】:2010-10-30 22:29:22
【问题描述】:

在 Perl 中,'" 有什么区别?

例如,我有 2 个变量,如下所示:

$var1 = '\(';
$var2 = "\(";

$res1 = ($matchStr =~ m/$var1/);
$res2 = ($matchStr =~ m/$var2/);

$res2 声明抱怨 Unmatched ( before HERE mark in regex m

【问题讨论】:

    标签: perl string


    【解决方案1】:

    双引号使用变量扩展。单引号不

    在双引号字符串中,您需要转义某些字符以阻止它们被不同地解释。在单引号字符串中,您不需要(反斜杠除外,如果它是字符串中的最后一个字符)

    my $var1 = 'Hello';
    
    my $var2 = "$var1";
    my $var3 = '$var1';
    
    print $var2;
    print "\n";
    print $var3;
    print "\n";
    

    这将输出

    Hello
    $var1
    

    Perl Monks 对此here 有一个很好的解释

    【讨论】:

    • 你的意思是说单引号'\('由1个字符组成,双引号"\("由2个字符组成?
    • 不,恰恰相反。 '\(' 是 2 个字符,而 "\(" 是一个字符。
    • 分隔符也必须加反斜杠,反斜杠在其他各种情况下除了作为字符串的最后一个字符(例如两个字符串\'是'\\\'',而不是'\\ '')。
    • er...打印示例及其输出是向后的。 print $var2 将打印 Hello,print $var3 将打印 $var1。
    • 为什么所有关于 perl 的东西都让人困惑?
    【解决方案2】:

    ' 不会解析变量和转义

    " 将解析变量和转义字符。

    如果您想将 \ 字符存储在 $var2 中的字符串中,请使用 "\\("

    【讨论】:

      【解决方案3】:

      双引号解释,单引号不解释

      【讨论】:

      • 思路是对的,但是不能用42isanumber作为变量名。
      【解决方案4】:

      如果你要创建正则表达式字符串,你真的应该使用qr// quote-like operator

      my $matchStr = "(";
      my $var1 = qr/\(/;
      my $res1 = ($matchStr =~ m/$var1/);
      

      它创建了一个编译的正则表达式,比仅使用包含字符串的变量要快得多。如果没有在正则表达式上下文中使用,它也会返回一个字符串,所以你可以这样说

      print "$var1\n"; #prints (?-xism:\()
      

      【讨论】:

      【解决方案5】:

      Perl 按原样接受单引号字符串并插入双引号字符串。插值意味着它用变量值替换变量,并且还理解转义字符。所以,你的 "\(" 被解释为 '(',你的正则表达式变成 m/(/,这就是 Perl 抱怨的原因。

      【讨论】:

      • 在单引号字符串中,它识别两个转义字符:结束分隔符和 \.
      【解决方案6】:

      "" 支持变量插值和转义。所以在"\("\ 内部转义(

      其中 ' ' 也不支持。所以'\(' 字面意思是\(

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 2010-12-31
        • 1970-01-01
        • 2014-05-13
        • 1970-01-01
        • 2016-06-10
        • 1970-01-01
        相关资源
        最近更新 更多