我有一个字符串,说:“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,...)
答案 0 :(得分:1)
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 );