我试图编写一个程序,其中 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/

10-13 06:01