无法通过包 <file name> 错误定位对象方法 <var name>

Can't locate object method <var name> via package <file name> error

# Object.pm
sub update {
  $table = $self->DB_TABLE;
...
}

update 函数在更新值时被触发,并且似乎被其他文件多次执行,其相关部分如下所示:

# Status.pm
use constant DB_TABLE => 'Status';
# Flag.pm
use constant DB_TABLE => 'flag';

我不知道这个项目的内部工作原理,但修改了 Flag.pmObject.pm 如下,因为我需要使用不同的 table 来更新 flag.

# Flag.pm
use constant DB_TABLE => 'flag';
use constnat DB_UPDATE_TABLE => '<Table to use when updating flag>';
# Object.pm
sub update {
    my $table = undef;
    if($self->DB_UPDATE_TABLE) {
      $table = $self->DB_UPDATE_TABLE;
    } else {
      $table = $self->DB_TABLE; 
    }
}

当我触发sub update时,我得到

Can't locate object method "DB_UPDATE_TABLE" via package "<Status.pm>" at Object.pm.

有什么方法可以检查每个文件中是否存在 DB_UPDATE_TABLE 而不会出错?我可以将以下行添加到 Status.pm,但是有很多文件,例如 Status.pm.

use constant DB_UPDATE_TABLE => '';

我不知道为什么它是 $self->DB_TABLE 而不是 $self->{DB_TABLE} 但假设它是一种方法...尝试了以下方法,但它也有自己的错误。

    if( my $ref = eval { $self->can( DB_UPDATE_TABLE ) } ) {
      $table = $self->DB_UPDATE_TABLE;
    } else {
      $table = $self->DB_TABLE; 
    }
Bareword "DB_UPDATE_TABLE" not allowed while "strict subs" in use at Object.pm => I couldn't find the part to set 'strict subs'

超级近!

$self->can( DB_UPDATE_TABLE )

应该是

$self->can("DB_UPDATE_TABLE")