为什么mysql.pm中的全局变量不被声明为我们的?

new*_*erl 1 variables perl

引自mysql.pm:

   3 package DBD::mysql;
   4 use strict;
   ????
  17 $err = 0;>--# holds error code   for DBI::err
  18 $errstr = "";>--# holds error string for DBI::errstr
  19 $drh = undef;>--# holds driver handle once initialised
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我use warnings;使用这个模块的所有程序都没有给出任何警告.

为什么?

Dav*_*idO 8

在来源的第5行:

use vars qw(@ISA $VERSION $err $errstr $drh);
Run Code Online (Sandbox Code Playgroud)

请参阅使用vars文档.

这是我们在our介绍Perl 之前能够制作全局和严格共存的方法之一.虽然它现在被认为是"过时的"(根据文档),但它仍然存在于实际代码中.我猜在某些情况下它符合类别,"如果没有破坏,请不要修复它." 你找到了其中一个案例.


Eug*_*ash 6

这些变量vars在第5行使用pragma 预先声明:

use vars qw(@ISA $VERSION $err $errstr $drh);
Run Code Online (Sandbox Code Playgroud)

这就是为什么Perl尽管use strict生效仍然不抱怨的原因.