Perl变量作用域如何在严格模式下循环工作?

jam*_*iei 2 perl scope

我是Perl的新手,我对其变量范围的工作原理感到困惑.我正在尝试从MySQL查询的结果创建一个Hashes数组.

以下代码按预期工作,使用严格

  my %hash = ();

  while (my %hash = %{$qhand->fetchrow_hashref()} ) {
    push(@results, {%hash});
  }
Run Code Online (Sandbox Code Playgroud)

但是当启用strict时会产生以下错误:

不能在[filename]第XX行(while语句的行)中使用未定义的值作为HASH引用.

有人能告诉我,我做错了什么,严格的相应规则是什么,我是炫耀吗?

bri*_*foy 8

你违反了严格refs部分.当您尝试使用非引用值作为引用时,Perl想要创建一个"符号引用",这通常不是您想要的,尽管它默默地继续程序(可能不是"工作",而是继续).通过启用限制,您可以捕获这些情况.

在您的示例和Jonathan的回答中,看起来您正在做很多杂技来撤消哈希引用,只是为了再次使它们成为哈希引用.您是否有理由不将其作为哈希引用?

while( my $href = $qhand->fetchrow_hashref ) {
  push @results, $href;
  }
Run Code Online (Sandbox Code Playgroud)

并且,如果您只想将所有结果作为哈希引用,那么有一个DBI方法,因此您可以跳过while循环:

my $results_array_ref = $qhand->fetchall_arrayref( {} );
Run Code Online (Sandbox Code Playgroud)

  • 复制hashrefs的原因可能是他用`fetchrow_arrayref`混淆了`fetchrow_hashref`.后者不断返回_same_ arraryref,所以你不能只将它们推到一个数组上,否则你将拥有最后一行的N个副本.但是`fetchrow_hashref`被记录为每次都返回一个新的hashref,所以这不是问题. (2认同)