代码之家  ›  专栏  ›  技术社区  ›  Jax

如何在Perl中将一个字符串分成两个字符的块?

  •  32
  • Jax  · 技术社区  · 16 年前

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

    我尝试过:

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

    但没有得到预期的结果。

    最终我想变成这样

    F53CBBA476
    

    到包含

    F5 3C BB A4 76
    
    4 回复  |  直到 12 年前
        1
  •  53
  •   Bill Karwin    16 年前
    @array = ( $string =~ m/../g );
    

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

        2
  •  37
  •   Matt Simerson    12 年前

    如果你真的必须使用 split ,可以执行以下操作:

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

    但我想最快的方法是 unpack :

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

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

        3
  •  6
  •   ChrisD    16 年前

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

    @array = ( $string =~ m/..?/g );
    
        4
  •  5
  •   ikegami Gilles Quénot    14 年前

    模式传递给 split 识别什么 分离 你想要的。如果你想使用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;