perl字符串到带有重复运算符的数组
我有一根绳子,上面写着:“53*34*16*314*43*22*34” 我希望此字符串成为包含以下元素的数组:perl字符串到带有重复运算符的数组,perl,search,replace,repeat,Perl,Search,Replace,Repeat,我有一根绳子,上面写着:“53*34*16*314*43*22*34” 我希望此字符串成为包含以下元素的数组: [(1)x3] ~~ [1,1,1] [(1,2)x2] ~~ [1,2,1,2] @数组=(“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); for
[(1)x3] ~~ [1,1,1]
[(1,2)x2] ~~ [1,2,1,2]
@数组=(“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,…)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
$string=“5 3*3 4*1 6*3 14*4 3*2*3 4”;
$string=~s/\s+/#/g;#将空格分隔符更改为其他内容
$string=~s/(?在空间上替换并拆分字符串
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 );
算法:
取字符串并在空格处拆分
如果/(\d+)*(\d+)/regex与一个元素匹配,我们将重复list元素。否则,我们将通过unchanged传递该元素
实施(oneliner)
实施(正常)
请注意,字符串上使用的重复运算符会重复并连接字符串:
"a"x3 ~~ "aaa"
但用于列表时,它返回一个包含重复元素的列表:
[(1)x3] ~~ [1,1,1]
[(1,2)x2] ~~ [1,2,1,2]
你想要(5,3,3…
例如?还是像原稿一样保留字符串?是的,谢谢你澄清。我刚刚意识到了歧义。我想要你猜到的:(5,3,3,3…)我现在很困惑,我的代码能做你想做的吗?听起来你想使用重复运算符anks。不,这不是正确的想法。数字必须按顺序颠倒,并与“*”之前的数字对应重复多次。谢谢。这就成功了。我修改了map函数(读取perldoc perlop等)但是仍然没有完全理解它。你有没有像我一样的好资源来简单地描述它?@MarkWayne中解释了map
函数。它在右侧获取一个列表,对其执行一个操作,然后将结果填充到左侧的列表中。在我的代码中,我使用了这样一个事实,即它可以输出任意数量的新列表元素。
[(1)x3] ~~ [1,1,1]
[(1,2)x2] ~~ [1,2,1,2]