我正在重构这个脚本,我真的不明白我得到的错误。
#!/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,
};
答案 0 :(得分:2)
您尝试将未定义的值取消引用为哈希值会导致您收到警告。作为哈希的解除引用是使用%{ }
完成的,未定义的值是您使用@_[0]
执行的空数组切片(尽管在检索数组的单个元素时您实际需要的是{ {1}} sigil,就像警告告诉你的那样)。 $
数组仅在子例程中有用,其中包含调用子例程的参数。
有关Perl中引用的介绍,请参阅perldoc perlreftut
。
有关特定警告的说明,请参阅perldoc perldiag
,或在脚本中添加use diagnostics;
以启用详细警告。
有关命令行中脚本的参数,请参阅perldoc perlvar
或@_
中的@ARGV
。然而,这可能不是你想要的;你重构的代码似乎有一个你删除的子程序,并且没有办法从命令行传递对脚本的硬引用。