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

时间:2012-01-11 13:35:16

标签: perl

在bash中,seq 5 5 20生成5 10 15 20

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

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

6 个答案:

答案 0 :(得分:31)

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
        ];

另请参阅:perldoc perlop

答案 1 :(得分:25)

Perl中的范围运算符不支持步骤。您可以改为使用for循环:

for (my $i = 5; $i <= 20; $i += 5) {
    print "$i\n";
}

答案 2 :(得分:21)

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

答案 3 :(得分:6)

不如工具

use warnings;
use strict;

my @ns;

for my $n (1..4){
    push(@ns, $n*5);
}

答案 4 :(得分:2)

我作为一个禁用模块写了Acme::Range::Module一段时间 - 因此Acme::命名空间 - 但它确实做了你想做的事情并且有测试并得到支持。这是示例代码:

use Acme::Globule qw( Range );

foreach (<10..1>) {
  print "$_... ";
}
print "Lift-off!\n";

# put down that crack pipe...
sub my_keys(\%) {
  my @hash = %{ $_[0] };
 return @hash[ glob("0,2..$#hash") ];
}

sub my_values(\%) {
  my @hash = %{ $_[0] };
 return @hash[ glob("1,3..$#hash") ];
}

答案 5 :(得分:2)

这是一个使用map和内置范围运算符的简单解决方案:

sub range {
    my ($start, $end, $step) = @_; 
    $step ||= 1;
    return map { $_ * $step } ($start / $step .. $end / $step);
}

注意这里的关键点是map {}块。我们简单地划分结束 通过给定的步骤(适用于负面和正面)然后映射每个值 到给定步骤的倍数。