Каков скаляр ".." оператор типичное использование? Это только выбирает блоки текста?
Интересный пример один:
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
Люди вряд ли, кажется, знают об этом на основе вопросов здесь, но, да, я бы сказал, что типичное использование - это выбор блоков текста, либо с
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);
}
Вот место, где вам нужно быть очень осторожным о непреднамеренном использовании оператора скалярного диапазона: Подпрограмма возврата .
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;
}
За пределами Perl -e
Вы действительно должны « Это эзотерический и фанк. Смотрите мой пост не даже 24 часа назад об этом о , как он поддерживает состояние с контекстом вызывания . Это ужалоло меня в настоящей мировой заявке, потому что я пытался быть умным и нашел то, что думал, что это хороший выборщик для этого.
другое использование - простые счетчики, как этот:
perl -e 'foreach ( 1 ... 100 ){print"$_\n"}