나는 오늘 그 교활한 작은 실수 중 하나를 디버깅하는 데 너무 많은 시간을 보냈다.
내가 한 일은 다음과 같습니다.
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my $test = new MyTest('test');
say $test->to_string for 1..3;
package MyTest;
sub new {
my $class = shift;
my $parm = shift;
return bless \$parm, $class;
}
sub to_string {
my $self = shift;
my $string = 'Hello!' if 0;
$string .= $$self;
return $string;
}
거짓 테스트로 인해는 my $string
평가되지 않습니다. (물론, 너무 많은 시간을 잃은 코드는 없었습니다 if 0
!)
컴파일러가 테스트가 거짓이라는 것을 모르지만 다음 줄에서 선언되지 않았을 수있는 변수를 사용하고 있다고 불평하면 안됩니까?
또한, 나는이 런타임 오류가 발생하는 기대하지만, perl
그냥 날 준다
test
testtest
testtesttest
오류가없는 이유는 무엇입니까? 버그입니까, 기능입니까?
my $foo;
새로운 var (같은 종류 Scalar* foo = new Scalar();
)를 할당한다고 가정 하지만 이는 매우 비효율적이므로 그렇게 구현되지 않습니다.
my
변수를 선언하는 컴파일 타임 효과가 있습니다. 이것은 효과적으로 그것을 만듭니다. 컴파일 타임에 발생하므로 if
. 평소와 같이 변수의 범위는 변수를 포함하는 블록 (곱슬)으로 지정됩니다.
my
범위 종료시 변수를 새로운 변수로 대체하기 위해 스택에 지시문을 배치하는 런타임 효과가 있습니다. (아무것도 그것에 대한 참조를 잡지 않으면 대신 지워집니다.) 이것은 건너 뛰는 것입니다.
선언 된 조건과 다른 조건에서 변수를 사용하는 것은 정의되지 않은 (허용되지 않는) 동작입니다.
어휘 범위의 영구 변수를 만들려는 경우
{
my $x = init();
sub foo {
... $x ...
}
}
또는
use feature qw( state ); # Require 5.10+
sub foo {
state $x = init(); # init() is only called the first time foo() is called.
... $x ...
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다