请教:关于"Use of uninitialized value"

大家好,我最近在写Perl程序的时候遇到一个问题。这里写了一小段代码用来验证,麻烦请教一下,谢谢!
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my @array = qw/ file1 file2 /;  #定义两个文件
  4. foreach (@array) {
  5.         open FILE, "< $_" or die $!;  #使用默认控制变量"$_"
  6.         while (<FILE>) {
  7.                 print;  #输出文件的每一行
  8.         }
  9. }
  10. print "@array\n";  #打印文件列表
复制代码
执行程序,运行到最后提示:"Use of uninitialized value in join or string at a.pl line 10, <FILE> line 2."
根据提示是@array数组没定义,后来尝试换一种写法就可以通过。
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my @array = qw/ file1 file2 /;  #定义两个文件
  4. my $file;  #定义控制变量
  5. foreach $file (@array) {
  6.         open FILE, "< $file" or die $!;  #使用自定义控制变量"$file"
  7.         while (<FILE>) {
  8.                 print;  #输出文件的每一行
  9.         }
  10. }
  11. print "@array\n";  #打印文件列表
复制代码
我个人的理解是,执行while循环的时候,Perl会保留foreach循环的"$_"变量的值,当while结束的时候还原"$_"变量。
为什么提示"Use of uninitialized value",麻烦请教一下,谢谢!

作者: hrbeu06ws   发布时间: 2011-05-28

$_是全局变量,最后@array = ( undef, undef );

作者: yybmsrs   发布时间: 2011-05-28



QUOTE:
$_是全局变量,最后@array = ( undef, undef );
yybmsrs 发表于 2011-05-28 11:40



"$_"虽说是全局变量,但Perl不是会保留其原先的值,然后再还原么?
@array为何到最后变成undef了呢?

作者: hrbeu06ws   发布时间: 2011-05-28

foreach里面有$_,while里面也有$_,都是同一个$_,怎么保留和还原呢?

while读文件时读到eof后,会继续读直到失败退出,这个值就是undef

作者: yybmsrs   发布时间: 2011-05-28

我记得前几天有个一模一样的问题

作者: zhlong8   发布时间: 2011-05-28