Perl에서 기본 범위 지정 동작이있는 이유는 무엇입니까?
저는 학교에서 Perl을 배우고 있으며 현재 Perl의 my
키워드 사용과 범위 지정에 대해 배우고 있습니다 . (참고 로 Perl에서 "my"키워드 를 어떻게 사용해야합니까 ?를 살펴 보았습니다.)이 질문이 다른 곳에서 아직 묻지 않았 으면 합니다만, 그렇지 않다면 왜 Perl의 기본 동작이 그대로입니까?
C 스타일의 기본 범위 지정이 가장 의미가있는 것 같습니다. 변수를 블록 내부에 선언하면 변수가 해당 블록 내에 존재하며 해당 블록을 떠나면 해당 변수에 더 이상 액세스 할 수 없습니다. Perl에서이 동작을 지정하기 위해 my
키워드 를 사용해야하는 이유는 무엇 입니까? 변수의 범위를 사용되는 위치로만 제한하는 것은 좋은 표준 동작이 될 my
것 같고, 항상 사용 하는 것은 매우 중복되어 코드를 복잡하게 만드는 데 기여할 것 같습니다.
마치 식료품 가게에 들어가서 쇼핑을 계속하기 전에 좋아하는 브랜드를 즉시 큰 소리로 선언하는 것처럼 보입니다. 주변의 누군가가 궁금해 할 경우를 대비하여 (아마도 그렇지 않았을 것입니다).
(잠재적 중복,이 질문은 내려 질 수 있습니다 ... 왜 파일 범위에서 "my"로 Perl 변수를 선언합니까? .)
답변
어휘 범위의 변수를 원한다면 어떤 형태의 선언이 필요합니다. [1]
C 스타일의 기본 범위 지정이 가장 의미가있는 것 같습니다. 변수를 블록 내부에 선언하면 변수가 해당 블록 내에 존재하며 해당 블록을 떠나면 해당 변수에 더 이상 액세스 할 수 없습니다.
그건 정확하게 는 펄에서 작동하는 방법. int i
C에서 사용하는 변수를 선언하는 경우 my $i
Perl에서 사용합니다 . 둘 다 어휘 범위의 변수를 생성합니다. 즉, 현재 블록과 포함 된 블록에서만 볼 수있는 변수를 말합니다. 블록 외부에서 코드를 실행하면 변수에 액세스 할 수 없습니다. Perl의 변수 범위는 C의 변수 범위와 동일합니다. [2]
// Can't use `i` here. # Can't use `$i` here.
{ {
// Can't use `i` here. # Can't use `$i` here. int i = 4; my $i = 4;
printf("%d\n", i); 4 say $i; { { printf("%d\n", i); 4 say $i;
int i = 5; my $i = 5; printf("%d\n", i); 5 say $i;
} }
printf("%d\n", i); 4 say $i; } } // Can't use `i` here. # Can't use `$i` here.
파이썬에는 명시적인 변수 선언이 없지만 어휘 범위의 변수도 없습니다. Python 변수는 함수 범위입니다.
그러나 변수의 수명은 동일하지 않습니다. 스칼라는 Perl에 상주하는 블록의 끝을지나 살아남을 수 있지만 C의 유사한 변수 ( "자동 저장 기간"이있는 변수)의 경우는 그렇지 않습니다.
예를 들면
# You can't use `@a` outside of the sub, # But you can use the created array anonymously. sub f { my @a = qw( abc def ); return \@a; }
그런 의미에서
my $x
동적으로 할당 된 구조체와 더 비슷합니다.
그것이 Larry Wall이 1987 년에 한 방식이고 Perl 5는 그 결정과 역 호환성을 유지하기 때문입니다. 어휘 변수는 1994 년 Perl 5까지 도입되지 않았으며 그때까지 Perl 4 프로그램의 설치 기반이 상당히 많았습니다.
이유를 추측하겠습니다. Perl은 애플리케이션 언어로 생각되지 않고 하나가되었습니다. Perl 1은 sed , awk 및 Bourne 쉘에 대한보다 강력한 대안으로 1987 년에 작성되었습니다 .
일반적으로 sed 또는 awk 또는 sh를 사용하는 문제가 있지만 기능을 초과하거나 조금 더 빠르게 실행해야하며 C로 어리석은 것을 작성하고 싶지 않은 경우 perl이 적합 할 수 있습니다.
Perl 1.0 매뉴얼에서 .
sed 및 awk 프로그램은 일반적으로 한 줄입니다. 그리고 쉘 변수는 전역 적입니다. Perl 1의 목적을 고려하면 괜찮 았습니다.
승인 된 소프트웨어 엔지니어링 표준은 지난 수십 년 동안 많이 변경되었습니다. 시스템이 더 작고 단순했을 때는 전역 변수가 더 수용 가능했습니다. 복잡성이 증가함에 따라 글로벌 변수는 점점 더 위험 해지고 있습니다.
엄밀히 말하면 Perl에서 변수의 기본 범위는 전역 패키지입니다. 선언 할 필요가없는 변수 . 그것은 Perl의 철학에 대해 많은 것을 알려줍니다. 작업 지향적이며 신속한 프로토 타이핑 및 빠르고 더러운 프로그래밍에 탁월합니다. 명령 줄에 완전한 프로그램을 작성하여 복잡한 작업을 수행 할 수 있습니다 ( perl -e
). 마조히스트 만이 할 수 perl -e 'use strict; ...'
있습니다. 변수를 작성하면 작동합니다. 그 철학 중 하나는 DWIM입니다. 이것은 무엇이든하기 전에 세상을 정의해야하는 대부분의 "하드"프로그래밍 언어와는 완전히 반대입니다.
그리고 래리의 좋은 시간을 우리는있어 strict
, use vars
, my
, our
, 및 state
변수의 관리를 완료합니다. 그들은 우리를 위해 일하지만 그 반대는 아닙니다. 실제로 특정 데이터를 전역에 넣지 않는 것은 무례한 프로그래밍으로 간주 될 수 있습니다. 나는 다음 사람보다 더 잘 알지 못하기 때문에 그가 내 코드 또는 모듈을 조사하거나 수정하고 싶다면 괜찮습니다.
다음은 Perl을 만든 Larry Wall의 강연에 대한 매우 유익한 링크입니다.
최초의 포스트 모던 컴퓨터 언어 인 Perl
Perl의 문화
진지하게, Perl Culture에 중요한 아이디어의 세균이 있다면 그것은 이것입니다. 너무 많은 통제는 너무 적은 통제만큼 치명적입니다. 우리는 통제가 필요하고 혼돈이 필요합니다.
프로그래밍은 어렵다, Let 's Go 스크립팅 ...
Unix 셸 프로그래밍의 좌절감은 Perl을 직접 만들었습니다. 쉘 스크립팅은 대부분의 동사가 제어되지 않고 명사가 빈곤하고 문자열과 파일로 제한된다는 사실에 의해 본질적으로 제한된다는 사실을 발견했습니다. 나는 어리석은 컴퓨터 언어로 말하고 싶지 않습니다. 컴퓨터 언어가 내가 입력 한 문자열을 이해하기를 원합니다.
자세한 내용은 perl.com을 방문하십시오.