在Perl中,'
和"
之间有什么区别?
例如,我有两个变量,如下所示:
$var1 = '\(';
$var2 = "\(";
$res1 = ($matchStr =~ m/$var1/);
$res2 = ($matchStr =~ m/$var2/);
$res2
声明抱怨Unmatched ( before HERE mark in regex m
。
答案 0 :(得分:34)
双引号使用变量扩展。单引号不
在双引号字符串中,您需要转义某些字符以阻止它们被不同地解释。在单引号字符串中你没有(除非反斜杠,如果它是字符串中的最后一个字符)
my $var1 = 'Hello';
my $var2 = "$var1";
my $var3 = '$var1';
print $var2;
print "\n";
print $var3;
print "\n";
这将输出
Hello
$var1
Perl Monks对此here
有一个很好的解释答案 1 :(得分:4)
'不会解析变量和转义
“将解析变量,并转义字符。
如果要将\ _字符存储在$ var2中的字符串中,请使用“\\(”
答案 2 :(得分:3)
双引号解释,单引号不
答案 3 :(得分:2)
Perl采用单引号字符串'原样'并插入双引号字符串。插值意味着它用变量值替换变量,并且还理解转义字符。所以,你的“\(”被解释为'(',你的正则表达式变为m /(/,这就是Perl抱怨的原因。
答案 4 :(得分:2)
如果要创建正则表达式字符串,您应该使用qr// quote-like operator:
my $matchStr = "(";
my $var1 = qr/\(/;
my $res1 = ($matchStr =~ m/$var1/);
它创建一个编译的正则表达式,比使用包含字符串的变量快得多。如果在正则表达式上下文中没有使用它也会返回一个字符串,所以你可以说像
这样的东西print "$var1\n"; #prints (?-xism:\()
答案 5 :(得分:1)
“”支持变量插值和转义。所以在"\("
\
内逃脱(
''不支持的地方。因此'\('
字面上是\(