读取输入文件并创建新哈希

时间:2017-11-04 22:20:41

标签: perl

我的输入文件有百分比曝光,我只读取最高值。

我一直收到错误

  

匿名哈希中奇数个元素

  

在使用“strict refs”时,不能将字符串用作ARRAY引用

我试图强制将数字作为整数读入但是却没有变平。有什么建议?我想创建一个具有键和最高值的哈希。

    while ( <$DATA_FILE> ) {

        chomp;
        my @line_values = split( /,/, $_ );
        my $state_id    = $line_values[0];

        # skip header row
        next if ( $state_id eq $HEADER_VALUE );

        for ( @line_values ) {
            tr/%%//d
        };

        # assign data used as hash keys to variables
        my $var1 = int( $line_values[1] );
        my $var2 = int( $line_values[2] );

        if ( $var1 > $var2 ) {
            %report_data = ( { $state_id } => { \@$var1 } )
        }
        else {
            %report_data = ( { $state_id } => { \@$var2 } )
        }

    } # end while

    print \%report_data;

    # close file
    close( $DATA_FILE ) || printf( STDERR "Failed to close $file_path\n" );
}

2 个答案:

答案 0 :(得分:1)

很难确定输入和预期输出应该是什么,但猜测你的if ( $var1 > $var2 ) { $report_data{$state_id} = $var1; } else { $report_data{$state_id} = $var2; } 块应该是这样的

$report_data{$state_id} = $var1 > $var2 ? $var1 : $var2;

或者更简单地说

->

答案 1 :(得分:0)

这条线是罪魁祸首:

%report_data = ({$state_id} => {\@$var1})

{}创建一个hashref。你在这一行做了两个奇怪的事情:使用带有单个键的hashref($ state_id)作为%report_data中的键和带有单个键的{hash({1}}的hashref,它试图去除标量$ var1和在数组上下文中使用它(\@$var1),然后再次尝试将其转换为引用(我很困惑,难怪解释器也是如此))。

更有意义
@$var1

但是这会为您读取的每一行重置hash%report_data。 你想要的只是设置那个哈希的键,所以首先,在循环之前定义变量:

%report_data = ($state_id => $var1);

在你的while循环中,只需将一个键设置为一个值:

my %report_data = ();

最后,您正在尝试打印对哈希的引用,这没有多大意义。我建议一个简单的循环:

$report_data{ $state_id } = $var1; # or $var2

这会迭代哈希中的所有键,然后使用它们的值打印它们,并且看起来很容易阅读和理解,我希望。

一般情况下:除非您知道它们是如何工作的,否则不要尝试使用引用。它们不是你用你的代码解雇的神奇子弹,而且所有的问题都会出现问题;恰恰相反,他们可以成为你脚下最痛苦的子弹。但是,了解引用很有用,因为当你使用Perl进行更多工作时,你将需要它们。 perlreftut是一个很好的起点。