【问题标题】:perl can't use undefined value as HASH referenceperl 不能使用未定义的值作为 HASH 引用
【发布时间】:2014-08-25 14:28:17
【问题描述】:

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

#!/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,
}; 

【问题讨论】:

  • 当你运行脚本时,将什么作为参数传递给脚本?
  • 我还没有到达那里 - 一旦我开始传递参数,错误/警告就会消失?
  • 通常@_ 数组包含传递给子例程的参数。由于这不在子程序中,因此可能是错误的原因。尝试将 @_ 更改为 @ARGV,然后传递正确的参数。
  • 是的 - 真的很想知道它是什么 - 它是子程序数组。
  • 该程序从未以您显示的形式编译,因此您没有重构它。你为什么不告诉我们它来自哪里以及你想要实现什么?尝试修复 24 行写得不好的代码真的不值得:你应该写一些遵循规范的新东西。

标签: perl hashmap


【解决方案1】:

您收到的警告是由于尝试将未定义的值取消引用为哈希而引起的。使用%{ } 完成作为散列的解引用,未定义的值是您使用@_[0] 获取的空数组切片(尽管当您检索数组的单个元素时您真正想要的是$ sigil,就像警告告诉你的那样)。 @_ 数组仅在子例程内部有用,其中包含调用子例程时使用的参数。

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

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

有关在命令行中为脚本提供的参数,请参阅perldoc perlvarperldoc -v '@ARGV' 中的@ARGV。但是,这可能不是您想要的。您正在重构的代码似乎已经删除了一个子例程,并且无法从命令行传递对脚本的硬引用。

【讨论】:

  • 优秀的逆向工程——这是子程序的一部分。
  • 我注释掉了我的 %extend_hash=%{@_[0]};和我的@error_array=@{@_[1]};他们不是警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多