在bash中,seq 5 5 20
生成5 10 15 20
。
在Perl中,1..5
生成1 2 3 4 5
;它支持步骤吗?
如何使用Perl中的步骤生成范围?
答案 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 {}块。我们简单地划分结束 通过给定的步骤(适用于负面和正面)然后映射每个值 到给定步骤的倍数。