拆分不起作用(Perl)

时间:2013-12-19 09:27:51

标签: regex perl split

我一直在尝试执行以下代码;然而@ans最终得到了$ answer的全部内容。

$answer = "6.9 4012 top 5.6 2868 top 5.0 3686 top 4.7 5128 top 4.5 3120 top";
@ans = split('/ /',$answer);
foreach (@ans) {
    print "$_\n";
}

在这种情况下,我想基于空格分割。请问您能告诉我这段代码有什么问题吗?

4 个答案:

答案 0 :(得分:6)

您错误地使用拆分。这将有效:

@ans = split(' ', $answer);

以及:

@ans = split(/ /, $answer);

请注意,split的第一个参数不是字符串,而是正则表达式。以下拆分表达式的所有变体都给出了相同的结果:

' '/ /" "m/ /m' 'qr/ /qr' 'qr{ }

正则表达式/str/的用法与表达式中匹配正则表达式的用法有些相似:

my ($x) = ($str =~ /(w+)/);

my ($x) = ($str =~ m/(w+)/);

更新:感谢@mpapec,来自' '的{​​{1}}与/ /有一个问题:

  

作为一种特殊情况,指定空格('')的PATTERN将在空白处分割,就像没有参数的“拆分”一样。因此,“split('')”可用于模拟awk的默认行为,而“split(/ /)”将为您提供与前导空格一样多的初始空字段(空字符串)。

换句话说,perldoc -f split会返回split(' ', " x y "),但('x', 'y')会返回split(/ /, " x y ")

答案 1 :(得分:0)

您还可以使用以下行来处理多个空格

@ans = split(/ +/,$answer);

希望这可以帮到你

由于

答案 2 :(得分:0)

mvp的回答是正确的。但我认为您可能无法理解封闭的//含义。这意味着匹配封闭的//中的字符串。因此,您不需要在程序中引用封闭内容,例如'/ /'。文件在这里。 split document

答案 3 :(得分:0)

参考下面提到的代码,你必须只使用一个反斜杠来转义空白字符。如果你在旁边引号中指定了这个,则没有必要用空格用两个反斜杠括起来

my $answer = "6.9 4012 top 5.6 2868 top 5.0 3686 top 4.7 5128 top 4.5 3120 top";
my @ans = split(" ",$answer);
# my @ans = split("\ ",$answer);
# my @ans = split(' ',$answer);
# my @ans = split('\ ',$answer);
# my @ans = split(/ /,$answer);
foreach (@ans) {
    print "$_\n";
}