Perl中单引号和双引号有什么区别?

25
在Perl中,'"之间有什么区别?
例如,我有以下两个变量:
$var1 = '\(';
$var2 = "\(";

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

$res2 语句报错:正则表达式中的 HERE 标记前未匹配左括号。

6个回答

41

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

在双引号字符串中,您需要转义某些字符以防止它们被解释为不同的含义。在单引号字符串中,除了最后一个字符是反斜杠时,您不需要这样做。

my $var1 = 'Hello';

my $var2 = "$var1";
my $var3 = '$var1';

print $var2;
print "\n";
print $var3;
print "\n";

这将输出

Hello
$var1

Perl Monks在这里有一个相当不错的解释


7
不是这样。'\(' 是 2 个字符,而 "\(" 则是 1 个字符。 - Igor Krivokon
1
分隔符字符也必须加上反斜杠,而且在字符串的最后一个字符以外的其他情况下也要使用反斜杠(例如,两个字符的字符串 ' 应该是 '\'', 而不是 '\')。 - ysth
此外,我提到“插值引号”,因为在Perl中,'和"不是唯一引用字符串的方式。q//和qq//分别等同于'和",而还有许多其他方式:http://perldoc.perl.org/perlop.html#Quote-Like-Operators - rpj
1
为什么关于Perl的一切都让人感到混乱? - dthree
1
关于“为什么Perl的一切都让人困惑?”的问题,单引号允许使用简单字面量,双引号允许使用复杂字面量。这是有用的,而且并不真的令人困惑。这也不是什么不寻常的事情:JavaScript、Python、C#和Bourne shell也有多种字符串字面量。在C、C++和C#中,单引号和双引号字面量创建具有不同类型的值。 - ikegami
显示剩余4条评论

5

'将不解析变量和转义字符

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

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


4
双引号会被解释,而单引号不会。

这个想法是正确的,但你不能使用42isanumber作为变量名。 - Igor Krivokon

2

Perl会直接将单引号字符串原样输出,而对双引号字符串进行插值处理。插值意味着它会用变量的值替换变量,并理解转义字符。所以,你的"\("被解释为'(',你的正则表达式变成了m/(/,这就是为什么Perl会报错。


在单引号字符串中,它识别两个转义字符:结束定界符字符和 \。 - ysth

2

如果你要创建正则表达式字符串,你应该使用qr//引用操作符

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

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

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

OP 可能希望阅读有关引号操作符的 perlop 部分:http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators - daotoad
1
@daotoad 你是指答案中的链接吗? - Chas. Owens

1

支持变量内插和转义。因此,在"\("中,\可以进行转义操作。

而单引号' '不支持这两种操作。因此,'\('只是字面上的字符串“\ (”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接