【发布时间】: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 中,' 和 " 有什么区别?
例如,我有 2 个变量,如下所示:
$var1 = '\(';
$var2 = "\(";
$res1 = ($matchStr =~ m/$var1/);
$res2 = ($matchStr =~ m/$var2/);
$res2 声明抱怨 Unmatched ( before HERE mark in regex m。
【问题讨论】:
双引号使用变量扩展。单引号不
在双引号字符串中,您需要转义某些字符以阻止它们被不同地解释。在单引号字符串中,您不需要(反斜杠除外,如果它是字符串中的最后一个字符)
my $var1 = 'Hello';
my $var2 = "$var1";
my $var3 = '$var1';
print $var2;
print "\n";
print $var3;
print "\n";
这将输出
Hello
$var1
Perl Monks 对此here 有一个很好的解释
【讨论】:
' 不会解析变量和转义
" 将解析变量和转义字符。
如果您想将 \ 字符存储在 $var2 中的字符串中,请使用 "\\("
【讨论】:
双引号解释,单引号不解释
【讨论】:
如果你要创建正则表达式字符串,你真的应该使用qr// quote-like operator:
my $matchStr = "(";
my $var1 = qr/\(/;
my $res1 = ($matchStr =~ m/$var1/);
它创建了一个编译的正则表达式,比仅使用包含字符串的变量要快得多。如果没有在正则表达式上下文中使用,它也会返回一个字符串,所以你可以这样说
print "$var1\n"; #prints (?-xism:\()
【讨论】:
Perl 按原样接受单引号字符串并插入双引号字符串。插值意味着它用变量值替换变量,并且还理解转义字符。所以,你的 "\(" 被解释为 '(',你的正则表达式变成 m/(/,这就是 Perl 抱怨的原因。
【讨论】:
"" 支持变量插值和转义。所以在"\("\ 内部转义(
其中 ' ' 也不支持。所以'\(' 字面意思是\(
【讨论】: