Как я нахожу количество значений в списке Perl?

Количество значений в списке может только быть определено путем итерации по его значениям или преобразования его в массив. Присвоение его к скаляру не возвратит количество объектов:

my $n = ('a', 'b', 'c');  # $n = 'c' 

Существует "пустые круглые скобки" идиома, которая может использоваться для получения числа элементов:

my $n = () = ('a', 'b', 'c'); # $n = 3

Действительно ли это эквивалентно внутренне

my $n = @{[ 'a', 'b', 'c' ]};

?

7
задан Sinan Ünür 8 February 2010 в 23:32
поделиться

7 ответов

Это интересная деталь реализации: Создает ли присвоение пустому списку (ненужный) анонимный массив?

На этот вопрос можно ответить двумя способами: Во-первых, Правильный путь: Попытайтесь выяснить, как с этим можно справиться в исходном коде. Есть ли особый случай присвоения пустому списку, оцениваемого в скалярном контексте?

Будучи ленивым и невежественным типом, я решил использовать Benchmark :

#!/usr/bin/perl

use strict; use warnings;
use Benchmark qw( cmpthese );

cmpthese -5,  {
    goatse => sub { my $n = () = 'A' .. 'Z' },
    anon   => sub { my $n = @{[ 'A' .. 'Z' ]}},
};

Я провел несколько тестов раз, и присвоение пустому списку имело небольшое преимущество во всех случаях. Если бы разница была чисто случайной, вероятность соблюдения 10 таймингов в пользу goatse была бы менее 0,1%, поэтому я предполагаю, что есть какое-то короткое замыкание.

С другой стороны, запуск теста @daotoad, размещенного в комментариях, вероятно, дает более полную картину:

#!/usr/bin/perl

use strict; use warnings;
use Benchmark qw( cmpthese );

use constant START => 1;
use constant STOP => 1000;

my $start = START;
my $stop = STOP;

cmpthese -5, {
    anon => sub { my $n = @{[ $start .. $stop ]}},
    goatse => sub { my $n = () = $start .. $stop },
    canon => sub { my $n = @{[ START .. STOP ]}},
    cgoatse => sub { my $n = () = START .. STOP },
};

Типичные результаты на моей машине (Windows XP Pro SP3, Core 2 Duo, 2 Гб памяти, ActiveState perl 5.10.1.1006):

           Rate    anon cgoatse  goatse   canon
anon     5207/s      --    -45%    -49%    -51%
cgoatse  9522/s     83%      --     -7%    -10%
goatse  10201/s     96%      7%      --     -4%
canon   10636/s    104%     12%      4%      --

И с:

use constant START => 'AAAA';
use constant STOP => 'ZZZZ';

результаты следующие:

          Rate    anon  goatse cgoatse   canon
anon    1.73/s      --    -12%    -16%    -17%
goatse  1.98/s     14%      --     -4%     -5%
cgoatse 2.06/s     19%      4%      --     -1%
canon   2.08/s     20%      5%      1%      --

Заключение:

Если есть сомнения, используйте my $ n = () = .. .;

6
ответ дан 6 December 2019 в 10:00
поделиться

Два показанных вами предмета не эквивалентны. Но у них одинаковый конечный результат:

my $n = @{[ 'a', 'b', 'c' ]};

Здесь вы создаете анонимный массив ['a', 'b', 'c'] , затем разыменовываете его и берете количество членов. Создание массива обеспечивает контекст списка для операторов запятой в операторе.

my $n = () = ('a', 'b', 'c');

Здесь мы используем печально известный «оператор козла». Список ('a', 'b', 'c') назначается пустому списку () = ('a', 'b', 'c'); . Результат назначения списка присваивается $ n . Назначение списка возвращает количество элементов в правой части назначения в скалярном контексте (в контексте списка вы получаете список присвоенных значений).

8
ответ дан 6 December 2019 в 10:00
поделиться

Для достижения согласованного результата в перекрестном браузере обычно добавляется еще один div внутри div без явной ширины и поля . Поле будет имитировать заполнение для внешнего раздела

. -121--802776-

WP-электронная коммерция является единственным плагином для WordPress стоит посмотреть, когда дело доходит до электронной коммерции. Ты получаешь многое бесплатно.

Это сказал, Алекс делает несколько отличных моментов о том, как WordPress НЕ идеален для электронной коммерции.

Однако после завершения 2 веб-сайтов с WP-eCommerce и 2 веб-сайтов с Magento Commerce, я могу сказать, что существует ОГРОМНАЯ разница во времени, которое требуется для завершения.

