[Moscow.pm] Особенности парсера?

Ilya Chesnokov chesnokov.ilya на gmail.com
Ср Окт 31 03:23:17 PDT 2012


Можно ещё вот так дать понять компилятору, что это блок, при помощи
точки с запятой:

perl -e '@A=(1..10); %B=map {; "$_"=>1 }, @A;'

2012/10/31 Vladimir Timofeev <vovkasm на gmail.com>:
> 2012/10/31 Maxim Vuets <maxim.vuets на gmail.com>:
>> On Wed, Oct 31, 2012 at 12:07:54AM +0400, Vladimir Timofeev wrote:
>>>perl -e '@A=(1..10); %B=map { "$_"=>1 } @A;'
>>
>> perl -e '@A=(1..10); %B=map { "$_"=>1 }, @A;'
>>
>> Только делает оно не то, что ожидалось.
>>
>>>Первый из них выдает syntax error
>>>Вопрос, почему?
>>
>> Компилятор подсказывает:
>>     Array found where operator expected at -e line 1, near "} "
>>         (Missing operator before  ?)
>>         Not enough arguments for map at -e line 1, near "} @A"
>>
>> map имеет две формы:
>>
>>     map BLOCK LIST
>>     map EXPR,LIST
>>
>> Там же в документации есть большой пример и объяснение:
>>
>>     "{" starts both hash references and blocks, so "map { ..." could be either the
>>     start of map BLOCK LIST or map EXPR, LIST. Because Perl doesn't look ahead for
>>     the closing "}" it has to take a guess at which it's dealing with based on what
>>     it finds just after the "{". Usually it gets it right, but if it doesn't it
>>     won't realize something is wrong until it gets to the "}" and encounters the
>>     missing (or unexpected) comma. The syntax error will be reported close to the
>>     "}", but you'll need to change something near the "{" such as using a unary "+"
>>     to give Perl some help:
>>
>>        %hash = map {  "\L$_" => 1  } @array  # perl guesses EXPR.  wrong
>>        %hash = map { +"\L$_" => 1  } @array  # perl guesses BLOCK. right
>>        %hash = map { ("\L$_" => 1) } @array  # this also works
>>        %hash = map {  lc($_) => 1  } @array  # as does this.
>>        %hash = map +( lc($_) => 1 ), @array  # this is EXPR and works!
>>
>>        %hash = map  ( lc($_), 1 ),   @array  # evaluates to (1, @array)
>>
>>     or to force an anon hash constructor use "+{":
>>
>>        @hashes = map +{ lc($_) => 1 }, @array # EXPR, so needs comma at end
>>
>>     to get a list of anonymous hashes each with only one entry apiece.
>>
>> Компилятору показалось, что это EXPR, потому он ожидал запятую.
>
> Мдя... в эти доки я уже пару лет как не заглядывал, сенкс...
> Но все равно забавно ;-)
>
> --
> Vladimir Timofeev <vovkasm на gmail.com>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org



-- 
Best regards,
Ilya Chesnokov


Подробная информация о списке рассылки Moscow-pm