«Оператор goatse» или idiom =()=
в Perl вызывает выражение, которое будет оцениваться в контексте списка.Является ли Perl Goatse 'Secret Operator' эффективным?
Пример может служить:
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.
Вопросы по эффективности являются следующие:
- Я ошибаюсь в том, как я разборе это?
- Если у вас есть список производителей, и все, что вас интересует, это счет, есть ли более эффективный способ сделать это?
Он отлично работает с этим тривиальным списком, но что, если в списке было сотни тысяч матчей? С помощью этого метода вы создаете полную копию каждого матча, а затем удаляете его только для подсчета.
Это не так эффективно, как разработка пользовательского микрочипа для реализации вашей программы. – jrockway
Почему голос? Разве это не справедливый вопрос о компромиссе между эффективностью и идиомой? – dawg
Извините, я не мог устоять перед создателем тега для '[goatse]'. : Списки D – Ether