我尝试使用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
鉴于我无法预测输入字符串,在@
分割的正确方法是什么?
答案 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};
当然,就像我说的那样,在实际代码中,可能还有其他东西正在处理将特殊符号放入字符串中,并且您不会像这样明确地将它们写出来。但是如果你确实需要明确地写出来,那就是如何处理它。