perl
  • ldap
  • 2010-05-18 42 views 2 likes 
    2

    我有这个Perl子,是造成一个问题:为什么Perl抱怨“无法修改标量赋值中的常量项目”?

    sub new 
    { 
        my $class = shift; 
    
        my $ldap_obj = Net::LDAP->new('test.company.com') or die "[email protected]"; 
    
        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_obj”,

    +0

    哪一条是12号线? – Space 2010-05-18 08:33:56

    +0

    _ldap = $ ldap_obj, – joe 2010-05-18 08:47:46

    +0

    'use strict;使用警告;' – Ether 2010-05-18 16:09:38

    回答

    9

    我认为你的代码应该是;

    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

    11

    尝试(=>),在左边的下划线的名字都没有得到auto-quoted因而不印记( '$','@''%'),它们只能是子程序名称。由于您尚未声明这些子文件,因此perl会将它们作为常量使用,并告诉您无法将其分配给常量(或子调用)。

    正确的解决方法是改变你的任务变成双箭头

    _ldap => $ldap_obj, #... 
    

    此外,布拉德的帖子提醒我,即使他们是自动报价,你不能指定一个词法到一个文本字符串,甚至如果perl将其解释为自动引用的字符串。

    2

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


    这是你的意思写:

    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程序。

    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 
    

    最后一个例子说明,为什么你还应该use strict

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

    我应该尝试使用它之前已经宣布$s

    perl -w -Mstrict -MO=Deparse -e'my $s = { a => 1 }' 
    
     
    BEGIN { $^W = 1; } 
    use strict 'refs'; 
    my $s = {'a', 1}; 
    -e syntax OK 
    

    这就是为什么我总是下手了我的Perl程序:

    use strict; 
    use warnings; 
    
    相关问题