perl - Perl 变量作用域在严格模式下的 while 循环中如何工作?

标签 perl scope

我对 Perl 很陌生,我对它的变量作用域的工作原理感到困惑。 我正在尝试根据 MySQL 查询的结果创建一个哈希数组。

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

  my %hash = ();

  while (my %hash = %{$qhand->fetchrow_hashref()} ) {
    push(@results, {%hash});
  }

但是当启用严格时,会产生以下错误:

无法在 [文件名] 第 XX 行(while 语句的行)使用未定义的值作为 HASH 引用。

有人可以告诉我我做错了什么以及我所炫耀的严格的相应规则是什么吗?

最佳答案

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

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

while( my $href = $qhand->fetchrow_hashref ) {
  push @results, $href;
  }

而且,如果您只想获取所有结果作为哈希引用,可以使用 DBI 方法,这样您就可以跳过 while 循环:

my $results_array_ref = $qhand->fetchall_arrayref( {} );

关于perl - Perl 变量作用域在严格模式下的 while 循环中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3884076/

相关文章:

perl - 如何以编程方式确定终端窗口的字符尺寸?

c - 在 C 中重新声明 typedef

scope - 通过 <phingcall> 调用的目标不会在调用目标中设置属性

javascript - “PHP 开发人员的 JavaScript -> 内置 API -> 全局对象”: cannot reproduce code in browser

linux - 访问perl中的默认目录

ruby - 如何计算 Linux 机器接收 ICMP 请求的频率?

regex - Perl 中的正则表达式

perl - 在 Perl 下使用 Selenium 进行测试时如何制作漂亮的报告?

c++ - 返回指向局部变量的指针?? (警告 C4172)

C - 限制结构范围