Как произвести диапазон с шагом в Perl? - PullRequest
27 голосов
/ 11 января 2012

В bash seq 5 5 20 производит 5 10 15 20.

В Perl 1..5 производит 1 2 3 4 5;он поддерживает step?

Как создать диапазон с шагом в Perl?

Ответы [ 7 ]

31 голосов
/ 11 января 2012

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

25 голосов
/ 11 января 2012

Оператор диапазона в Perl не поддерживает шаги. Вместо этого вы можете использовать цикл for:

for (my $i = 5; $i <= 20; $i += 5) {
    print "$i\n";
}
21 голосов
/ 11 января 2012

Функция 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
6 голосов
/ 11 января 2012

Не так хорошо, как инструмент

use warnings;
use strict;

my @ns;

for my $n (1..4){
    push(@ns, $n*5);
}
2 голосов
/ 23 мая 2016

Вот простое решение, которое использует карту и встроенный оператор дальности:

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

Обратите внимание, что ключевым моментом здесь является блок карты {}. Мы просто делим конец на данном шаге (работает для отрицательного и положительного), затем сопоставьте каждое значение кратный данному шагу.

2 голосов
/ 15 января 2012

Я некоторое время назад писал Acme::Range::Module как модуль 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") ];
}
0 голосов
/ 12 мая 2016

Как и на карте решение:)

Здесь он используется для поиска файлов, начинающихся с четных чисел в диапазоне от 116 до 648

perl -e 'foreach  (map { 2 * $_ } (116/2) .. (648/2)) { system("ls -l $_*"); } '

Perl просто замечательный для некоторых работ и делает смешные лайнеры :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...