【问题标题】:How can I split a string along a user-provided string separator in Perl?如何在 Perl 中沿用户提供的字符串分隔符拆分字符串?
【发布时间】:2009-07-30 13:02:36
【问题描述】:

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

@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 是故意的,我想原因很清楚)。

【问题讨论】:

    标签: regex perl split escaping


    【解决方案1】:

    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"

    【讨论】:

    • 太好了,我不知道 \Q 和 \E。这就是我需要的。非常感谢
    【解决方案2】:

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

    思南的回答不错,也可以看看quotemeta函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多