Кто подскажет по Perl, что это за ошибочка?

12
DyaDya
На сайте с 11.04.2007
Offline
147
1102

Я в Perl не силён. Но вроде, ошибка не должна быть сложной для исправления.

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

Modification of non-creatable array value attempted, subscript -2094586600 at /perllib//FlyNet/Template.pm line 111.

В строке 111 вот такой код:


110 if ($op->[1]) {
111 @arg = reverse splice(@{$self->{stack}}, -($op->[1]*2));
112 }

Подскажите, пожалуйста, что за косяк? Прикол в том, что недавно всё работало и без проблем. А потом, раз и перестало). На сайте в коде ничего никто не правил. Может хостер что-то в настройках сервера мог изменить. Но что могло так повлиять, не пойму.

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
[umka]
На сайте с 25.05.2008
Offline
456
#1

Вылезаете за границы массива.

Проверьте, сколько в нём элементов, и чему при этом равно $op->[1]*2

Так же, возможно, не существует $op->[1]

Лог в помощь!
DyaDya
На сайте с 11.04.2007
Offline
147
#2
[umka:
]Вылезаете за границы массива.

Подскажите, а как-то помягче можно настроить Perl, чтобы не ругался так фатально? А то, страницу сразу вырубает, чуть ли не 500-я). Помню из детства, что какие-то настройки повышают строгость перла к ошибкам...

Совсем недавно такой ошибки же не было на сайте(.

[umka]
На сайте с 25.05.2008
Offline
456
#3
DyaDya:
Совсем недавно такой ошибки же не было на сайте(.

Видимо, до этого функциям скарьливались другие массивы.

Тут вам поможет проверка значений и обработка исключений.

rtyug
На сайте с 13.05.2009
Offline
263
#4

ты хочешь удалить с массива @{$self->{stack} -2094586600 элементов, которых скорее всего нету...

может такое условие поможет:

     @arg = reverse splice(@{$self->{stack}}, -($op->[1]*2)) if $self->{stack}->[-1] > $op->[1]*2);

...скорее всего вы что-то напутали... может быть конфиг или что-то еще... за грани массива вылазите...

Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
DyaDya
На сайте с 11.04.2007
Offline
147
#5

rtyug,

@arg = reverse splice(@{$self->{stack}}, -($op->[1]*2)) if $self->{stack}->[-1] > $op->[1]*2);

Тут где-то ошибочка со скобкой, похоже. 500-ю сервер даёт.

rtyug
На сайте с 13.05.2009
Offline
263
#6

($op->[1]*2);

@arg = reverse splice(@{$self->{stack}}, -($op->[1]*2)) if $self->{stack}->[-1] > ($op->[1]*2);

в самый вверх можешь добавить:

use CGI::Carp qw(fatalsToBrowser);
DyaDya
На сайте с 11.04.2007
Offline
147
#7

rtyug,

use Carp;

там в коде вверху уже вызывается. Или ваш тоже добавить?

DyaDya добавил 15.09.2010 в 16:23

И на вашу строчку

@arg = reverse splice(@{$self->{stack}}, -($op->[1]*2)) if $self->{stack}->[-1] > ($op->[1]*2);

сразу ругается так:


Undefined subroutine AIPM::Method::
at /perllib//FlyNet/Template.pm line 137

В 137-й строке:

137 push(@{$self->{stack}}, $self->{meth}->$sub($self, \%arg));

DyaDya добавил 15.09.2010 в 16:31

И я что-то не пойму, почему второй параметр в splice, с минусом? Так можно?

rtyug
На сайте с 13.05.2009
Offline
263
#8

тогда верните обратно...

скорее всего вы что-то перепутали когда переносили (конфиг ит.д.)... или в админке что-то перепутали... и по этому массив маленький или пустой... и т.д.

можете попробовать, так ради интереса, добавить посмотреть что внутри в $self->{stack};:

     if ($op->[1]) { 

print"Content-type:text/html\n\n";

use Data::Dumper;
print Dumper $self->{stack};
return;
@arg = reverse splice(@{$self->{stack}}, -($op->[1]*2));
}

вообще, надо смотреть....

rtyug добавил 15.09.2010 в 16:38

а сайт вообще рабоатет?

DyaDya
На сайте с 11.04.2007
Offline
147
#9

сайт работает)

DyaDya добавил 15.09.2010 в 16:42

Там ниже строки с ошибкой, есть код типа



if ($op->[1]) {
# @arg = reverse splice(@{$self->{stack}}, -($op->[1]*2)) if $self->{stack}->[-1] > ($op->[1]*2);
@arg = reverse splice(@{$self->{stack}}, -($op->[1]*2));
}
if ($op->[2]) {
push(@arg, "goto", $op->[2]);
}
while (my ($k, $v) = splice(@arg, 0, 2)) {
if (exists($arg{$k}) && !ref($arg{$k})) {
$arg{$k} = [$arg{$k}];
unshift(@{$arg{$k}}, $v);
} elsif (!exists($arg{$k})) {
$arg{$k} = $v;
} else {
unshift(@{$arg{$k}}, $v);
}
}
print STDERR "$self->{ip}:$sub($op->[1])\n" if $DOP;
push(@{$self->{stack}}, $self->{meth}->$sub($self, \%arg));

Так я перед строкой с ошибкой сделал return и вроде всё нормально пока работает). Косяков пока не видно. Нафиг он тогда там был нужен? Хотя на вид, что-то умное написано.

DyaDya добавил 15.09.2010 в 17:27

Не, пришлось вернуть комменты). А то меню на сайте пропадало).

_vb_
На сайте с 25.07.2009
Offline
104
#10

Я думаю, лучше посмотреть не в /perllib//FlyNet/Template.pm, а на тот код, который эту либу использует. Наверняка там собака порылась.

Саратовская фракция серча (). Давайте посчитаемся.
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий