我试图编写一个程序,其中perl打开一个文件,但如果该文件不存在或由于某种原因无法打开,则会回退到另一个文件.相关的是:
打开(我的$fh,“<”,“/ path / to / file”)或打开(我的$fh,“/ path / to / alternate / file”)或死 最终,我发现: 打开(我的$fh,“/ path / to / file”)或打开($fh,“/ path / to / alternate / file”)或死亡 工作.这两个陈述之间有什么区别,为什么不是第一个工作,第二个是正确的方法,或者还有一些问题吗? 编辑:如果重要,我使用perl 5.12,并且第一个在“/ path / to / file”存在的情况下失败.我倾向于如果第一次打开成功,第二次打开不应该运行,那么为什么$fh会被第二次打开?
解决方法
我声明了一个变量.如果在同一范围内使用两次相同的名称,稍后会提到它将是第二个,而不是第一个.你的代码将触发一个“my”变量…在同一语句中屏蔽早期声明警告(如果你应该启用警告.)所以如果第一次打开成功,它会设置一个后来无法访问的$fh变量,并且第二个变量保留在未记录的未定义状态,因为它的声明实际上并未执行. (参见
perldoc perlsyn中的“这里是龙”警告,并认识到A或B等同于B,除非A.)
你的“工作”代码也被破坏了;当我返回新声明的变量(可以设置)时,词法的范围(后面提到它的变量找到变量)实际上直到下面的语句才开始.所以你的第一个$fh是将在后面的行中访问的词法,但第二个实际上是一个全局变量(或者如果你正在使用严格的则应该是错误).
正确的代码是:
my $fh; open $fh,... or open $fh,...;