Количество значений в списке может только быть определено путем итерации по его значениям или преобразования его в массив. Присвоение его к скаляру не возвратит количество объектов:
my $n = ('a', 'b', 'c'); # $n = 'c'
Существует "пустые круглые скобки" идиома, которая может использоваться для получения числа элементов:
my $n = () = ('a', 'b', 'c'); # $n = 3
Действительно ли это эквивалентно внутренне
my $n = @{[ 'a', 'b', 'c' ]};
?
Это интересная деталь реализации: Создает ли присвоение пустому списку (ненужный) анонимный массив?
На этот вопрос можно ответить двумя способами: Во-первых, Правильный путь: Попытайтесь выяснить, как с этим можно справиться в исходном коде. Есть ли особый случай присвоения пустому списку, оцениваемого в скалярном контексте?
Будучи ленивым и невежественным типом, я решил использовать 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 = () = .. .;
Два показанных вами предмета не эквивалентны. Но у них одинаковый конечный результат:
my $n = @{[ 'a', 'b', 'c' ]};
Здесь вы создаете анонимный массив ['a', 'b', 'c']
, затем разыменовываете его и берете количество членов. Создание массива обеспечивает контекст списка для операторов запятой в операторе.
my $n = () = ('a', 'b', 'c');
Здесь мы используем печально известный «оператор козла». Список ('a', 'b', 'c')
назначается пустому списку () = ('a', 'b', 'c');
. Результат назначения списка присваивается $ n
. Назначение списка возвращает количество элементов в правой части назначения в скалярном контексте (в контексте списка вы получаете список присвоенных значений).
Для достижения согласованного результата в перекрестном браузере обычно добавляется еще один div
внутри div
без явной ширины и поля
. Поле
будет имитировать заполнение
для внешнего раздела
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'));
... так как оператор назначения является правоассоциативным. Назначение списка в скобках справа само по себе находится в скалярном контексте, и поэтому его значением является количество элементов в правой части.
Вы могли сделать это 2 способами:
, Вот пример:
//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». Однако это может затруднить сканирование кода. Контекст - замечательная идея, но она требует от читателя большего объема работы. Использование скаляра в явном виде позволяет читателю сразу увидеть, что выполняется вычисление @ перечислять в скалярном контексте.
Как найти количество значений в списке Perl?
Назначьте список в переменную @array
и получите размер @array
, используя scalar(@array)
или операцию $#array+1
. Определите sub count {scalar @_}
и используйте вызовы count
, если вам приходится делать это часто.
my $n = () = ('a', 'b', 'c'); # $n = 3
Конечно, вы можете использовать это... если хотите, чтобы Perl и дальше имел дурную славу языка readonly... :(
In order to learn the size of array:
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
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 :)
Вы также можете использовать следующий код, чтобы подсчитать количество элементов в массиве или списке
use strict;
use warnings;
my @array=(1,2,3,4);
my $i=0;
foreach(@array)
{
$i++;
}
print "The count is:$i\n";