Как я могу использовать переменную соответствия $ 1 после подстановки в Perl? - PullRequest
5 голосов
/ 14 апреля 2010

Какой самый чистый способ получения переменной соответствия из подстановки в Perl Иногда я пишу

    s/(something)// ;
    my $x = $1 ;

тогда я понимаю, что в случае сбоя s/ / / 1005 * может переносить значение из предыдущего совпадения. Поэтому я стараюсь

    my  $x = 'defaultvalue' ;
    if ( s/(something)// )
    {
     $x = $1 ;
    }

Это самый чистый способ сделать это?

Ответы [ 4 ]

4 голосов
/ 14 апреля 2010

TMTOWTDI.

Идиоматический Perl, который обычно можно увидеть, может выглядеть примерно так:

my $x='defaultvalue';

$x=$1 if (s/(something)//) ;
2 голосов
/ 14 апреля 2010

Как уже отмечали другие, TIMTOWTDI.

Я бы лично обернул это как одно выражение, чтобы не отвлекать слишком много от сути:

my $x = s/(something)// ? $1 : 'defaultvalue';
1 голос
/ 14 апреля 2010

Это очень субъективно, и лучший ответ будет во многом зависеть от того, насколько хорошо он соответствует вашему стилю кодирования, но я все равно брошу свою шляпу на ринг.

Мой фаворит для заданий со значениями по умолчанию - третичный оператор:

my $x = ($data =~ s/(foo)//) ? $1 : 'defaultvalue';

Хотя оператор new (ну, а не тот новый, введенный в 5.10) «определен или» во многих случаях может снизить потребность в третичном утверждении. Я обычно использую это так:

my $var = defined($candidate) ? $candidate : 'default';

Но теперь это можно упростить до:

my $var = $candidate // 'default';

или

my $var = 'default';
$var //= $candidate;
1 голос
/ 14 апреля 2010

@ mobrule указывает в комментариях, которые вы можете использовать

s{(...)}{} && ($x=$1)

Я бы порекомендовал

s{(...)}{} and $x = $1;

Я использовал s{}{}, потому что ненавижу, когда Markdown отмечает // как комментарии в коде Perl.

and имеет более низкий приоритет, чем &&, что позволяет убрать круглые скобки вокруг назначения.

С perldoc perlop :

В качестве более удобочитаемой альтернативы && и || при использовании для потока управления Perl предоставляет операторы and и or (см. Ниже). Поведение при коротком замыкании идентично. Однако приоритет «и» и «или» намного ниже, так что вы можете безопасно использовать их после оператора списка без необходимости использовать круглые скобки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...