Как я должен использовать скалярный оператор диапазона Perl?

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

Интересный пример один:

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
8
задан brian d foy 27 January 2010 в 16:02
поделиться

4 ответа

-

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

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);
}
3
ответ дан 5 December 2019 в 21:19
поделиться

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

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.

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

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

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

     my @result = $start .. $end;
     return @result;
}
2
ответ дан 5 December 2019 в 21:19
поделиться

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

2
ответ дан 5 December 2019 в 21:19
поделиться

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

0
ответ дан 5 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: