2013-11-24 2 views
8

В моем последнем вопросе здесь @amon дал an great answer. Однако он также сказал:

Прежде всего, не делайте my $foo = $x if $y. Вы получаете неожиданный и неопределенное поведение, поэтому лучше избегать этого синтаксиса.

Поскольку вышеназванные конструкции я вижу в действительно много источников в CPAN, я задаюсь вопросом, как, когда, где может быть неправильным. (Некоторый пример кода будет приятным). Также интересно, почему perl позволяет это, если это плохо.

+0

Можете ли вы привести примеры таких модулей? –

+2

@mpapec: попробуйте найти на http://grep.cpan.me –

+0

http://www.stackoverflow.com/questions/2161111 – daxim

ответ

11

Его формулировка на самом деле была немного слабее. Эта формулировка на самом деле моя. Начнем с documentation: (курсив в оригинале)

Примечание: Поведение my, state или our модифицирована с модификатором утверждение условной или петлевой конструкции (например, my $x if ...) является неопределенным , Значение переменной my может быть undef, любое ранее присвоенное значение или, возможно, что-либо еще. Не полагайтесь на это. Будущие версии perl могут сделать что-то отличное от версии perl, которую вы попробуете. Здесь будут драконы.

Чтобы быть более точным, проблема заключается в использовании лексической переменной, если ее my может и не выполняться.

Рассмотрим:

# Usage: 
# f($x) # Store a value 
# f() # Fetch and clear the stored value 

sub f { 
    my $x if [email protected]_; 
    if (@_) { 
     $x = $_[0]; 
    } else { 
     return $x; 
    } 
} 

f('abc'); 
say "<", f(), ">" # abc 

Это, очевидно, не документированы поведение my.

Поскольку вышеназванные конструкции я вижу в очень многих источниках в CPAN

Этот код ошибки.

+0

Интересно, следует ли рассматривать поведение perl как проблемное (скажем, багги) здесь и perl должен быть исправлен (т.е. для анализа такого кода, как 'my $ foo; $ foo = $ x, если $ y'). –

+0

@Slaven Rezic, Рассмотрим 'my $ x = $ x if ...;' – ikegami

+0

@Slaven Rezic, Честно говоря, 'my $ x = ... if ...; ... $ x ... 'просто не имеет смысла. – ikegami

Смежные вопросы