【问题标题】:How can I split a string into chunks of two characters each in Perl?如何在 Perl 中将字符串拆分为两个字符的块?
【发布时间】:2010-09-27 04:58:15
【问题描述】:

如何在 Perl 中获取一个字符串并将其拆分为一个数组,其中每个条目有两个字符长?

我试过这个:

@array = split(/../, $string);

但没有得到预期的结果。

最终我想变成这样的东西

F53CBBA476

放入包含

的数组中
F5 3C BB A4 76

【问题讨论】:

    标签: regex arrays perl split


    【解决方案1】:
    @array = ( $string =~ m/../g );
    

    模式匹配运算符在 Perl 的列表上下文中以一种特殊的方式运行。它迭代地处理操作,将模式与上一次匹配后的文本剩余部分进行匹配。然后列表由在每次应用模式匹配期间匹配的所有文本组成。

    【讨论】:

      【解决方案2】:

      如果你真的必须使用split,你可以这样做:

      grep {length > 0} split(/(..)/, $string);
      

      但我认为最快的方法是使用unpack

      unpack("(A2)*", $string);
      

      这两种方法都有一个“优点”,如果字符串有奇数个字符,它会自己输出最后一个。

      【讨论】:

      • 因为看起来他正在使用十六进制字符,所以这有点争议,但 A 仅适用于 ASCII 字符。拆分应该适用于任何编码,但您可能希望在正则表达式中添加 /s,以便 "\n" 将与 "." 匹配。
      • 应该是a2,而不是A2。前者去除尾随空格,这充其量是多余的。
      【解决方案3】:

      实际上,要捕获奇数字符,您需要将第二个字符设为可选:

      @array = ( $string =~ m/..?/g );
      

      【讨论】:

      • 是的,但是比解压要慢。
      【解决方案4】:

      传递给split 的模式标识分隔您想要的内容。如果你想使用拆分,你会使用类似的东西

      my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string;
      

      my @pairs = split /(?=(?:.{2})+\z)/s, $string;
      

      这些是相当糟糕的解决方案。更好的解决方案包括:

      my @pairs = $string =~ /..?/sg;  # Accepts odd-length strings.
      
      my @pairs = $string =~ /../sg;
      
      my @pairs = unpack '(a2)*', $string;
      

      【讨论】:

      • 嗨@ikegami,有没有办法我可以把这个字符串分成4个部分,这样第一个2部分每个有2个字符,最后2个部分每个有3个字符..即F5 3C BBA 476
      猜你喜欢
      • 2014-08-06
      • 2012-09-05
      • 1970-01-01
      • 2011-11-02
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2016-04-06
      相关资源
      最近更新 更多