"Оператор goatse" или идиома =()=
в Perl заставляет выражение оцениваться в контексте списка.
Пример:
my $str = "5 and 4 and a 3 and 2 1 BLAST OFF!!!";
my $count =()= $str =~ /\d/g; # 5 matches...
print "There are $count numbers in your countdown...\n\n";
Когда я интерпретирую использование, это происходит:
-
$str =~ /\d/g
соответствует всем цифрам. Контекстg
и контекст списка выдает список этих совпадений. Пусть это будет пример "List Producer", а в Perl это может быть много. -
=()=
вызывает присвоение пустого списка, поэтому все фактические совпадения копируются в пустой список. - Назначение в скалярном контексте к счету $списка, созданного в 2., дает счетчик списка или результат 5.
- Счетчик ссылок пустого списка
=()=
переходит в нуль после скалярного присваивания. Затем копия элементов списка удаляется Perl.
Вопросы эффективности:
- Неужели я ошибаюсь в том, как я разбираю это?
- Если у вас есть List Producer, и все, что вас интересует, это счет, есть ли более эффективный способ сделать это?
Он отлично работает с этим тривиальным списком, но что, если в списке было сотня тысяч матчей? С помощью этого метода вы создаете полную копию каждого совпадения, а затем удаляете его только для подсчета.