펄어 구조
Perl language structure![]() |
펄 프로그래밍 언어의 구조는 언어의 구문론적 규칙과 프로그램을 구성하는 일반적인 방법 모두를 포함한다. 펄의 디자인 철학은 흔히 인용되는 모토 "한 가지 이상의 방법이 있다"로 표현된다. Perl은 멀티패러다임, 동적으로 타이핑된 언어로서 프로그램 설계에 있어 상당한 융통성을 허용한다. Perl은 또한 모듈화를 장려한다; 이것은 그것의 Unix 뿌리의[when?] 구성 요소 기반 설계 구조에서 기인하고,[1] 10만 개 이상의 모듈들의 커뮤니티 유지 저장소인 CPAN 아카이브의 크기를 담당한다.[2]
기본 구문
펄에서는 최소 헬로월드 프로그램을 다음과 같이 작성할 수 있다.
인쇄하다 "안녕, 월드!\n"
이것은 문자열을 인쇄한다. Hello, World! 그리고 상징적으로 표현된 뉴라인. n
선행 탈출 문자(백슬래시)에 의해 해석이 변경되는 캐릭터. 버전 5.10 이후, 새로운 'say' 빌드인은[3] 훨씬 더 간단하게 동일한 효과를 만들어 낸다.
라고 말하다 "안녕, 월드!"
전체 Perl 프로그램은 Perl에 대한 명령줄 매개 변수로 지정될 수도 있으므로 명령줄에서도 동일한 프로그램을 실행할 수 있다(예: Unix에 대해 표시된 예:
$ 퍼즐을 맞추다 -e 'Hello, World!\n' 인쇄물
이 프로그램의 표준 형식은 약간 더 장황하다.
#!/usr/bin/perl 인쇄하다 "안녕, 월드!\n";
해시 마크 캐릭터는 Perl에서 코드의 끝까지 실행되며 컴파일러에 의해 무시되는 코멘트를 도입한다(Windows에서는 제외). 여기서 사용하는 코멘트는 특별한 종류인데, 셰방라인이라고 한다. 이를 통해 유닉스 같은 운영체제가 Perl 통역기를 찾도록 해 명시적으로 언급하지 않고 프로그램 호출이 가능해진다. perl
(참고: Microsoft Windows 시스템에서는 일반적으로 Perl 프로그램을 연결하여 호출함 .pl
펄 통역사와의 연장 그런 상황에 대처하기 위해서 perl
shebang 라인을 감지하고 스위치에 대해 파싱)[4]
표준형식의 두 번째 줄에는 세미콜론이 포함되어 있는데, 펄에서 문장을 구분하는 데 사용된다. 블록이나 파일에 하나의 문장만 있으면 분리기가 불필요하기 때문에 프로그램의 최소 형태 또는 어떤 블록이나 파일의 최종 문장에서 보다 일반적으로 생략할 수 있다. 표준형식은 세미콜론을 조정할 필요 없이 블록이나 파일의 끝에 코드를 추가하거나 이동할 수 있기 때문에 불필요한 경우에도 모든 문장을 종료하는 것이 일반적이기 때문이다.
Perl 버전 5.10에서는 say
최소 "Hello World" 프로그램을 더욱 짧게 만들면서 암묵적으로 출력에 뉴라인 캐릭터를 추가하는 기능:
사용하다 5.010; # 새 5.10 함수를 가져오려면 해당 함수가 5.10이 아니라 5.010임을 알려야 함 라고 말하다 '안녕, 월드!'
데이터 유형
Perl에는 여러 가지 기본적인 데이터 유형이 있다. 가장 일반적으로 사용되고 논의되는 것은 스칼라, 배열, 해시, 파일핸들 및 서브루틴이다.
유형 | 시길 | 예 | 설명 |
---|---|---|---|
스칼라 | $ | $foo | 단일 값. 숫자, 문자열, 파일 핸들 또는 참조일 수 있다. |
배열 | @ | @foo | 주문된 스칼라 모음입니다. |
해시 | % | %foo | 문자열에서 스칼라까지의 지도; 문자열은 키, 스칼라는 값이라고 한다. 연관 배열이라고도 한다. |
파일핸들 | 없는 | $Foo 또는 FOO | 읽기, 쓰기 또는 둘 다에 대한 열린 파일 또는 기타 대상을 불투명하게 나타냄. |
서브루틴 | & | &foo | 인수를 통과하고 실행하며 데이터를 반환할 수 있는 코드 조각. |
타이프글로브 | * | *foo | 이름이 'foo'인 모든 유형의 기호 테이블 항목. |
스칼라 값
문자열 값(문자)은 따옴표로 묶어야 한다. 문자열을 큰따옴표로 묶으면 문자열에 이름이 나타나는 변수 값이 문자열에 있는 변수 이름을 자동으로 대체(또는 보간)할 수 있다. 문자열을 작은 따옴표로 묶으면 변수 보간이 방지된다.
예를 들어, 다음과 같다. $name
이다 "Jim"
:
- 그때
print("My name is $name")
인쇄할 것이다"My name is Jim"
(큰따옴표 내의 표시), - 그렇지만
print('My name is $name')
인쇄할 것이다"My name is $name"
(싱글 따옴표 내 보간 없음).
문자열에 큰따옴표를 포함하려면 큰따옴표를 뒤에 붙이거나 문자열을 작은따옴표로 묶으십시오. 작은 따옴표를 포함하려면 먼저 백슬래시를 사용하거나 문자열을 큰 따옴표로 묶으십시오.
문자열은 또한 다음과 같이 인용할 수 있다. q
그리고 qq
따옴표와 유사한 연산자:
'this'
그리고q(this)
동일하다,"$this"
그리고qq($this)
동일하다.
마지막으로, 다음 문서를 사용하여 여러 줄 문자열을 정의할 수 있다.
$multiline_string = <<EOF; 이것은 나의 여러 줄의 끈이다. 나는 "EOF"라는 단어로 그것을 종료하고 있다는 것에 주목하라. EOF
숫자(숫자 상수)는 따옴표가 필요하지 않다. Perl은 숫자를 문자열로 변환하고, 그 반대의 경우 사용된 문맥에 따라 숫자를 문자열로 변환한다. 문자열을 숫자로 변환하면 문자열의 숫자가 아닌 부분 후행은 폐기된다. 문자열의 선행 부분이 숫자인 경우 문자열은 숫자 0으로 변환된다. 다음 예에서 문자열 $n
그리고 $m
숫자로 취급된다. 이 코드는 숫자 '5'를 인쇄한다. 변수의 값은 그대로 유지된다. 참고로 펄에서는 +
항상 숫자 추가 연산자. 끈 연결 연산자는 마침표다.
$n = '사과 3개'; $m = '오렌지 2개'; 인쇄하다 $n + $m;
분수 값을 정수 값으로 반올림하기 위한 함수가 제공된다. int
0을 향해 반올림하면서 부분 부분을 잘라낸다. POSIX::ceil
그리고 POSIX::floor
항상 반올림하고 항상 내리막이다. 숫자 대 문자열 변환 printf "%f"
또는 sprintf "%f"
반올림 반올림, 은행원 반올림 사용.
펄은 또한 조건문을 평가할 때 사용하는 부울 컨텍스트를 가지고 있다. 다음 값은 모두 Perl에서 false로 평가한다.
$false = 0; # 숫자 0 $false = 0.0; # 숫자 0을 부동액으로 $false = 0b0; # 이진수 0 $false = 0x0; # 16진수 숫자 0 $false = '0'; # 현 0 $false = ""; # 빈 끈 $false = (); # 빈 명단 $false = 정의를 내리지 않다; # 정의되지 않은 경우의 반환 값 $false = 2-3+1 # "0"으로 변환된 0으로 계산하여 거짓임
다른 모든 (0이 아닌 평가) 값은 참으로 평가한다. 여기에는 "0 but true"의 홀수 자기 설명 문자열이 포함되는데, 실제로는 숫자로 0이지만 부울로 사용할 경우 참이다. 숫자가 아닌 모든 문자열에도 이 속성이 있지만 이 특정 문자열은 숫자 경고 없이 Perl에 의해 잘린다. 이 문자열의 덜 명시적이긴 하지만 개념적으로 더 휴대 가능한 버전은 '0E0' 또는 '0E0'인데, 이는 '0E0'이 0으로 평가되는 문자에 의존하지 않는데, 이는 '0E0'이 글자 그대로 0에 10을 곱하기 때문이다. 빈 해시 {}
또한 사실이다. 이러한 맥락에서 {}
그 이유는 빈 블록이 아니기 때문이다. perl -e 'print ref {}'
돌아온다 HASH
.
평가된 부울 식도 스칼라 값이다. 이 문서는 참 또는 거짓의 특정 가치를 반환하는 것을 약속하지 않는다. 많은 부울 연산자는 참에 대해 1을 반환하고 거짓에 대해서는 빈 문자열을 반환한다. 정의된() 함수는 변수에 설정된 값이 있는지 여부를 결정한다. 위의 예에서 정의($false)는 정의되지 않은 값을 제외한 모든 값에 대해 참이다.
1 또는 0 중 하나가 특별히 필요한 경우, 다음과 같은 조건부 연산자를 사용하여 명시적 변환을 수행할 수 있다.
나의 $real_limits = $boolean_message ? 1 : 0;
배열 값
배열 값(또는 목록)은 쉼표로 구분되고 괄호(최소한 연산자 우선 순위에서 필요한 경우)로 둘러싸인 요소를 나열하여 지정한다.
@scores = (32, 45, 16, 5);
qw() 따옴표와 같은 연산자는 따옴표와 쉼표를 입력하지 않고 문자열 목록을 정의할 수 있다. 거의 모든 구분 기호를 괄호 대신 사용할 수 있다. 다음 라인은 동일하다.
@names = ('빌리', '조', '짐밥'); @names = Qw(빌리 조 짐밥);
분할 함수는 구분 기호 문자열 또는 정규식을 사용하여 문자열 식에서 분할된 문자열 목록을 반환한다.
@scores = 갈라지다(',', '32,45,16,5');
목록의 개별 요소는 대괄호로 숫자 지수를 제공하여 접근한다. 스칼라 시그닐을 사용해야 한다. 대괄호 안에 있는 숫자 색인 범위 또는 목록을 사용하여 하위 목록(어레이 슬라이스)도 지정할 수 있다. 이 경우 배열 시그닐이 사용된다. 예를 들어, $month[3]
이다 "April"
(배열의 첫 번째 요소는 인덱스 값이 0임) 및 @month[4..6]
이다 ("May", "June", "July")
.
해시 값
펄 프로그래머는 키/값 쌍 목록에서 해시(또는 연관 배열)를 초기화할 수 있다. 키와 값이 분리된 경우 =>
연산자(때로는 뚱뚱한 쉼표라고 부르기도 한다)는 콤마가 아니라 인용되지 않은 것(음표어[5])이 있을 수 있다. 다음 라인은 동일하다.
%favorite = ('joe', "빨간색", '샘', "파란색"); %favorite = (조. => '빨간색', 샘. => '파란색');
해시의 개별 값은 해당 키를 곱슬 브레이스로 제공하여 액세스한다. 그 $
시기는 접근한 원소를 스칼라로 식별한다. 예를 들어 $favorite{joe}는 '빨간색'과 같다. 해시는 또한 그 값을 개별적으로 설정하여 초기화할 수 있다.
달러화{조.} = '빨간색'; 달러화{샘.} = '파란색'; 달러화{오스카} = '녹색';
다음을 사용하여 여러 요소에 액세스할 수 있음 @
대신 sigil(결과를 목록으로 표시) 예를 들어 @favorite{'joe', 'sam'}은('빨간색', '파란색')과 같다.
파일핸들
파일 핸들은 리소스에 대한 읽기 및 쓰기 액세스를 제공한다. 이것들은 대부분 디스크에 있는 파일들이지만, 장치, 파이프 또는 심지어 스칼라 값이 될 수도 있다.
원래 파일 핸들은 다른 변수들과 구별하기 위해 ALL_CAPS 규약을 사용하여 패키지 변수로만 만들 수 있었다. Perl 5.6 이상도 스칼라 변수를 수용하는데, 스칼라 변수는 명명된 파일 핸들 대신 익명 파일 핸들에 대한 참조로 설정(자동화)된다.
유형글로브 값
typeglob 값은 기호 테이블 항목이다. 타입글로브의 주된 용도는 기호 테이블 별칭을 만드는 것이다. 예를 들면 다음과 같다.
*PI = \3.141592653; # 지속적인 스칼라 $PI 생성 *이 = *저것; # 모든 데이터 유형 'that'에 대한 모든 데이터 유형 'this'에 대한 별칭 생성
배열 함수
배열의 요소 수는 스칼라 컨텍스트에서 배열을 평가하거나 의 도움을 받아 결정할 수 있다. $#
sigil. 후자는 원소의 수가 아니라 배열의 마지막 원소의 색인을 제공한다. 스칼라(@array)와 ($#array + 1)라는 표현은 동일하다.
해시함수
전체 해시에서 작동하는 몇 가지 기능이 있다. 키 함수는 해시를 가져와서 키 목록을 반환한다. 마찬가지로, 값 함수는 해시의 값을 반환한다. 키와 값은 일관적이지만 임의의 순서로 반환된다는 점에 유의하십시오.
# 각 통화마다 다음 키/값 쌍을 반환한다. # 모든 가치는 결국 반환되겠지만 그 순서는 # 예측할 수 없다. 그러는 동안에 ((달러명, $address) = 각각 %addressbook) { 인쇄하다 "$name은 $address\n에 산다"; } # 위와 비슷하지만 알파벳순으로 정렬 앞을 내다 나의 $next_name (분류하다 열쇠들. %addressbook) { 인쇄하다 "$next_name은(는) $addressbook{$next_name}\n에 저장됨"; }
제어 구조물
펄에는 여러 종류의 제어 구조가 있다.
C, 자바스크립트, 자바 프로그래밍 언어와 유사한 블록 지향 제어 구조를 가지고 있다. 조건은 괄호로 둘러 싸여 있고, 제어 블록은 가새로 둘러 싸여 있다.
label while ( cond ) { … } label while ( cond ) { … } continue { … } label for ( init-expr ; cond-expr ; incr-expr ) { … } label foreach var ( list ) { … } label foreach var ( list ) { … } continue { … } if ( cond ) { … } if ( cond ) { … } else { … } if ( cond ) { … } elsif ( cond ) { … } else { … }
단일 문만 제어되는 경우 문 한정자는 다음과 같은 보다 명확한 구문을 제공한다.
if cond; cond가 아닌 경우 문; cond가 아닌 경우 문; cond가 있는 동안 문장; cond가 될 때까지의 문장; 문; preach
단락 논리 연산자는 일반적으로 표현 수준에서 제어 흐름에 영향을 미치기 위해 사용된다.
expr 및 expr &&r expr 또는 expr expr.
("및" 및"또는" 연산자는 &&"과 유사하지만 우선순위가 낮아 전체 문장을 제어하는 데 사용하기 쉽다.)
흐름 제어 키워드 next
(C의 내용에 대응함) continue
), last
(C의 내용에 대응함) break
), return
그리고 redo
표현식이므로 단락 연산자와 함께 사용할 수 있다.
Perl은 또한 두 개의 암묵적 루프 구조를 가지고 있는데, 각각은 두 가지 형태를 가지고 있다.
결과 = grep { … } 목록 결과 = grep expr, 목록 결과 = 맵 { … } 목록 결과 = 맵 expr, 목록
grep
제어된 블록 또는 식이 true로 평가되는 목록의 모든 요소를 반환한다. map
목록의 각 요소에 대해 제어된 블록 또는 식을 평가하고 결과 값 목록을 반환한다. 이러한 구조들은 간단한 기능 프로그래밍 스타일을 가능하게 한다.
5.10.0 릴리스까지 Perl 5에는 스위치 문장이 없었다. 5.10.0 이후로는 다방향 분기문이 호출되었다. given
/when
다음과 같은 형식을 사용할 수식어:
v5.10을 사용하십시오. 지정된 새 5.10 기능을 가져오려면 #가 있어야 함(expr ) { when (cond ) { … } 기본값 { … } }
구문론적으로 이 구조는 다른 언어에서 발견되는 스위치 문과 유사하게 동작하지만 몇 가지 중요한 차이점이 있다. 가장 큰 것은 스위치/케이스 구조와 달리 명시적으로 정의된 중단 명령을 기다리지 않고 첫 번째 성공적인 분기 이후에 문이 실행이 중단되는 경우입니다. 반대로 명시적 continue
대신 s는 스위치 동작을 에뮬레이트하는 데 필요하다.
Perl 5.10을 사용하지 않는 사용자의 경우, Perl 설명서는 다른 제어 구조를 사용하여 동일한 효과를 얻을 수 있는 반나절의 방법을 설명한다. 자매어 라쿠를 모델로 한 기능을 제공하는 스위치 모듈도 있다. 소스 필터를 사용하여 구현되므로 비공식적으로 사용을 금지한다.[6]
Perl은 다음을 포함한다. goto label
진술, 그러나 거의 사용되지 않는다. 다음과 같은 상황 goto
다른 언어는 흐름 제어 옵션의 폭이 넓기 때문에 Perl에서 자주 발생하지 않는 것으로 불린다.
a도 있다. goto &sub
테일 콜을 수행하는 문장 현재 서브루틴을 종료하고 즉시 지정된 서브루틴을 호출한다. sub
. 이는 호출자가 Perl 자체보다 더 효율적인 스택 관리를 수행할 수 있는 상황에서 사용되며(일반적으로 현재 스택에 대한 변경이 필요하지 않기 때문에), 깊은 재귀에서 테일 콜링은 반환 시 스코프/스택 관리의 오버헤드를 피하기 때문에 성능에 상당한 긍정적인 영향을 미칠 수 있다.
서브루틴
서브루틴은 다음과 같이 정의된다. sub
키워드 이름만 대면 호출된다. 해당 서브루틴이 아직 선언되지 않은 경우, 호출하려면 함수 이름 뒤에 괄호나 그 앞에 앰퍼샌드(&)가 있어야 한다. 그러나 괄호 없이 사용하는 것 또한 암묵적으로 현재 서브루틴의 인수를 호출된 인수에 전달하고, 괄호와 함께 사용하는 것은 프로토타입을 우회할 것이다.
# 서브루틴 호출 # 여기서 서브루틴이 코드 후반부에 정의된 경우 괄호 필요 foo(); &foo; # (이것도 효과가 있지만 서브루틴으로 전달된 논쟁에 관한 다른 결과가 있음) # 서브루틴 정의 후보선수 foo { … } foo; # 여기 괄호는 필요 없음
인수 목록은 서브루틴 이름 뒤에 제공될 수 있다. 논쟁은 스칼라, 리스트 또는 해시일 수 있다.
foo $x, @y, %z;
서브루틴에 대한 매개변수는 번호나 유형으로 선언할 필요가 없다. 사실, 그것들은 통화마다 다를 수 있다. 매개변수의 유효성 검사는 서브루틴 내부에서 명시적으로 수행되어야 한다.
배열은 그 요소로 확장되고, 해시는 키/값 쌍 목록으로 확장되며, 전체 로트는 하나의 평평한 스칼라 목록으로 서브루틴으로 전달된다.
전달된 인수가 특수 배열의 서브루틴에 사용 가능한 경우 @_
. 의 요소들 @_
실제 인수에 대한 참조, 요소의 변경 @_
해당 주장을 변경한다.
의 요소 @_
통상적인 방법으로 첨자로 접속할 수 있다.
$_[0], $_[1]
그러나 결과 코드는 읽기 어려울 수 있으며 매개변수에 기준별 의미론(pass-by-reference semantics)이 있어 바람직하지 않을 수 있다.
한 가지 일반적인 관용구는 할당하는 것이다. @_
명명된 변수 목록으로 이동하십시오.
나의 ($x, $y, $z) = @_;
이것은 니모닉 매개변수 이름을 제공하고 값별 전달 의미 체계를 구현한다. 그 my
키워드는 다음 변수가 포함된 블록까지 어휘적으로 범위가 지정되었음을 나타낸다.
또 다른 관용구는 매개 변수를 다음에서 다른 곳으로 옮기는 것이다. @_
특히 서브루틴이 하나의 인수만을 취하거나 또는 를 취급할 때 더욱 흔하다. $self
객체 지향 모듈에서의 논쟁
나의 $x = 교대시키다;
서브루틴이 할당할 수 있음 @_
명명된 인수를 시뮬레이션하기 위한 해시로, 이것은 세 개 이상의 매개변수를 가질 가능성이 있는 서브루틴의 경우 Perl Best Practices에서 권장된다.[7]
후보선수 함수1 { 나의 %args = @_; 인쇄하다 "x" 논쟁은 '$args{x}'\n"이었습니다.; } 함수1( x => 23 );
서브루틴은 값을 반환할 수 있다.
돌아오다 42, $x, @y, %z;
서브루틴이 a를 통해 종료되지 않는 경우 return
subroutine body 내에서 평가된 마지막 식을 반환한다. 반환 값의 배열과 해시는 논쟁을 위한 것과 마찬가지로 스칼라 목록으로 확장된다.
반환된 표현은 서브루틴의 호출 컨텍스트에서 평가된다. 이것은 부주의한 사람들을 놀라게 할 수 있다.
후보선수 리스트를 작성하다 { (4, 5, 6) } 후보선수 배열하다 { @x = (4, 5, 6); @x } $x = 리스트를 작성하다; # 반환 6 - 목록의 마지막 요소 $x = 배열하다; # 반환 3 - 목록의 요소 수 @x = 리스트를 작성하다; # 반품 (4, 5, 6) @x = 배열하다; # 반품 (4, 5, 6)
서브루틴은 에 대한 호출 컨텍스트를 찾을 수 있다. wantarray
기능을 발휘하다
후보선수 어느 쪽이든 { 돌아오다 원기 왕성하다 ? (1, 2) : '오랑게스'; } $x = 어느 쪽이든; # "오랑스" 반환 @x = 어느 쪽이든; # 반품 (1, 2)
정규식
펄언어에는 정규식(RE, 또는 regexes)을 쓰기 위한 전문 구문이 포함되며, 통역기에는 정규식에 문자열을 매칭하기 위한 엔진이 포함되어 있다. 정규 표현 엔진은 역추적 알고리즘을 사용해 단순한 패턴 매칭에서 문자열 캡처 및 대체까지 기능을 확장했다. 규칙적인 표현 엔진은 헨리 스펜서가 쓴 regex에서 유래되었다.
Perl 정규 표현 구문은 원래 Unix Version 8 정규 표현식에서 따왔다. 하지만, 그것은 펄의 첫 번째 개봉 전에 갈라졌고, 그 이후로 훨씬 더 많은 특징들을 포함하도록 성장했다. PHP, Ruby, Java, Microsoft 등의 POSIX 정규 표현식보다 Perl 호환 정규 표현식을 채택하는 언어가 많다.NET Framework [8]및 Apache HTTP 서버.
정규 표현 구문은 역사 때문에 극히 압축적이다. 첫 번째 정규 표현 방언은 글로브보다 조금 더 표현력이 있을 뿐이고, 구문은 표현이 일치하는 텍스트와 비슷하도록 설계되었다.[citation needed] 이것은 지원되는 몇 가지 주장을 표현하기 위해 단 하나의 구두점 문자나 한 쌍의 구분 문자만 사용하는 것을 의미했다. 시간이 지나면서 정규 표현식의 표현력은 엄청나게 커졌지만 구문 디자인은 결코 수정되지 않았고 구두점에 계속 의존하고 있다. 그 결과 정규 표현은 애매하고 극도로 조밀해질 수 있다.
사용하다
그 m//
(일치) 연산자는 정규표현 일치를 소개한다.(여기 예시 모두와 같이 슬래시로 구분하면 선두가 된다. m
간결하게 생략할 수 있다 만약 m
다음과 같은 모든 예에서와 같이 다른 구분 기호를 슬래시 대신 사용할 수 있다.) 가장 간단한 경우, 다음과 같은 표현이 있다.
$x =~ /cns/;
문자열의 경우에만 true로 평가 $x
정규식과 일치하다 abc
.
그 s///
(iii) 반면에 운영자는 검색 및 검색 작업을 다음과 같이 지정한다.
$x =~ s/abc/aBc/; # b를 대서특필하다.
정규식의 또 다른 용도는 다음 항목에 대한 구분자를 지정하는 것이다. split
함수:
@words = 갈라지다 /,/, $line;
그 split
함수는 정규식과 일치하는 것으로 구분되는 문자열 부분의 목록을 만든다. 이 예에서 선은 자체 쉼표로 구분된 부분 목록으로 나뉘며, 이 목록은 다음 위치에 할당된다. @words
배열하다
구문
수식어
펄 정규 표현은 수식어를 사용할 수 있다. 다음은 표현식의 의미를 수정하는 단일 문자 접미사다.
$x =~ /190/i; # 대소문자 구분 패턴 일치 $x =~ s/abc/aBc/g; # 글로벌 검색 및 교체
정규 표현식의 콤팩트한 구문이 치밀하고 암호화된 표현이 될 수 있기 때문이다. /x
프로그래머들이 더 읽기 쉬운 정규 표현을 쓸 수 있도록 Perl에 수식어가 추가되었다. 그것은 프로그래머들이 공백과 코멘트를 정규 표현 안에 넣을 수 있게 해준다.
$x =~ / # 매치 'a' # 어떤 캐릭터도 따라다닌다. c # 그 다음에 'c' 문자가 온다. /x;
캡처
정규식의 일부는 괄호로 묶을 수 있다. 일치하는 문자열의 해당 부분이 캡처된다. 캡처된 문자열이 순차적 내장 변수에 할당됨 $1, $2, $3, …
, 그리고 캡처된 문자열의 목록이 일치값으로 반환된다.
$x =~ /a(.)c/; # 'a'와 'c' 사이의 캐릭터 포착
캡처된 문자열 $1, $2, $3, …
코드에서 나중에 사용될 수 있다.
또한 Perl 정규식을 사용하여 기본 제공 또는 사용자 정의 함수를 캡처한 일치 항목에 적용할 수 있음 /e
수식어:
$x = "오랑게스"; $x =~ s/(ge)/uc($1)/e; # 오란지스 $x .= $1; # 이전 문장의 경기 내용에 $x 추가: OranGEsge
물건들
![]() |
Perl에는 객체 지향 코드를 작성하는 여러 가지 방법이 있다. 가장 기본적인 것은 "축복된" 참조를 사용하는 것이다. 이것은 주어진 패키지에 속하는 모든 유형의 참조를 식별함으로써 작동하며, 패키지는 복된 참조에 대한 방법을 제공한다. 예를 들어, 2차원 점은 다음과 같이 정의할 수 있다.
후보선수 포인트::new { # 여기서 포인트->신규(4, 5)는 달러 클래스가 '포인트'가 되는 결과를 낳는다. # 서브클래싱을 지원하는 변수다(퍼루프 맨 페이지 참조). 나의 ($class, $x, $y) = @_; 축복을 빌다 [$x, $y], $class; # 암묵적 귀환 } 후보선수 포인트::거리 { 나의 ($self, $에서) = @_; 나의 ($dx, $dy) = ($self[0] - 에서 $[0], $self[1] - 에서 $[1]); sqrt($dx * $dx + $dy * $dy); }
이 클래스는 호출하여 사용할 수 있음 new()
인스턴스 구성 및 호출 distance
그런 경우에
나의 $p1 = 포인트->새로운(3, 4); 나의 $p2 = 포인트->새로운(0, 0); 인쇄하다 $p1->거리를 두다($p2); # 인쇄 5
많은 현대의 Perl 애플리케이션은 Mosse 객체 시스템을 사용한다.[citation needed] 무스는 클래스 위에 제작됨:MOP(Meta-object) 프로토콜로 모든 무스 사용 클래스에 대한 완벽한 자기성찰을 제공한다. 따라서 당신은 간단한 API를 이용하여 수업시간에 그들의 속성, 부모, 자녀, 방법 등에 대해 물어볼 수 있다.
무스 클래스:
- 클래스는 속성이 0 이상이다.
- 한 클래스는 0개 이상의 방법을 가지고 있다.
- 한 클래스는 0개 이상의 슈퍼 클래스(일명 부모 클래스)를 가지고 있다. 한 클래스는 그 슈퍼클래스로부터 계승된다.
- 클래스는 0개 이상의 역할을 수행하므로 하위 클래스 없이 클래스에 미리 정의된 기능을 추가할 수 있는 기능이 추가된다.
- 클래스는 생성자와 파괴자를 가지고 있다.
- 한 학급은 메타클라스를 가지고 있다.
- 클래스에는 0개 이상의 메서드 한정자가 있다. 이러한 수식어는 자신의 방법, 조상으로부터 물려받은 방법, 또는 역할에 의해 제공되는 방법에 적용할 수 있다.
무스 역할:
- 역할은 다른 객체 지향 프로그래밍 언어의 믹스인이나 인터페이스와 같이 클래스가 하는 것이다. 역할은 믹스인이나 인터페이스와 달리 개별 객체 인스턴스에 적용할 수 있다.
- 역할에는 0개 이상의 속성이 있다.
- 역할에는 0개 이상의 방법이 있다.
- 역할에는 0개 이상의 메서드 한정자가 있다.
- 역할에는 0개 이상의 필수 방법이 있다.
예
MosseX를 사용하여 작성된 클래스의 예::무스에 대한 확장[9] 선언:
사용하다 무스엑스:선언; 계급 점3D 연장하다 포인트 { 가지다 'z' => (이사하다 => 'Num', 이다 => 'rw'); 다음에 분명한 { $self->z(0); } 방법 set_to. (숫자 $x, 숫자 $y, 숫자 $z) { $self->x($x); $self->y($y); $self->z($z); } }
이 수업은 이름이 붙여진 수업이다. Point3D
다른 클래스를 확장하는 Point
무스 예에서 설명하였다. 기본 클래스에 새 속성을 추가함 z
, 메소드를 다시 정의 set_to
그리고 그 방법을 확장한다. clear
.
참조
- ^ Orwant, Jon (2003). Games, diversions, and Perl culture: best of the Perl journal. ISBN 978-0-596-00312-8.
- ^ "CPAN front page". Retrieved 2011-12-09.
- ^ "Features". Perldoc. Perl.org. Retrieved 24 July 2017.
- ^ "perlrun". perldoc.perl.org - Official documentation for the Perl programming language. Retrieved 2011-01-08.
- ^ Wainwright, Peter (2005). Pro Perl. Pro to Expert Series. Apress. p. 64. ISBN 978-1-59059-438-4. Retrieved 2010-08-03.
[…] a string without quotes, known as a bareword string […]
- ^ 스위치 사용
- ^ Damian Conway, Perl Best Practice 2011-09-18 웨이백 머신에 보관, 페이지 182
- ^ 마이크로소프트, ".NET Framework 정규식", .NET Framework 개발자 설명서, [1]
- ^ MosseX:문서 폐기
외부 링크
- 펄 자습서
- 약 2시간 30분 만에 Perl 학습
- PerlMonks 커뮤니티는 Perl 지식과 코딩 팁을 공유하기 위해 헌신한다.