Perl为什么抱怨;Can';t修改标量赋值中的常量项“;?

Perl为什么抱怨;Can';t修改标量赋值中的常量项“;?,perl,ldap,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',

我有一个导致问题的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;
}
此代码有什么问题:


我遇到了这个错误,无法修改Core.pm第12行“$ldap\u obj”附近标量赋值中的常量项,我认为您的代码应该是

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',
};

更改它并尝试使用
$perl-c module.pm

,因为您没有使用“胖逗号”(=>),所以左侧的下划线名称不会显示,因此,如果没有符号(
'$'
'@'
'%'
),它们只能是子例程名称。由于您尚未声明这些子类,perl将它们作为常量,并告诉您不能分配给常量(或子调用)

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

_ldap => $ldap_obj, #...

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

散列只是键、值对的列表。有一个语法结构可以帮助区分键和值。它被称为“胖箭头”
=>
。此构造将左手参数强制转换为字符串,然后转换为简单的逗号


这就是你想写的:

perl -MO=Deparse -e'$s = { a => 1 }'
$s = {'a', 1}; -e syntax OK
perl -MO=Deparse -e'$s = { a = 1 }'
Can't modify constant item in scalar assignment at -e line 1, near "1 }" -e had compilation errors. $s = {'a' = 1};
perl -w -MO=Deparse -e'$s = { a = 1 }'
Unquoted string "a" may clash with future reserved word at -e line 1. Can't modify constant item in scalar assignment at -e line 1, near "1 }" -e had compilation errors. BEGIN { $^W = 1; } $s = {'a' = 1};
perl -w -MO=Deparse -e'$s = { a => 1 }'
Name "main::s" used only once: possible typo at -e line 1. BEGIN { $^W = 1; } my $s = {'a', 1}; -e syntax OK
perl -w -Mstrict -MO=Deparse -e'$s = { a => 1 }'
Global symbol "$s" requires explicit package name at -e line 1. -e had compilation errors. BEGIN { $^W = 1; } use strict 'refs'; ${'s'} = {'a', 1};
perl -w -Mstrict -MO=Deparse -e'my $s = { a => 1 }'
BEGIN { $^W = 1; } use strict 'refs'; my $s = {'a', 1}; -e syntax OK
use strict;
use warnings;