WP-eCommerce можно настроить относительно быстро с очень малой настройкой, чтобы он выглядел достойно в вашей теме WP. Полная система электронной коммерции, такая как Magento , с другой стороны, имеет огромную кривую обучения, и вы будете тратить 3 раз столько времени, сколько вы хотите, чтобы изменить что-либо.

Все зависит от того, на что вы идете. Если вы хотите что-то простое, что можно немного изменить, но не нужно быть большим надежным долгосрочным решением, я бы определенно рассмотрел WP-eCommerce. В противном случае перейдите к реальной платформе электронной коммерции.

Альтернативно: Zen-Cart выглядит проще, чем Magento, но без некоторой гибкости. Что бы вы ни делали, никуда не ходите рядом с osCommerce.

-121--4903874-

No. Это эквивалентно:

my $n = (() = ('a', 'b', 'c'));

... так как оператор назначения является правоассоциативным. Назначение списка в скобках справа само по себе находится в скалярном контексте, и поэтому его значением является количество элементов в правой части.

4
ответ дан 6 December 2019 в 10:00
поделиться

Вы могли сделать это 2 способами:

  1. добавляют, что ИМЯ приписывает всем вашим специальным узлам, таким образом, вы можете использовать, условия E4X ( xml)
  2. используют петлю, чтобы пройти специальные узлы и проверку, если есть на самом деле признак ИМЕНИ ( xml2)

, Вот пример:

//xml with all special nodes having NAME attribute
var xml:XML = <node>
 <node>
      <node>
        <special NAME="thisone"></special>
      </node>
      <node>
        <special NAME="something else">dont want this one</special>
      </node>
     </node>
</node>
//xml with some special nodes having NAME attribute
var xml2:XML = <node>
 <node>
      <node>
        <special NAME="thisone"></special>
      </node>
      <node>
        <special>dont want this one</special>
      </node>
     </node>
</node>

//WITH 4XL conditional
var filteredNodes:XMLList = xml.node.node.special.(@NAME == 'thisone');
trace("E4X conditional: " + filteredNodes.toXMLString());//carefull, it traces 1 xml, not a list, because there only 1 result,otherwise should return 
//getting the parent of the matching special node(s)
for each(var filteredNode:XML in filteredNodes)
    trace('special node\'s parent is: \n|XML BEGIN|' + filteredNode.parent()+'\n|XML END|');

//WITHOUGH E4X conditional
for each(var special:XML in xml2.node.node.*){
    if(special.@NAME.length()){
        if(special.@NAME == 'thisone')  trace('for each loop: ' + special.toXMLString() + ' \n parent is: \n|XML BEGIN|\n' + special.parent()+'\n|XML END|');
    }
}

есть довольно хорошее и легкое, чтобы следовать статье о E4X на страница Flash-разработчика Yahoo.

-121--3119841-

При использовании в скалярном контексте список вычисляет количество предметов в нем:

my @list = ('a', 'b', 'c');
my $list_size = @list;

Для выполнения явного теста, например, в условии if:

my @list = ('a', 'b', 'c');
if (scalar @list == 3) {
  print "@list"; # prints list separated with spaces
}

Это также будет работать без ключевого слова «scalar». Однако это может затруднить сканирование кода. Контекст - замечательная идея, но она требует от читателя большего объема работы. Использование скаляра в явном виде позволяет читателю сразу увидеть, что выполняется вычисление @ перечислять в скалярном контексте.

1
ответ дан 6 December 2019 в 10:00
поделиться

Как найти количество значений в списке Perl?

Назначьте список в переменную @array и получите размер @array, используя scalar(@array) или операцию $#array+1. Определите sub count {scalar @_} и используйте вызовы count, если вам приходится делать это часто.

my $n = () = ('a', 'b', 'c'); # $n = 3

Конечно, вы можете использовать это... если хотите, чтобы Perl и дальше имел дурную славу языка readonly... :(

1
ответ дан 6 December 2019 в 10:00
поделиться

In order to learn the size of array:

  1. Use scalar() to make it explicit (for array references you need to unrefer them via @{...}):

    $ perl -e '$n = scalar(qw(1 2 3)); print $n . "n"'
    3
    
  2. Use $# (add plus one to get the size):

    $ perl -e '$n = [ 1, 2, 3]; print $#$n . "n"'
    2
    $ perl -e 'print $#{[ 1, 2, 3]} . "n"'
    2
    

Perl: there are at least two ways to do it :)

-2
ответ дан 6 December 2019 в 10:00
поделиться

Вы также можете использовать следующий код, чтобы подсчитать количество элементов в массиве или списке

use strict;
use warnings;
my @array=(1,2,3,4);
my $i=0;
  foreach(@array)
  {
              $i++;
  }   
 print "The count is:$i\n";
1
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: