使用重复运算符将perl字符串转换为数组

时间:2012-10-18 22:31:50

标签: perl search replace repeat

我有一个字符串,说:“5 3 * 3 4 * 1 6 * 3 14 * 4 3 * 2 2 * 3 4”

我希望这个字符串成为一个包含元素的数组:

@array =(“5”,“3”x 3,“1”x 4,“3”x 6,“4”x 14,“2”x 3,“3”x 2,“4” );

我猜测有比这更好(更短)的方式:

$string = "5 3*3 4*1 6*3 14*4 3*2 2*3 4";
@array = split (/\s+/,$string);
foreach(@array) {
   if ( /\*/ ) {
      s/^(\d+)\*(\d+)/"$2" x $1/g;
   } else {
      print "$_\n";
      $_ = '"'. $_ .'"';
   }
}

编辑:这段代码实际上完成了我在原始问题中应该做的事情。但实际上并不是我想要的。我希望最终的数组看起来像:

@array =(5,3,3,3,...)

3 个答案:

答案 0 :(得分:1)

算法:

  1. 取出字符串并将其拆分为空格
  2. 如果/(\ d +)*(\ d +)/ regex与元素匹配,我们执行list元素重复。否则,我们将元素保持不变。
  3. 实施(oneliner)

    perl -MData::Dumper -E'$string = "5 3*3 4*1 6*3 14*4 3*2 2*3 4"; @array = map{/(\d+)\*(\d+)/ ? ($2)x$1 : $_} split /\s+/, $string; say Dumper \@array'
    

    实施(正常)

    my $string = "5 3*3 4*1 6*3 14*4 3*2 2*3 4";
    my @array = map {/(\d+)\*(\d+)/ ? ($2)x$1 : $_} split /\s+/, $string;
    # do something with @array:
    say "@array";
    

    请注意,字符串上使用的重复运算符会重复并连接字符串:

    "a"x3 ~~ "aaa"
    

    但是在列表中使用它会返回一个包含重复元素的列表:

    [(1)x3] ~~ [1,1,1]
    [(1,2)x2] ~~ [1,2,1,2]
    

答案 1 :(得分:0)

你在if块中缺少print语句,但这是另一种选择:

$string = "5 3*3 4*1 6*3 14*4 3*2 2*3 4";
$string =~ s/\s+/#/g;                     # change space delimiter to something else
$string =~ s/(?<!\*)(\d+)(?!\*)/"$1"/g;   # quote nums that don't have an asterisk next to it
$string =~ s/(\d+)\*(\d+)/"$2" x $1/g;    # make all changes at once
@array = split (/#/,$string);             # split the string

我认为你的方法更清晰;这非常重要。

答案 2 :(得分:0)

在空格中替换并拆分字符串。

use strict;
use Data::Dumper;

my $string = "5 3*3 4*1 6*3 14*4 3*2 2*3 4";
$string =~ s/\*/x/g;
my @list = split(' ', $string );
warn Dumper( \@list );