在Perl中,如何以键和值的形式读取文件并以%hash的形式保存文件的整个内容?

ssh*_*rma 0 perl hash key-value readfile

嗨,我是Perl编程的新手.我正在尝试读取一个.csv由逗号分隔的2个字段的文件.

我想以密钥及其值的形式将文件的所有数据放入哈希.

我的输入文件是

数据

2.8, gitu

2.5,  Has


2.7  Hwait

3.1-weiity

4.2,  city

2.7:query

4.9,  city

16.2,  play

6.2,  game

7,,,8 Jami

4.0,  city

此行代码不会打印输入文件中存在的所有有效数据.有效数据采用行开头的形式,数字之间有逗号,然后是名称.否则应忽略其他无效条目.当我打印时,它会跳过几个有效的条目显示%hashforHighMagnitude; 请告诉我我在哪里丢失?如何获得所有有效条目%hashforHighMagnitude;

我想这样做

open ( OF, "$inputFile") or die "Cant open input file: $!\n";
while ( $Line =<OF>) {

    if($Line =~ /^\d+\.+\d*\s*,\s*\w+$/g)              
    {
        ( my $magnitude, my $place ) = split(/,/,$Line);

        $hashforHighMagnitude{$place} = $magnitude;
        $hash{$place}++;
    }
    else
    {
        next;
    }
}

print %hashforHighMagnitude;

close(OF);
Run Code Online (Sandbox Code Playgroud)

输出应该是

2.8, gitu

2.5,  Has

4.2,  city

4.9,  city

16.2,  play

6.2,  game

4.0,  city

Ala*_*avi 6

由于在解析CSV时存在边缘情况,因此应使用专用模块.一些值得考虑的模块是:

程序

#!/usr/bin/env perl

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new( { 'allow_whitespace' => 1 } )
  or die Text::CSV->error_diag;

while ( my $row = $csv->getline( \*DATA ) ) {
    if ( @$row == 2 ) {
        print join( ', ', @$row ), "\n";
    }
}

__DATA__
2.8, gitu
2.5,  Has
2.7  Hwait
3.1-weiity
4.2,  city
2.7:query
4.9,  city
16.2,  play
6.2,  game
7,,,8 Jami
4.0,  city
Run Code Online (Sandbox Code Playgroud)

产量

2.8, gitu
2.5, Has
4.2, city
4.9, city
16.2, play
6.2, game
4.0, city
Run Code Online (Sandbox Code Playgroud)