为什么Perl会抱怨"无法修改标量赋值中的常量项"?

joe*_*joe 2 perl ldap

我有这个导致问题的Perl子例程:

sub new
{
    my $class = shift;

    my $ldap_obj = Net::LDAP->new( 'test.company.com' ) or die "$@";

    my $self = {
                _ldap = $ldap_obj,
                _dn ='dc=users,dc=ldap,dc=company,dc=com',
                _dn_login = 'dc=login,dc=ldap,dc=company,dc=com',
                _description ='company',
                };

    # Print all the values just for clarification.
    bless $self, $class;

    return $self;
}
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题:

我收到此错误无法修改Core.pm第12行,"$ ldap_obj"附近的标量赋值中的常量项

Axe*_*man 11

既然你不使用"胖逗号"(=>),在左边的下划线的名字都没有得到自动报价,因此,无印记('$','@',或'%'),他们只能子程序名.由于你还没有声明这些subs,perl将它们作为常量,并告诉你不能分配给常量(或子调用).

正确的解决方法是将您的分配更改为双箭头

_ldap => $ldap_obj, #...
Run Code Online (Sandbox Code Playgroud)

另外,Brad的帖子提醒我,即使它们是自动引用的,你也不能将词法分配给文字字符串,即使perl将其解释为自动引用的字符串.


Spa*_*ace 10

我认为你的代码应该是;

my $self = {
                _ldap => $ldap_obj,
                _dn =>'dc=users,dc=ldap,dc=company,dc=com',
                _dn_login => 'dc=login,dc=ldap,dc=company,dc=com',
                _description =>'company',
};
Run Code Online (Sandbox Code Playgroud)

改变它并尝试 $perl -c module.pm