我有一个数组,用于分配包含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";
}
}
但这没用。
任何帮助表示赞赏
答案 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}
(城市间状态);有了精心选择的变量名,很明显这代表什么。但这不是任何形式的“规则”,并且也使用复数形式(“状态”而不是“状态”)。