Тип данных Bag — новый тип данных, которого не было в Perl 5.
Его можно рассматривать как контейнер, который, с одной стороны, знает, сколько отдельных элементов в нем лежит, а с другой, может сказать, сколько там разных видов товара. Можно описать этот тип иначе: Bag это хеш, где по умолчанию значения для добавляемых ключей равны единице. Давайте разбираться на примерах.
Положим в сумку единицу и посмотрим, что про нее знает перл:
my $b1 = bag(1); say $b1.perl;
Программа печатает такой ответ:
(1=>1).Bag
То есть, у нас есть одна единица.
А если положить еще двоечку:
my $b2 = bag(1, 2); say $b2.perl;
Теперь там одна единица и одна двойка:
(1=>1,2=>1).Bag
ОК, а если добавить еще единицу?
my $b3 = bag(1, 2, 1); say $b3.perl;
Теперь их две:
(1=>2,2=>1).Bag
Отвлечемся на секунду: все показанные примеры можно записать и без скобок:
my $b1 = bag 1; my $b2 = bag 1, 2; my $b3 = bag 1, 2, 1;
Более типично, наверное, хранить не числа, а строки, например:
my $cars = bag <green black blue black white>;
Что можно узнать про содержимое переменной $cars?
Во-первых, какие там присутствуют цвета:
say $cars.keys; # (white blue black green)
Во-вторых, сколько, собственно, разных цветов:
say $cars.elems; # 4
Либо сколько разных объектов:
say $cars.total; # 5
Наконец, при создании объектов типа Bag допустимо использовать синтаксис, аналогичный тому, как создаются хеши (правда, скобок и кавычек избежать не удастся):
my $cars2 = bag('green' => 1, 'black' => 2, 'blue' => 1, 'white' => 1);