我可以在递减值的同时推送到数组吗?

时间:2012-04-27 23:31:43

标签: perl

我知道如何轻松地拆分字符串并将条目推送到数组上,但在这种情况下,我需要将它们全部减少一个。我能做到:

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

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

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

但是这个看起来似乎应该有更短的方式在分裂和推动之间做到这一点。有没有,或者我应该停止打高尔夫球,只是去寻找for循环?

5 个答案:

答案 0 :(得分:4)

这个怎么样?

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

你不需要在这里递减;实际上,当内部块更新原始数组元素的值时,很少使用map - 反之亦然。 )

答案 1 :(得分: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;

答案 2 :(得分:1)

如果你想这样做,可以使for循环更加简洁:

--$_ for @valueArray;

这相当于说:

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

通常,你应该避免在Perl中使用C风格的for循环,因为它们的可读性低于它们基于范围的等价物。如果你想要一个非变异的等价物,它返回一个修改过的数组副本而不是修改它,那么还有map

@valueArray = map { $_ - 1 } split /,/, $values;

答案 3 :(得分:0)

您要找的是map function

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);

答案 4 :(得分: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