Подтвердить что ты не робот

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

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

В Perl 1..5 создает 1 2 3 4 5; поддерживает ли этот шаг?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Функция 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

Ответ 4

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

use warnings;
use strict;

my @ns;

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

Ответ 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") ];
}

Ответ 6

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

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

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

Ответ 7

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

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

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

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