Почему Perl не предупреждает о переопределении переменной my () в той же области видимости? - PullRequest
0 голосов
/ 29 июня 2011
use strict;

my $world ="52";

my $in = "42" ;

my $world="42";

my $out = "good" ."good";

chop($out);

print $out;

Не беспокойтесь о коде. Вопрос в том, что я использовал my $world в двух разных строках, но компилятор не выдал ошибку, но если мы рассмотрим синтаксис языка C, то получим ошибку из-за переопределения переменной , Почему Perl не дает никаких ошибок для повторного объявления. У меня есть еще один вопрос: каков размер скалярной переменной?

Ответы [ 3 ]

11 голосов
/ 29 июня 2011

1 / Переопределение переменной не является ошибкой. Если бы вы включили «использовать предупреждения», вы бы получили предупреждение.

2 / Под "размером скалярной переменной" вы подразумеваете объем данных, которые он может хранить? В этом случае Perl не устанавливает произвольных ограничений.

Похоже, вы очень быстро публикуете множество довольно простых вопросов. Рассматривали ли вы чтение "Learning Perl" ?

5 голосов
/ 29 июня 2011

Вопрос в моем $ world, я использовал его в двух разных строках, но компилятор сказал, что нет ошибки, но c мы получаем ошибку как объявление переменной, но почему не в perl.

Просто потому, что Perl не является C, а переопределение переменной не является условием ошибки.

Это может быть причиной неожиданного поведения и может быть обнаружено, если у вас было use warnings; (как было предлагается вам раньше ).

Каков размер скалярной переменной?Есть ли какой-либо размер?

Определите «размер».Б?Персонажи?Что-то другое?Возможно, вы ищете длина

2 голосов
/ 29 июня 2011

Потому что Perl любит быть крепким.Если бы вы включили warnings, вы бы услышали об этом.

"my" variable $world masks earlier declaration in same scope at - line 7.

Хотя USUW (use strict; use warnings;) является хорошей практикой разработки, поэтому будет использовать autodie - , если Autodie беспокоится о синтаксических предупреждениях.Но следующая концепция примерно такая же, чтобы убедиться, что вы не избегаете никаких предупреждений.

BEGIN { $SIG{__WARN__} = sub { die @_; }; }

Приведенный выше код создает обработчик сигнала для предупреждений, который вместо этого просто умирает.Тем не менее, я думаю, что это лучше для новичка:

BEGIN {
    $SIG{__WARN__} 
        = sub { 
            eval { 
                # take me out of the chain, to avoid recursion
                delete $SIG{__WARN__};
                # diag will install the warn handler we want to use.    
                eval 'use diagnostics;';  
                $SIG{__WARN__}->( @_ ); # invoke that handler
            };
            exit 1; # exit regardless of errors that might have cropped up.
        }; 
}

В любом месте вы можете сказать Perl, что вы не заинтересованы в изменении кода для выдачи определенной категории предупреждений (и diagnostics будетскажу вам категорию!) и если вы явно укажете perl no warnings 'misc', он не только не предупредит вас, но и не вызовет обработчик предупреждений, который убивает программу.

Это даст вамболее c-like чувство - за исключением того, что у c тоже есть предупреждения (так что вы могли бы также реализовать лексический счетчик ... да ладно.)

...