Во-первых, вы помещаете в массив одну строку со всеми, что находится в двойных кавычках.Это вполне может быть то, что вы намеревались сделать, но я бы хотел пройти этот шаг за раз.
push
берет список, так что вы можете просто перечислить все переменные для добавления, в этом случаецитирование вообще не нужно.Чтобы добавить «State» и «Country», просто извлеките значения из ваших хэшей для ключа $city
push @array, $name, $age, $city, $hash{$city}, $hash2{$city};
Но если этот массив предназначен для получения дополнительных записей, как их различать?Одним из способов является добавление ссылки на массив каждый раз, поэтому
push @array, [ $name, $age, $city, $hash{$city}, $hash2{$city} ];
, где фигурные скобки [ ]
создают анонимный массив и возвращают ссылку на него, который сам может быть элементом массива, поскольку он является скаляром.Поиск отдельных элементов невелик, так как вы должны индексировать его, например, $array[$index]->[0]
для имени (или сокращение $array[$index][0]
).Но если вам чаще всего нужны все из них, тогда все идеально: my @data = @{ $array[$index] };
Другой способ - вместо этого добавить ссылку на хеш, используя { }
, например, такой как
push @array, { name => $name, age => $age, city => $city,
state => $hash{$city}, country => $hash2{$city} };
* 1020.* где вы можете получить значения как
$array[$index]->{name}
(и т. д.).Это явно хорошо подходит для работы с отдельными компонентами.
Другой способ - действительно добавить строку для каждой записи;затем добавьте значения хеша в кавычки
push @array, "$name,$age,$city,$hash{$city},$hash2{$city}";
, поскольку значения хеш-функции можно вычислять внутри строки в двойных кавычках.
В любом случае нет необходимости включать $city
-это именно то, для чего нужен хеш, чтобы связать значение с ключом, чтобы затем можно было напрямую получить значение для ключа.
Я хотел бы добавить, как насчет именования этих хэшей вболее информативным образом?
Например,
my %state = (NYC => 'NY', Washington => 'Virginia'); # ...
my %country = (NYC => 'US', Washington => 'US', London => 'UK'); # ...
, и тогда у вас будет намного яснее
push @records, "$name,$age,$city,$state{$city},$country{$city}";
Я также изменил имя массива.
Примечание наименование.Я использовал соглашение, в котором имя хеша имеет форму единственного числа («штат», а не «штат») с обоснованием того, что оно относится к одному и названному элементу, $state{$city}
(штат для города);с правильно подобранными именами переменных очевидно, что это означает.Но это не «правило» любого рода, и множественное число используется так же хорошо («состояния» вместо «состояния»).