Вставить значение пары ключ-значение в массив - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть массив, который присваивает значения из CSV-файла, который состоит из 3 столбцов

CSV-файл:

Name,Age,City
Joe,30,NYC
Mary,32,Washington
.
.
.
n number of lines

, поэтому я передаю это в свой Perl-скрипт и назначаю эти переменные

($name,$age,$city) = split(",",$_,3);
push @array, "$name,$age,$city";

Однако у меня есть пара значений ключа в 2 хешах, которые я хочу вставить в этот массив.

это хеш

%hash  = ('NYC' => NYC, 'Washington' => Virginia, and so on)
%hash2 = ('NYC' => US, 'Washington' => US, 'London' => UK, and so on)

Я хочудобавить еще 2 столбца, State и Country в мой массив, чтобы он выглядел как

Name,Age,City,State,Country
Joe,30,NYC,NY,US
Mary,32,Washington,Virginia,US
.
.
.
n number of lines

Я пытался с оператором switch

 switch($city){
            case "NYC"         {$state = "NY"; $country = "US";
                       push @array, "$name,$age,$city,$state,$country";
                               }
               }

Но это не сработало.

Любая помощь приветствуется

1 Ответ

0 голосов
/ 30 ноября 2018

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

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} (штат для города);с правильно подобранными именами переменных очевидно, что это означает.Но это не «правило» любого рода, и множественное число используется так же хорошо («состояния» вместо «состояния»).

...