왜 Perl은 내가 변수를 엄격하게 선언했는지에 대해 신경 쓰지 않습니까?

scozy

나는 오늘 그 교활한 작은 실수 중 하나를 디버깅하는 데 너무 많은 시간을 보냈다.

내가 한 일은 다음과 같습니다.

#!/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

오류가없는 이유는 무엇입니까? 버그입니까, 기능입니까?

Ikegami

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

== 대신 =를 쓸 때 왜 경고가 표시되지 않습니까?

분류에서Dev

파이썬은 변수 재 선언에 대해 경고하지 않습니다

분류에서Dev

Amazon CloudFront가 변경되지 않은 정적 콘텐츠에 대해 304 (수정되지 않음)를 지속적으로 반환하지 않습니까?

분류에서Dev

왜 스칼라는 선언 할 수 없지만 정의되지 않은 변수는 자바가 할 수있는 반면에 정의되지 않았습니까?

분류에서Dev

왜 ** head를 함수로 보내는 것은 SLL을 반대로하고 * head가 C에서 작동하지 않습니까?

분류에서Dev

자동 변수가 설정되지 않은 경우 왜 쓰레기가 포함됩니까?

분류에서Dev

numpy append () 함수가 내 ndarray를 변경하지 않습니까?

분류에서Dev

사용하지 않는 변수에 대해 ESLint에서 오류 대신 경고를받을 수있는 방법은 무엇입니까?

분류에서Dev

왜? if 블록 내에서 변수를 캐스팅하지 않습니까?

분류에서Dev

AnalyticsReceiver-그게 무엇입니까? 그리고 왜 '수신자에게 권한이 필요하지 않습니다'경고가 발생합니까?

분류에서Dev

문자열 또는 정수에 대한 getHashCode ()가 고유하지 않은 경우 왜 사용합니까?

분류에서Dev

PHP에서 클래스가 선언되지 않은 경우 왜 "new"에서 오류가 발생하지 않습니까?

분류에서Dev

bind가 설정되지 않은 경우 왜`this`가 창 객체를 참조하지 않습니까?

분류에서Dev

연결 변경 수신기가 작동하지 않습니까?

분류에서Dev

Wildfly CLI-환경 변수 확인을 비활성화 하시겠습니까? ie 해결되지 않은 변수를 설정에 쓰기

분류에서Dev

printenv 명령은 내가 정의하지 않은 환경 변수를 어디에서 읽습니까?

분류에서Dev

내 파이썬 코드가 목록의 변수를 변경하고 있지만 어떻게 / 왜 변경되었는지 볼 수 없습니다.

분류에서Dev

내 함수가 큰 숫자에 대해 작동하지 않는 이유는 무엇이며 어떻게 변경할 수 있습니까?

분류에서Dev

왜 image2 muxer 옵션 frame_pts가 파일 이름에 대해 PTS를 생성하지 않고 대신 인덱스 번호입니까? 파일 이름으로 PTS를 어떻게 얻을 수 있습니까?

분류에서Dev

내가 int를 선언했지만 초기화하지 않았다고 가정 해 보겠습니다. 그것은 어떤 가치입니까? 누군가 나를 위해 이것을 해결할 수 있습니까?

분류에서Dev

ReferenceError 대신 undefined를 표시하는 선언되지 않은 개체 변수

분류에서Dev

일부 프로그램은 stderr 대신 stdout에 오류를 인쇄하고 $를 설정하지 않습니까? 오류가 발생할 때. 왜?

분류에서Dev

git commit 메시지가 명령문으로 쓰여진 경우 아직 수행되지 않은 작업을 어떻게 명확히 할 수 있습니까? '해싱을 추가하지 않음'또는 '해싱을 추가하지 않음 /하지 않음'?

분류에서Dev

git commit 메시지가 명령문으로 쓰여진 경우 아직 수행되지 않은 작업을 어떻게 명확히 할 수 있습니까? '해싱을 추가하지 않음'또는 '해싱을 추가하지 않음 /하지 않음'?

분류에서Dev

왜 이것이 작동하지 않습니까? -변수를 통해 .blit 사용

분류에서Dev

R에서 왜 이름이 '.'로 시작하는 변수를 사용합니까? 내 환경에 나타나지 않습니까?

분류에서Dev

왜 (.. getchar ())가 C에서 내 파일에 쓰지 않습니까?

분류에서Dev

