Как мне использовать оператор скалярного диапазона Perl?

StackOverflow https://stackoverflow.com/questions/2146745

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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

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"}'

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top