后备打开文件Perl

Chr*_*ris 7 perl scope

我试图编写一个程序,其中perl打开一个文件,但如果该文件不存在或由于某种原因无法打开,则会回退到另一个文件.相关的是:

open(my $fh,"<","/path/to/file") or open (my $fh,"<","/path/to/alternate/file") or die

最终,我发现:

open(my $fh,"<","/path/to/file") or open ($fh,"<","/path/to/alternate/file") or die

工作.这两个陈述之间有什么区别,为什么不是第一个工作,第二个是正确的方法,或者还有一些问题吗?

编辑:如果重要,我正在使用perl 5.12,第一个在"/path/to/file"存在的情况下失败.我倾向于open如果第一次打开成功,第二次不应该运行,那么为什么$fh被第二次打开?

yst*_*sth 9

我声明了一个变量.如果在相同的范围内使用两次相同的名称,稍后会提到它将是第二个,而不是第一个.您的代码将触发"my" variable ... masks earlier declaration in the same statement警告(如果您应该启用警告.)因此,如果第一次打开成功,它将设置一个$fh以后无法访问的变量,并且第二个变量保留在未记录的未定义状态,因为它的声明实际上没有被执行.(参见perldoc perlsyn中的"Here be dragons"警告,并意识到这A or B相当于B unless A.)

你的"工作"代码也被破坏了; while my返回新声明的变量,然后可以设置,词法的范围(后面提到它的变量找到变量)实际上直到下面的语句才开始.所以你的第一个$fh是将在后面的行上访问的词法,但第二个实际上是一个全局变量(或者如果你正在使用严格的则应该是错误).

正确的代码是:

my $fh;
open $fh, ... or open $fh, ...;
Run Code Online (Sandbox Code Playgroud)