0

我有一个输入文件

输入文件.txt

        name: George
         age: 5
      nature: curious
       likes: banana

这就是我所说的表单布局。我正在尝试将其转换为表格布局 CSV。例如:

name,age,nature,likes
George,5,curious,banana

因此,我读取了文件,拆分为“:和\n”并将值放入哈希中。然后将该散列推入一个数组,以便我稍后将它们取出。这是我到目前为止所做的。

#!/usr/bin/perl
use strict;

 open (MYFILE, 'inputfile.txt');
 my @records;
 while (<MYFILE>) {
        chomp;
        my %values = split(/[:\n]/,$_);
        push @records,%values;
 }
 close (MYFILE);

这样一来,我想@records={[name=George],[age=5],[nature=curious],[likes=banana]}会发生的。

现在,我如何从数组中取出每个散列@records?当我尝试类似的事情时:

 foreach my $record(@records){
     my %record = $record;
     for my $key(keys %record){
        print "key : $key\n";
     }
 }

它一个接一个地输出所有令牌,这与预期的不同(只是键)。

4

1 回答 1

5

我会以稍微不同的方式来做......

my (@values, @properties);
while (<DATA>) {
  if (/(\S*)\s*:\s*(\S*)/) {
    push @values, $1;
    push @properties, $2;
  }
}
print join ',', @values;
print "\n";
print join ',', @properties;
print "\n";
__DATA__
        name: George
         age: 5
      nature: curious
       likes: banana

...有两个原因。

首先,Perl 中的哈希是无序的,并且没有简单的方法可以将这些属性排序回其原始状态。在这些情况下,最好使用数组。

其次,使用正则表达式匹配而不是split允许更轻松地处理不良数据(在此代码中,模式非常简单,但很容易获得验证逻辑)。此外,所有数据块都被立即捕获;你不需要chomp额外改变它们。


说到你的原始代码:这一行......

push @records, %values;

...必须改写成...

push @records, \%values;

... 表示任何可用的东西。请记住,数组在 Perl 中是扁平的,当您尝试将散列推入数组时,它只会被转换为列表(然后此列表将附加到该数组)。

尽管如此,当您必须输出这样一个哈希数组时,您必须遍历其元素的键,然后遍历其元素的值:如果您只是单独存储它们,就像在我的代码中那样,那就没有必要了。

于 2012-09-26T16:23:50.657 回答