perl - регулярным - недостатки регулярных выражений



Принуждение контекста списка в Perl (2)

Вы сбиты с толку, потому что думаете = - это единственный оператор, в то время как это может привести к двум различным операторам: оператору присваивания списка или скалярному оператору присваивания. Мини-учебник: Scalar vs List Assignment Operator объясняет различия.

my $b = (33,22,11);
------------------            Scalar assign in void context.
        ----------            List literal in scalar context. Returns last.

my @b = (33,22,11);
------------------            List assign in void context.
        ----------            List literal in list context. Returns all.

my $b = ( () = (33,22,11) );
---------------------------   Scalar assign in void context.
        -------------------   List assign in scalar context. Returns count of RHS
               ----------     List literal in list context. Returns all.

my @b = ( () = (33,22,11) );
---------------------------   List assign in void context.
        -------------------   List assign in list context. Returns LHS.
               ----------     List literal in list context. Returns all.

Что касается вашего заголовка, принудительный контекст списка невозможно для каждого. Если функция возвращает список, когда ожидается скаляр, это приводит к дополнительным значениям в стеке, что приводит к тому, что операторы получают неправильные аргументы.

Вы можете, однако, сделать что-то вроде:

( EXPR )[0]

или

( EXPR )[-1]

EXPR в контексте списка, но целое возвращает только один элемент возвращаемого списка.

https://ffff65535.com

Я пытаюсь понять контекст Perl, и я споткнулся о камень;

С учетом кода;

#!/usr/bin/perl

my $b = (33,22,11);
print "$b\n";

my $b = () = (33,22,11);
print "$b\n";

my @b = (33,22,11);
print "@b\n";

my @b = () = (33,22,11);
print "@b\n";

Результаты (последняя строка пуста);

 11  

 3 

 33 22 11

 <>

Поскольку второй отпечаток вернул длину списка, я предполагал, что где-то массив был сгенерирован, так как массив в скалярном контексте оценивает его длину. Но четвертый отпечаток, похоже, опровергает это предположение. Я ожидал увидеть « '33 22 11' но вместо этого ничего не получил. Что тут происходит?


Назначение списка в скалярном контексте возвращает количество элементов в правой части (случай 2). Случай 4 сначала назначает (33, 22, 11) - () , а затем присваивает () (значение которого не изменилось) на @b .





perl