2

我知道如何轻松拆分字符串并将条目推送到数组中,但在这种情况下,我也需要将它们全部递减。我可以做:

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

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

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

但是这个beeing 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;
}

一般来说,您应该避免for在 Perl 中使用 C 风格的循环,因为它们的可读性不如基于范围的等价物。如果您想要一个非变异等效项,它返回数组的修改副本而不是就地修改它,还有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 回答