我试图编写一个程序,其中 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
会被第二个覆盖?
最佳答案
my 声明一个变量。如果您在同一范围内以相同的名称使用它两次,那么后面提到的将是第二次,而不是第一次。您的代码将触发 "my" variable ... masks earlier declaration in the same statement
警告(如果您按应有的方式启用警告。)因此,如果第一次打开成功,它会设置一个稍后无法访问的 $fh
变量,而第二个变量将处于未记录的未定义状态,因为它的声明实际上并没有被执行。 (请参阅 perldoc perlsyn 中的“这里是龙”警告,并意识到 A or B
等同于 B unless A
。)
您的“工作”代码也已损坏;虽然 my
返回新声明的变量,然后可以设置该变量,但词法的作用域(稍后提到它找到变量的地方)实际上直到以下语句才开始。所以你的第一个 $fh
是将在后面的行中访问的词法,但第二个实际上是一个全局变量(或者一个错误,如果你使用了严格的话)。
正确的代码是:
my $fh;
open $fh, ... or open $fh, ...;
关于perl - 后备打开文件 Perl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41007824/