将哈希的键值对的值推入数组



我有一个数组,它从由3列组成的csv文件中分配值

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)

我想在我的数组中再添加两列,State和Country,这样它最终看起来像

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

我尝试了切换语句

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

但它不起作用。

感谢的任何帮助

首先,您在数组中放入的是一个包含双引号的单个字符串。这很可能是你想要做的,但我想一步一个脚印。

push采用一个列表,这样您就可以列出要添加的所有变量,在这种情况下根本不需要引用。要添加"State"one_answers"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} };

然后可以在其中检索值作为$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",而不是"states"(,其基本原理是它指的是一个单独的命名项目$state{$city}(城市的状态(;有了精心选择的变量名,很明显这代表了什么。但这不是任何形式的"规则",复数也可以使用("states"而不是"state"(。

最新更新