2012-04-27 38 views
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

這個怎麼樣?

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

你不需要在這裏遞減;實際上,當它的內部塊更新原始數組元素的值時,很少使用map - 反之亦然。 )

+0

完美,正是我所需要的。 – Ilion 2012-04-27 23:51:39

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; 
+0

'grep的,..'看起來更漂亮,但爲什麼不能顛倒順序? '說地圖 - $ _,grep/^ \ d + $ /,split /,/,$ source'。 – TLP 2012-04-28 06:10:15

1

如果你想這樣做的到位,for迴路可製成更爲簡潔:

--$_ for @valueArray; 

這相當於說:

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

一般情況下,你應該避免C風格的for循環在Perl中,因爲它們比基於範圍的等價物更不可讀。如果你想有一個非不同誘變相當於是返回數組的修改後的副本,而不是就地修改它,也有map

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

+1;非常性感。甚至沒有想到不使用地圖... – 2012-04-28 00:15:46

0

什麼你要找的是map function

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

注意,使用像裂開或地圖功能時,您不需要使用推...因爲分裂和地圖可以在陣列情況下得出的結果,乾脆直接分配給數組變量:

my $values = "1,7,30"; 
my @valueArray = map { --$_ } split(/,/, $values); 
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