如何在Perl中沿用户提供的字符串分隔符拆分字符串?

时间:2009-07-30 13:02:36

标签: regex perl split escaping

我的代码过去工作正常,现在它正在破碎。问题的减少如下:我想在分隔符处拆分源字符串(来自数据库,但这并不重要)。分隔符不是固定的,而是用户提供的字符串。我曾经这样做过:

@results = split($splitString, $sourceStr);

但是当用户要求加号(+)作为分隔符时,这会中断。这条消息有点神秘:

Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE

我的理解是它会中断,因为split不会指望字符串,而是正则表达式。但是,我无法找到一种方法以一种有效的方式转义$ splitString。这是我的玩具示例:

  my $s = 'string 1 + $splitChar + string 2';
  my $splitChar = "+";
  my @result = split(/\\$splitChar/, $s);

  print "num of results ".scalar(@result)."\n";
  foreach my $value (@result) {
    print "$value\n";   
  }

但它根本没有分裂。我尝试了很多变化,但没有一个变化。请注意,用户指定的分隔符可能仅限于一个字符,但多字符解决方案会更好。

(是的,我可以编写自己专门的分割功能,但这不是重点)。

(单引号字符串示例中的$splitChar是故意的,我想很明显为什么。)

2 个答案:

答案 0 :(得分:15)

split的第一个参数是一种模式:

#!/usr/bin/perl

use strict;
use warnings;

my $sep = '+';
my $source = 'one+two+three';

my @results = split /\Q$sep\E/, $source;

use Data::Dumper;
print Dumper \@results;

另见perldoc -q "quote a variable"

答案 1 :(得分:6)

问题是+被用作元字符来表示前面的一个或多个项目(所以你要求一个或多个,而不指定你想要的是什么)

Sinan的答案很好,并查看quotemeta函数。