我的输入文件有百分比曝光,我只读取最高值。
我一直收到错误
匿名哈希中奇数个元素
和
在使用“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" );
}
答案 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是一个很好的起点。