【问题标题】:Cutting apart string in Perl在 Perl 中分割字符串
【发布时间】:2011-02-22 20:17:56
【问题描述】:

我在 Perl 中有一个 23 位长的字符串。我需要把它分成不同的部分。一个变量中的前 2 个数字,另一个变量中的下 3 个数字,另一个变量中的下 4 个数字,等等。基本上,这 23 个数字需要以 6 个单独的变量(2、3、4、4、3、7)字符结束,因为命令。

有什么办法可以像这样剪断绳子吗?

【问题讨论】:

标签: perl


【解决方案1】:

有很多方法可以做到,但最短的可能是unpack

my $string = '1' x 23;
my @values = unpack 'A2A3A4A4A3A7', $string;

如果需要单独的变量,可以使用列表赋值:

my ($v1, $v2, $v3, $v4, $v5, $v6) = unpack 'A2A3A4A4A3A7', $string;

【讨论】:

    【解决方案2】:

    扩展亚历克斯的方法,而不是指定每个开始和结束,使用您提供的长度列表。

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    my $string = "abcdefghijklmnopqrstuvw";
    my $pos = 0;
    my @split = map { 
      my $start = $pos; 
      my $end = $_;
      $pos += $end;
      substr( $string, $start, $end);
    } (2,3,4,4,3,7);
    
    print "$_\n" for @split;
    

    这表示您可能应该查看用于固定宽度字段的unpack。不过我没有这方面的经验。

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式,即:

      $string =~ /\d{2}\d{3}\d{4}\d{4}\d{3}\d{7}/
      

      并用括号 () 括起来捕获每个部分。

      然后您可以在变量 $1、$2 ... 中找到每个捕获 或将它们全部放入返回的列表中

      perldoc perlre

      【讨论】:

        【解决方案4】:

        你想使用perldoc substr

        $substring = substr($string, $start, $length);
        

        我还会在 [start, length] 对的列表中使用 `map' 来让您的生活更轻松:

        $string = "123456789";
        @values = map {substr($string, $_->[0], $_->[1])} ([1, 3], [4, 2] , ...);
        

        【讨论】:

          【解决方案5】:

          这里有一个 sub 可以使用已经讨论过的unpack

          sub string_slices { 
              my $str = shift;
              return unpack( join( 'A', '', @_ ), $str );
          }
          

          【讨论】:

            猜你喜欢
            • 2017-10-26
            • 2012-10-06
            • 2014-09-10
            • 1970-01-01
            • 2012-02-28
            • 2014-12-11
            • 2020-12-13
            • 2017-12-19
            • 2020-03-07
            相关资源
            最近更新 更多