如何用Perl中的步骤生成范围?

Mat*_*att 29 perl

在bash,seq 5 5 20生产5 10 15 20.

在Perl中,1..5生产1 2 3 4 5; 它支持步骤吗?

如何用Perl中的步骤生成范围?

too*_*lic 33

perldoc -f map是一种方式:

use warnings;
use strict;
use Data::Dumper;

my @ns = map { 5 * $_ } 1 .. 4;
print Dumper(\@ns);

__END__

$VAR1 = [
          5,
          10,
          15,
          20
        ];
Run Code Online (Sandbox Code Playgroud)

另见:perldoc perlop

  • 地图总是非常酷.问题是`map`比[eugene y](http://stackoverflow.com/users/244297/eugene-y)建议的简单`for`更难阅读,实际上效率更低,可能更慢.这必须生成整个列表.想象一下像这样的循环`foreach my $ i(map 5*$ _,1..5000000){`.您必须先生成1,000,000个成员列表才能进行循环.但是,`for(my $ i = 5; $ i <= 5000000; $ i + = 5){`在执行之前不必先生成列表. (5认同)

Eug*_*ash 26

Perl中的范围运算符不支持步骤.您可以使用for循环代替:

for (my $i = 5; $i <= 20; $i += 5) {
    print "$i\n";
}
Run Code Online (Sandbox Code Playgroud)

  • +1:这是一个比`map`更好的解决方案.我用来写[APL](http://en.wikipedia.org/wiki/APL_(programming_language)),笑话是APL是_Write-Only_语言,因为代码总是无法读取.地图很整洁,但它可以具有_Write Only_质量.查看`for`循环,我立即看到我的循环.我可以看到它从5开始.我可以看到它变为20.而且,我可以看到它需要5步.使用`map`,我必须先解码它才能理解它. (5认同)

Zai*_*aid 22

该功能执行此操作:List::Gen range

use strict;
use warnings;
use feature 'say';
use List::Gen;

my $range = range 5, 20, 5;

say for @$range;      # 5
                      # 10
                      # 15
                      # 20

say while <$range>;   # TIMT1WTDI
$range->say;          # TAMT2WTDI, v.0.974
say $range->str;      # TAMT3WTDI, v.0.974

my $by_fives = <5 .. 20 by 5>;

say while <$by_fives>;     #TAMT4WTDI
<5 .. * by 5>->say( 4 );   #TAMT5WTDI
Run Code Online (Sandbox Code Playgroud)

  • +1我知道必须有一个模块,但我找不到它.干得好. (2认同)

kak*_*lon 7

不如工具

use warnings;
use strict;

my @ns;

for my $n (1..4) {
    push(@ns, $n*5);
}
Run Code Online (Sandbox Code Playgroud)