2

文字列を簡単に分割してエントリを配列にプッシュする方法は知っていますが、この場合、それらもすべて 1 つずつデクリメントする必要があります。私はそれをできた:

my @valueArray = ();
my $values = "1,7,30";

push @valueArray, split(/,/, $values);

for (my $i = 0; $i < scalar(@valueArray); $i++) {
  $valueArray[$i]--;
}

しかし、これは perl であるため、分割とプッシュの間にそれを行うためのより短い方法があるはずです。ありますか、それともゴルフをやめて for ループに行くべきですか?

4

5 に答える 5

4

これはどう?

my $valuesSource = "1,17,30";
my @decrementedValues = map { $_ - 1 } split /,/, $valuesSource;

ここでデクリメントする必要はありません。実際、その内側のブロックが元の配列要素の値を更新するときに使用することはほとんどありmapません (逆も同様です)。)

于 2012-04-27T23:47:33.053 に答える
1

私があなたのコードを正しく理解していれば、配列の各数値を減分しようとしています。これは、 を使用することで非常に簡単に実現できますmap

配列に実際に数字しか含まれていない場合は、次のようにします。

my @num = qw/1 7 30/;
@num = map { --$_ } @num;

編集:

実際に整数値を扱っているかどうかも確認する必要があるかもしれません。例えば:

my $source = "1,17,30,,a";
say for grep{defined $_} map { /^\d+$/ ? --$_ : undef } split /,/, $source;
于 2012-04-27T23:42:19.087 に答える
1

その場で行いたい場合は、forループをより簡潔にすることができます。

--$_ for @valueArray;

これは、次のように言うのと同じです:

for my $x (@valueArray) {
    --$x;
}

一般に、Perl では C スタイルのループを避ける必要がありforます。これは、範囲ベースの同等のものよりも読みにくいためです。配列をその場で変更するのではなく、配列の変更されたコピーを返す非変更の同等物が必要な場合は、次のものもありmapます。

@valueArray = map { $_ - 1 } split /,/, $values;
于 2012-04-27T23:50:14.203 に答える
0

あなたが探しているのはマップ機能です:

my @valueArray = ();
my $values = "1,7,30";
push @valueArray, map { --$_ } split(/,/, $values);

split や map などの関数を使用する場合は、push を使用する必要がないことに注意してください。split と map は配列コンテキストで結果を返すことができるため、配列変数に直接代入するだけです。

my $values = "1,7,30";
my @valueArray = map { --$_ } split( /,/, $values);
于 2012-04-27T23:55:07.157 に答える
0
#!/usr/bin/env perl

use strict; use warnings;

my $values = "1,7,30";
my @values = map --$_, $values =~ /([0-9]+)/g;

use YAML;
print Dump \@values;

出力:

C:\temp> jj
---
- 0
- 6
- 29
于 2012-04-28T02:42:56.157 に答える