Необъяснимо, Perl локальный my (массив) действует как глобальная переменная, грязная на последующих итерациях - PullRequest
0 голосов
/ 31 мая 2018

Просто хотите узнать, почему @b действует как глобальный и должен сбрасываться каждый раз при вызове подпрограммы.My (переменная) не должна длиться после процедуры, но она постоянна.Первая итерация работает, но последующие будут повреждены, если для цикла for не задано значение 0.

Кроме того, @b не отвечает на a;Печать Присоединиться ();@ Ь = (0) х @ $ а;отображение;или любые другие вызовы, ничего кроме прямого запроса $ b (#) и ничего больше.Разве не может быть трещина в доспехах Perl, не так ли?

Да, если я закомментирую 1-ю итерацию и цикл for, 2-я итерация работает, но последующие - нет.

sub firstDupe {
    my ($a) = @_;
    my @b;
    # need for next line inexplicable, @b acts like global, ideas?
    my $l = scalar(@{$a})+1; for ($i=0; $i < $l; $i++){ $b{$i}='0'; }
    for (@{$a}){
        return int($_) if $b{$_}++;
    }
    return -1;
}

my @pb= (2, 1, 3, 5, 3, 2);
$val=&firstDupe(\@pb);
my $ret="\nRet: $val";

@pb= (2, 4, 3, 5, 1);
$val=&firstDupe(\@pb);
$ret = $ret.", $val";

@pb= (1);
$val=&firstDupe(\@pb);
$ret = $ret.", $val";

@pb= (2,2);
$val=&firstDupe(\@pb);
$ret = $ret.", $val";

@pb= (2,1);
$val=&firstDupe(\@pb);
$ret = $ret.", $val";

print "\n\n$ret";
print "\nkey: 3, -1, -1, 2, -1\n";

1 Ответ

0 голосов
/ 31 мая 2018

Это потому, что у вас есть $b{$i} - то есть хеш %b, который никогда не объявляется (не делается лексическим).

Итак, он создан, прямо здесь, как глобальная переменная.

Это было бы невозможно при наличии use strict;.

Могу ли я рекомендовать всегда, всегда использовать эту прагму, и дажеболее того use warnings;.


Обратите внимание, что $a и $b не рекомендуются для имен переменных, поскольку эти конкретные имена имеют немного особенное положение, используемое sort.

Кроме того, вам не нужно это & перед вашими функциями.У него очень специфические свойства, которые здесь не вредят, но не нужны и не должны быть там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...