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

Какое скалярное использование оператора ".." типично? Это только выделение блоков текста?

Интересный пример для себя:

sub get_next {
    print scalar($$..!$$), "\n";
}

get_next for 1 .. 5;  # prints numbers from 1 to 5
get_next for 1 .. 5;  # prints numbers from 6 to 10

Ответы [ 4 ]

3 голосов
/ 27 января 2010

Люди вряд ли знают об этом, основываясь на вопросах здесь, но, да, я бы сказал, что типичное использование - это выделение блоков текста с

while (<>) {
  print if /BEGIN/ .. /END/;
}

или

while (<>) {
  print if 3 .. 5; # prints lines 3 through 5
}

Последний является синтаксическим сахаром для проверки по входному номеру строки ($.)

... if $. == 3 .. $. == 5;

что говорит о странной внешности

#! /usr/bin/perl -l

for ($_ = 1; $_ <= 10; ++$_) {
  print if $_ == 4 .. $_ == 7;
}

Вывод программы выше

4
5
6
7

Если у вас есть какое-то условие брекетинга, проверьте его в подпрограммах:

for (...) {
  do_foo($x,$y,$z) if begin($x) .. end($z);
}
2 голосов
/ 28 января 2010

Вот место, где вы должны быть очень осторожны с непреднамеренным использованием оператора скалярного диапазона: возвращает подпрограмму .

sub range {
     my $start = shift;
     my $end   = shift;

     return $start .. $end;
}

@foo = range( 1, 5 );  # ( 1, 2, 3, 4, 5 )
$foo = range( 1, 5 );  # False or maybe true.  Who knows.

Если вы вызовете эту подпрограмму в скалярном контексте, вас ждет сюрприз.

После того, как меня укусила какая-то разновидность этой проблемы, я теперь всегда проверяю, назначаю ли мне возвращаемый список в массив, тем самым получая поведение, подобное массиву, для моих подпрограмм. Если мне нужно другое специфичное для контекста поведение (очень редко), я использую wantarray.

sub range {
     my $start = shift;
     my $end   = shift;

     my @result = $start .. $end;
     return @result;
}
2 голосов
/ 27 января 2010

За пределами perl -e вы действительно не должны. Это эзотерика и фанк. Смотрите мой пост даже 24 часа назад об этом о том, как он поддерживает состояние с вызовом контекста . Это задело меня в реальном приложении, потому что я пытался быть умным и нашел то, что мне показалось хорошим вариантом для этого.

0 голосов
/ 27 января 2010

другое использование - простые счетчики, подобные этому: perl -e 'foreach ( 1 .. 100 ){print"$_\n"}'

...