Perl:在分裂中转义元字符

时间:2016-02-10 21:21:16

标签: perl

我尝试使用split()tiefighter.com中提取值leia@tiefighter.com。我发现如果输入字符串中的@字符被转义,我得到预期的输出:

$ perl -e '$string = "leia\@tiefighter.com"; @parts = split(/\@/, $string); print "Domain: $parts[-1]\n";'
Domain: tiefighter.com

但是,如果我没有逃避@字符,我就明白了:

$ perl -e '$string = "leia@tiefighter.com"; @parts = split(/\@/, $string); print "Domain: $parts[-1]\n";' 
Domain: leia.com

鉴于我无法预测输入字符串,在@分割的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

这是在代码中指定字符串的工件。 perl中的@ sigil表示一个数组,在双引号字符串中,这会被扩展(或尝试扩展,即使@tiefighter不存在)。

您可以使用反斜杠修复,如您已经找到的那样,或者通过不同的方式引用它,因此它是单引号字符串(因此,不进行插值)。

perl -e '$string = q{leia@tiefighter.com}; @parts = split(/\@/, $string); print "Domain: $parts[-1]\n";'

在实际代码中,你可能不会静态地写出这些字符串,这可能不会成为问题。

详细说明Perl的插值:单引号值不进行插值,双引号值为。

$a = 'abc';
@b = ('abc', 'def');

$foo = 'bar$a';           # 'bar$a'
$foo = "bar$a";           # 'barabc'

$foo = 'bar@b';           # 'bar@b'
$foo = "bar@b";           # 'barabc def'

您可以使用正确的引用解决这些问题。要么使用单引号字符串,要么可以转义双引号字符串中的符号。

$foo = "bar\$a";
$foo = "bar\@b";

q{}也等同于单引号。

$foo = q{bar$a bar@b};

当然,就像我说的那样,在实际代码中,可能还有其他东西正在处理将特殊符号放入字符串中,并且您不会像这样明确地将它们写出来。但是如果你确实需要明确地写出来,那就是如何处理它。