Почему Perl жалуется на «Не могу изменить постоянный элемент в скалярном присваивании»? - PullRequest
2 голосов
/ 18 мая 2010

У меня есть эта подпрограмма 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_obj",

Ответы [ 3 ]

11 голосов
/ 18 мая 2010

Так как вы не используете "толстую запятую" (=>), ваши имена подчеркивания слева не получают в автоматическом кавычке и, следовательно, без сигил ('$', * 1004) * или '%'), они могут быть только именами подпрограмм . Поскольку вы не объявили эти подпрограммы, Perl принимает их за константы и говорит вам, что вы не можете присваивать константы (или суб-вызовы).

Правильное решение состоит в том, чтобы изменить ваши назначения в двойные стрелки

_ldap => $ldap_obj, #...

Кроме того, пост Брэда напоминает мне, что даже если они были автоматически заключены в кавычки, вы не можете присвоить лексику буквальной строке, даже если Perl интерпретирует ее как строку с автоматически заключенными в кавычки.

10 голосов
/ 18 мая 2010

Я думаю, ваш код должен быть;

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

2 голосов
/ 18 мая 2010

Хэш - это просто список пар ключ-значение. Существует синтаксическая конструкция, которая помогает отличать ключи от значений. Он известен как «жирная стрела» =>. Эта конструкция приводит аргумент левой руки в строку, а затем преобразуется в простую запятую.


Вот что вы хотели написать:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...