Эффективен ли Perl Goatse 'Secret Operator'?

Оператор 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";

Как я интерпретирую, происходит следующее:

  1. $ str = ~ / \ d / g соответствует всем цифрам. Контекст переключателя и списка g создает список этих совпадений. Пусть это будет пример «List Producer», а в Perl это может быть много вещей.
  2. the = () = вызывает присвоение пустому списку, поэтому все фактические совпадения копируются в пустой список.
  3. Присваивание в скалярном контексте $ count списка, созданного на этапе 2., дает счетчик списка или результат 5.
  4. Счетчик ссылок пустого списка = () = обращается в ноль после скалярного присвоения. Копия элементов списка затем удаляется Perl.

Вопросы по эффективности таковы:

  1. Я ошибаюсь в том, как я это разбираю?
  2. Если у вас есть List Producer и все, что вас интересует, это счетчик, есть ли более эффективный способ сделать это?

Он отлично работает с этим тривиальным списком, но что, если бы список состоял из сотен тысяч совпадений? С помощью этого метода вы создаете полную копию каждого совпадения, а затем удаляете ее, чтобы посчитать их.

26
задан dawg 8 August 2014 в 23:14
поделиться