В bash, seq 5 5 20
произведите 5 10 15 20
.
В Perl 1..5
создает 1 2 3 4 5
; поддерживает ли этот шаг?
Как создать диапазон с шагом в Perl?
В bash, seq 5 5 20
произведите 5 10 15 20
.
В Perl 1..5
создает 1 2 3 4 5
; поддерживает ли этот шаг?
Как создать диапазон с шагом в Perl?
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
Оператор диапазона в Perl не поддерживает шаги. Вместо этого вы можете использовать цикл for
:
for (my $i = 5; $i <= 20; $i += 5) {
print "$i\n";
}
Функция 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
Не так хорошо, как инструмент
use warnings;
use strict;
my @ns;
for my $n (1..4){
push(@ns, $n*5);
}
Я писал Acme::Range::Module
a назад как модуль gag - следовательно, пространство имен 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") ];
}
Вот простое решение, которое использует карту и встроенный оператор диапазона:
sub range {
my ($start, $end, $step) = @_;
$step ||= 1;
return map { $_ * $step } ($start / $step .. $end / $step);
}
Обратите внимание, что ключевой момент здесь - это блок map {}. Мы просто разделим конец по заданному шагу (работает для отрицательного и положительного), тогда сопоставьте каждое значение на кратное данному шагу.
Как и решение карты:)
Здесь он используется для поиска файлов, начинающихся с четных чисел в диапазоне от 116 до 648
perl -e 'foreach (map { 2 * $_ } (116/2) .. (648/2)) { system("ls -l $_*"); } '
Perl просто замечателен для некоторых заданий и делает смешные один лайнер:)