2014-10-22 58 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