Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl字符串到带有重复运算符的数组_Perl_Search_Replace_Repeat - Fatal编程技术网

perl字符串到带有重复运算符的数组

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

我有一根绳子,上面写着:“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);
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]