Есть ли в Perl сценарий, в котором $ {foo [bar]} может быть синтаксически верным кодом? - PullRequest
4 голосов
/ 12 марта 2012

Я читаю Perl для программирования O'Reilly, 3-е издание, и в тексте говорится, что вместо использования неоднозначного шаблона поиска /$foo[bar]/ следует вместо этого использовать /${foo[bar]}/, чтобы Perl не ошибся с [bar] для класс персонажа. Я что-то упустил, или оба этих оператора синтаксически неверны из-за того, что они пытаются проиндексировать массив, используя строку голого слова? Я проверил ошибки в книге онлайн и не могу найти упоминаний об этой ошибке в книге. Есть ли какой-то сценарий, который я упускаю из виду, в котором этот код может быть действительным?

Ответы [ 3 ]

8 голосов
/ 12 марта 2012

Я читаю через O'Reilly's Programming Perl , 3 rd Edition, и в тексте говорится, что вместо использования неоднозначного шаблона поиска /$foo[bar]/ следуетвместо этого используйте /${foo[bar]}/, чтобы Perl не принял [bar] за символьный класс.Я что-то пропустил, или оба этих утверждения синтаксически неверны из-за того, что они пытаются индексировать в массив, используя строку голого слова?

Да, вы что-то упускаете: bar может быть вызовом функции:

$ perl -Mstrict -E 'sub bar() { 0 } say "foo" =~ /$ARGV[bar]/ || "FAIL"' foo
FAIL

$ perl -Mstrict -E 'sub bar() { 0 } say "foo" =~ /${ARGV[bar]}/ || "FAIL"' foo
1

$ perl -MO=Deparse -Mstrict -E 'sub bar() { 0 } say "foo" =~ /${ARGV[bar]}/ || "FAIL"' foo
sub bar () { 0 }
use strict 'refs';
BEGIN {
    $^H{'feature_unicode'} = q(1);
    $^H{'feature_say'} = q(1);
    $^H{'feature_state'} = q(1);
    $^H{'feature_switch'} = q(1);
}
say 'foo' =~ /$ARGV[0]/ || 'FAIL';
-e syntax OK

Точная цитата, со стр. 73 из Программирование Perl , 4 th редакция , является:

В шаблонах поиска, которые также подвергаются двойной интерполяции, есть неприятная двусмысленность: /$foo[bar]/ следует интерпретировать как /${foo}[bar]/ (где [bar] - класс символов длярегулярное выражение) или как /${foo[bar]}/ (где [bar] - индекс для массива @foo)?Если @foo не существует, это, очевидно, класс символов.Если существует @foo, Perl делает правильное предположение о [bar] и почти всегда прав.Если он действительно угадывает, или если вы просто параноик, вы можете использовать правильную интерпретацию с помощью фигурных скобок, как показано ранее.Даже если вы просто предусмотрительны, это, вероятно, неплохая идея.

4 голосов
/ 12 марта 2012
sub bar { 1 }

Увы, я не могу представить это в одиночку;это слишком коротко для ТАК.Итак, это один из способов выразить константу в Perl.Например, sub MAGIC_NUMBER { 0x7774 }

0 голосов
/ 12 марта 2012

bar может быть функцией:

perl -le 'sub bar () { 1 } my @foo = qw(hello world); print m/${foo[bar]}/ ? "$_ -> TRUE" : "$_ -> FALSE" for qw(hello world)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...