0

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

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

@array =(“5”,“3”×3,“1”×4,“3”×6,“4”×14,“2”×3,“3”×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, ...)

4

3 回答 3

1

算法:

  1. 取字符串并将其拆分为空格
  2. 如果 /(\d+)*(\d+)/ 正则表达式匹配一个元素,我们会重复列表元素。否则,我们通过元素不变。

实施(单线)

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]
于 2012-10-18T23:32:11.710 回答
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

不过,我认为您的方法更清楚;这是非常重要的。

于 2012-10-18T22:35:27.787 回答
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 );
于 2012-10-18T22:37:49.300 回答