perl不能使用未定义的值作为HASH引用

时间:2014-08-25 01:58:27

标签: perl hashmap

我正在重构这个脚本,我真的不明白我得到的错误。

#!/sbcd/GSD/scripts/perl/bin/perl
use DBI ;
use strict ;
use warnings;
use Data::Dumper;
my $dbUser = 'foo_01';
my $dbPass = 'foo_01';
my $dbSid  = 'foo.WORLD';
my $dbh =  DBI->connect("dbi:Oracle:$dbSid","$dbUser","$dbPass") or die( "Couldn't connect: $!" );
my %extend_hash=%{@_[0]};
my @error_array=@{@_[1]};
my @queries_array=();
my %spec_hash=();
my $query = "select e_risk_symbol from gsd_etds where level_name='EXCH_CS' and e_exch_dest='XISX' and e_symbol_comment in ('Bin_6','Bin_56')";

if(!$dbh) { 
    print "Error connecting to DataBase; $DBI::errstr\n"; 
}
    my $cur_msg = $dbh->prepare($query) or die "\n\nCould not prepare statement: ".$dbh->errstr;
    $cur_msg->execute();
    while (my @row=$cur_msg->fetchrow_array) {
         $spec_hash{'XISX'}{$row[0]}=1;
     }
print Dumper(%spec_hash);

这些是错误: 我特别不明白不能使用未定义的值作为HASH参考

walt $ ./pure_extend_database
Scalar value @_[0] better written as $_[0] at ./pure_extend_database line 11.
Scalar value @_[1] better written as $_[1] at ./pure_extend_database line 12.
Can't use an undefined value as a HASH reference at ./pure_extend_database line 11.

这是我在警告和严格时所得到的;

$VAR1 = 'XISX';
$VAR2 = {
          'FCEL' => 1,
          'GPS' => 1,
          'MCO' => 1,
          'DPZ' => 1,
          'WM' => 1,
          'SPLS' => 1,
          'ILMN' => 1,
          'BWLD' => 1,
          'CTSH' => 1,
          'EWU' => 1,
          'MDVN' => 1,
          'PDCO' => 1,
}; 

1 个答案:

答案 0 :(得分:2)

您尝试将未定义的值取消引用为哈希值会导致您收到警告。作为哈希的解除引用是使用%{ }完成的,未定义的值是您使用@_[0]执行的空数组切片(尽管在检索数组的单个元素时您实际需要的是{ {1}} sigil,就像警告告诉你的那样)。 $数组仅在子例程中有用,其中包含调用子例程的参数。

有关Perl中引用的介绍,请参阅perldoc perlreftut

有关特定警告的说明,请参阅perldoc perldiag,或在脚本中添加use diagnostics;以启用详细警告。

有关命令行中脚本的参数,请参阅perldoc perlvar@_中的@ARGV。然而,这可能不是你想要的;你重构的代码似乎有一个你删除的子程序,并且没有办法从命令行传递对脚本的硬引用。