【问题标题】:Perl split a string on a repeating pattern in the most efficient manner?Perl 以最有效的方式在重复模式上拆分字符串?
【发布时间】:2012-01-25 21:25:35
【问题描述】:

我想拆分一个有一定重复模式的字符串,例如:

$string = "GGGGG-SOMETHING-ELSE-GGG-LAST";

@array=(-SOMETHING-ELSE-,-LAST);

我作为 perl 新手的尝试

split(/G{2,}/,$string);

不幸的是,这只会导致 GG 模式被拆分,而不是我希望的贪婪 GGGGG 或 GGG 模式会导致 2 个数组元素。

【问题讨论】:

    标签: perl split design-patterns repeat


    【解决方案1】:

    不,这似乎(大部分)按预期工作。以下代码:

    use strict;
    use warnings;
    
    $_="GGGGG-SOMETHING-ELSE-GGG-LAST";
    my @a=split(/G{2,}/,$_);
    print join(",",@a) . "\n";
    

    产生输出:

    ,-SOMETHING-ELSE-,-LAST
    

    问题是第一个元素是空字符串。因此,要解决此问题,您可以执行以下操作:

    use strict;
    use warnings;
    
    $_="GGGGG-SOMETHING-ELSE-GGG-LAST";
    my @a=grep{$_ ne ""}(split(/G{2,}/,$_));
    print join(",",@a) . "\n";
    

    这会产生你想要的:

    -SOMETHING-ELSE-,-LAST
    

    【讨论】:

    • 我将计算机切换到 Ubuntu 11 机器,您的单行程序和我的技术都运行良好。我认为这是我的 Perl 版本的产物。
    • 只需 grep $_, split /G{2,}/ 工作正常。无需对每个元素进行比较,因为 null 字符串为 false。
    【解决方案2】:

    我刚刚在我的机器上检查了你的代码,它工作正常:

    $string = "GGGGG-SOMETHING-ELSE-GGG-LAST";
    print join(':', split(/G{2,}/,$string));
    

    返回:

    :-SOMETHING-ELSE-:-LAST
    

    我使用的perl版本是:v5.10.1

    您能否添加更多有关您如何运行它的信息?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2018-10-23
      • 1970-01-01
      • 2018-01-01
      • 2015-11-20
      • 2020-09-25
      • 2014-06-02
      相关资源
      最近更新 更多