2014-10-22 51 views
2

Perl有一個範圍操作符,其在foreach循環使用時,不創建臨時數組:如果第一個整數是小於範圍操作者遞減從最大到最小:10..1

foreach (1 .. 1_000_000) { 
    # code 
} 

第二個整數,則沒有迭代運行:

foreach (1_000_000 .. 1) { 
    # code here never runs 
} 

我可以使用reverse內置的,但這樣做不守創建一個臨時數組的優化?

foreach (reverse 1 .. 1_000_000) { 
    # code 
} 

有沒有一種方法可以像範圍運算符一樣減少數字而不是增加?

+1

對於反向看到[這個答案](http://stackoverflow.com/a/18539244/728795)。總之,沒有,使用反向範圍時沒有優化 – Andrei 2014-10-22 11:08:30

+0

@Andrei:謝謝!我已經將我的問題標記爲該問題的副本。 – Flimm 2014-10-22 11:14:30

+1

我猶豫要做同樣的事情,因爲嚴格來說你的問題有點不同 – Andrei 2014-10-22 11:18:04

回答

3

不漂亮的解決方案,

for (my $i=1_000_000; $i >= 1; $i--) { 

    print "$i\n"; 
} 
2

可以只是減去你從一個有數量超過該範圍的頂部:

foreach (1 .. 1_000_000) { 
    my $n = 1_000_001 - $_; 
    ... 
} 
+5

沒有重複:'for(-1_000_000 .. -1){my $ n = - $ _; ...}' – ikegami 2014-10-22 13:02:25

+0

@ikegami nice variant :) – Alnitak 2014-10-22 13:08:11

3

雖然for是好的,while可能更適合。

my $n = 1_000_000; 
while ($n >= 1) { 
    ... 
} continue { # continue block will always be called, even if next is used 
    $n--; 
} 
+2

也許'繼續{$ n--}' – 2014-10-22 11:40:50

+2

這是一個好主意,它可以防止'next'語句創建無限循環,例如使用循環條件'next if $在增量之前,n == 12。 – TLP 2014-10-22 11:44:55