0

「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, ...)

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

スペースで文字列の置換と分割を行います。

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 に答える
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 に答える