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

时间:2018-11-29 22:06:11

标签: arrays perl hash switch-statement

我有一个数组,用于分配包含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)

我想在数组中再添加2列,即“州”和“国家/地区”,这样最终看起来就像

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 :(得分:1)

首先,要放在数组上的是一个字符串,所有字符串都用双引号引起来。这很可能就是您要执行的操作,但我想一次完成此步骤。

push带有一个列表,因此您可以仅列出要添加的所有变量,在这种情况下,根本不需要引用。要添加“州”和“国家/地区”,只需从键$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,这恰恰是哈希的目的,它可以将值与键相关联,以便可以直接从键中检索该值。 / p>


我想补充一下,如何以更有意义的方式命名这些哈希?

例如

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}(城市间状态);有了精心选择的变量名,很明显这代表什么。但这不是任何形式的“规则”,并且也使用复数形式(“状态”而不是“状态”)。