Как мне использовать оператор скалярного диапазона 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
Решение
Люди вряд ли знают об этом на основе вопросов здесь, но, да, я бы сказал, что типичное использование выбирает блоки текста, либо с
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);
}
Другие советы
Я думаю, это сделает трюк. Но я не проверил его.
$site = get-SPSite http://mysite.com
$web = $site.RootWeb
$pweb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
$pPages = $pWeb.GetPublishingPages();
$pLayouts = $pweb.GetAvailablePageLayouts()
foreach ($pPage in $pPages)
{
if ($pPage.Layout -eq $pLayouts)
{
write-host $pPage.Title
}
}
. Вот место, где вам нужно быть очень осторожным с непреднамеренным использованием оператора скалярного диапазона: Подпрограмма возвращает.
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;
}
Другое использование - это простые счетчики, как это:perl -e 'foreach ( 1 .. 100 ){print"$_\n"}'