전체 경로를 제공하는 대신 변수를 사용할 때 Breaklink가 작동하지 않습니다.

분류에서Dev

왜 내 chart.js가 로그로 변경 될 때 올바르게 플로팅되지 않습니까?

Related 관련 기사

  1. 1

    == 대신 =를 쓸 때 왜 경고가 표시되지 않습니까?

  2. 2

    파이썬은 변수 재 선언에 대해 경고하지 않습니다

  3. 3

    Amazon CloudFront가 변경되지 않은 정적 콘텐츠에 대해 304 (수정되지 않음)를 지속적으로 반환하지 않습니까?

  4. 4

    왜 스칼라는 선언 할 수 없지만 정의되지 않은 변수는 자바가 할 수있는 반면에 정의되지 않았습니까?

  5. 5

    왜 ** head를 함수로 보내는 것은 SLL을 반대로하고 * head가 C에서 작동하지 않습니까?

  6. 6

    자동 변수가 설정되지 않은 경우 왜 쓰레기가 포함됩니까?

  7. 7

    numpy append () 함수가 내 ndarray를 변경하지 않습니까?

  8. 8

    사용하지 않는 변수에 대해 ESLint에서 오류 대신 경고를받을 수있는 방법은 무엇입니까?

  9. 9

    왜? if 블록 내에서 변수를 캐스팅하지 않습니까?

  10. 10

    AnalyticsReceiver-그게 무엇입니까? 그리고 왜 '수신자에게 권한이 필요하지 않습니다'경고가 발생합니까?

  11. 11

    문자열 또는 정수에 대한 getHashCode ()가 고유하지 않은 경우 왜 사용합니까?

  12. 12

    PHP에서 클래스가 선언되지 않은 경우 왜 "new"에서 오류가 발생하지 않습니까?

  13. 13

    bind가 설정되지 않은 경우 왜`this`가 창 객체를 참조하지 않습니까?

  14. 14

    연결 변경 수신기가 작동하지 않습니까?

  15. 15

    Wildfly CLI-환경 변수 확인을 비활성화 하시겠습니까? ie 해결되지 않은 변수를 설정에 쓰기

  16. 16

    printenv 명령은 내가 정의하지 않은 환경 변수를 어디에서 읽습니까?

  17. 17

    내 파이썬 코드가 목록의 변수를 변경하고 있지만 어떻게 / 왜 변경되었는지 볼 수 없습니다.

  18. 18

    내 함수가 큰 숫자에 대해 작동하지 않는 이유는 무엇이며 어떻게 변경할 수 있습니까?

  19. 19

    왜 image2 muxer 옵션 frame_pts가 파일 이름에 대해 PTS를 생성하지 않고 대신 인덱스 번호입니까? 파일 이름으로 PTS를 어떻게 얻을 수 있습니까?

  20. 20

    내가 int를 선언했지만 초기화하지 않았다고 가정 해 보겠습니다. 그것은 어떤 가치입니까? 누군가 나를 위해 이것을 해결할 수 있습니까?

  21. 21

    ReferenceError 대신 undefined를 표시하는 선언되지 않은 개체 변수

  22. 22

    일부 프로그램은 stderr 대신 stdout에 오류를 인쇄하고 $를 설정하지 않습니까? 오류가 발생할 때. 왜?

  23. 23

    git commit 메시지가 명령문으로 쓰여진 경우 아직 수행되지 않은 작업을 어떻게 명확히 할 수 있습니까? '해싱을 추가하지 않음'또는 '해싱을 추가하지 않음 /하지 않음'?

  24. 24

    git commit 메시지가 명령문으로 쓰여진 경우 아직 수행되지 않은 작업을 어떻게 명확히 할 수 있습니까? '해싱을 추가하지 않음'또는 '해싱을 추가하지 않음 /하지 않음'?

  25. 25

    왜 이것이 작동하지 않습니까? -변수를 통해 .blit 사용

  26. 26

    R에서 왜 이름이 '.'로 시작하는 변수를 사용합니까? 내 환경에 나타나지 않습니까?

  27. 27

    왜 (.. getchar ())가 C에서 내 파일에 쓰지 않습니까?

  28. 28

    전체 경로를 제공하는 대신 변수를 사용할 때 Breaklink가 작동하지 않습니다.

  29. 29

    왜 내 chart.js가 로그로 변경 될 때 올바르게 플로팅되지 않습니까?

뜨겁다태그

보관