+ -
当前位置:首页 → 问答吧 → while modifier中不能声明变量

while modifier中不能声明变量

时间:2010-10-22

来源:互联网

刚回贴子的时候遇到了个错误,很出乎意料。测试代码如下
  1. use strict;
  2. use warnings;

  3. my %h = 1..10;
  4. while (my($k,$v) = each %h) {
  5.     print "$k\t$v\n";
  6. }
复制代码
  1. use strict;
  2. use warnings;

  3. my %h = 1..10;
  4. print "$k\t$v\n" while my($k,$v) = each %h;
复制代码
以前一直以为是一样的,可是第二个却是错误的。报 Global symbol $k $v require explicit package name
显然perl认为我没有声明这两个变量。我知道像 my $a = 32 if xxx; 这样的语句是行为是末定义的,文档上也说
modifier左侧不应该出现 my 变量的声明。可是这里的 while 的使用怎么着也不会产生误解啊。

请问各位在哪个文档里面看到这个的说明了吗?
还是说这属于个bug?
还是说这是 strict 内部实现机制的问题,必须在前面[程序文本的前面]声明变量?

作者: zhlong8   发布时间: 2010-10-22

本帖最后由 zhlong8 于 2010-10-22 11:55 编辑

想到了解释,不知道对不对。带modifier的语句也只是简单的语句,不形成BLOCK,所以也就不存在局部变量,左侧和右侧以及整个语句所处的scope其实是一样的。从这方面上讲它和 while () {} 是完全不一样的。

测试代码和其它modifier的测试说明声明的变量是在该语句所处的作用域内的,在Modifier右侧声明变量可以,但是要在下一条语句才可见。但是还是很郁闷,左侧见不到

作者: zhlong8   发布时间: 2010-10-22