Perl-퀵 가이드
Perl은 원래 텍스트 조작을 위해 개발 된 범용 프로그래밍 언어로 현재 시스템 관리, 웹 개발, 네트워크 프로그래밍, GUI 개발 등을 포함한 광범위한 작업에 사용됩니다.
Perl은 무엇입니까?
Perl은 안정적인 크로스 플랫폼 프로그래밍 언어입니다.
Perl은 공식적으로 약어는 아니지만 소수의 사람들이 그것을 사용했습니다. Practical Extraction and Report Language.
공공 및 민간 부문의 미션 크리티컬 프로젝트에 사용됩니다.
Perl은 Artistic License 또는 GPL (General Public License)에 따라 사용이 허가 된 오픈 소스 소프트웨어 입니다.
Perl은 Larry Wall이 만들었습니다.
Perl 1.0은 1987 년에 유즈넷의 alt.comp.sources로 출시되었습니다.
이 튜토리얼을 작성할 당시 최신 버전의 perl은 5.16.2였습니다.
Perl은 Oxford English Dictionary에 있습니다.
PC Magazine은 Perl을 개발 도구 부문에서 1998 년 기술 우수상 최종 후보로 발표했습니다.
Perl 기능
Perl은 C, awk, sed, sh 및 BASIC과 같은 다른 언어에서 최고의 기능을 사용합니다.
Perls 데이터베이스 통합 인터페이스 DBI는 Oracle, Sybase, Postgres, MySQL 등을 포함한 타사 데이터베이스를 지원합니다.
Perl은 HTML, XML 및 기타 마크 업 언어로 작동합니다.
Perl은 유니 코드를 지원합니다.
Perl은 Y2K를 준수합니다.
Perl은 절차 적 프로그래밍과 객체 지향 프로그래밍을 모두 지원합니다.
Perl은 XS 또는 SWIG를 통해 외부 C / C ++ 라이브러리와 인터페이스합니다.
Perl은 확장 가능합니다. Comprehensive Perl Archive Network ( CPAN ) 에서 사용할 수있는 20,000 개 이상의 타사 모듈이 있습니다 .
Perl 인터프리터는 다른 시스템에 내장 될 수 있습니다.
Perl과 웹
Perl은 텍스트 조작 기능과 빠른 개발 주기로 인해 가장 인기있는 웹 프로그래밍 언어였습니다.
Perl은 " 인터넷의 덕트 테이프 "로 널리 알려져 있습니다.
Perl은 전자 상거래를 포함하여 암호화 된 웹 데이터를 처리 할 수 있습니다.
Perl은 웹 서버에 내장되어 처리 속도를 최대 2000 %까지 높일 수 있습니다.
Perl의 mod_perl을 사용하면 Apache 웹 서버가 Perl 인터프리터를 포함 할 수 있습니다.
Perl의 DBI 패키지는 웹 데이터베이스 통합을 쉽게 만듭니다.
Perl이 해석 됨
Perl은 해석 된 언어입니다. 즉, 이식 불가능한 실행 프로그램을 만드는 컴파일 단계없이 코드를있는 그대로 실행할 수 있습니다.
전통적인 컴파일러는 프로그램을 기계어로 변환합니다. Perl 프로그램을 실행하면 먼저 바이트 코드로 컴파일 된 다음 프로그램이 실행될 때 기계 명령어로 변환됩니다. 그래서 그것은 쉘 또는 Tcl과 완전히 같지 않습니다.strictly 중간 표현없이 해석됩니다.
또한 기계 종속 형식으로 직접 컴파일되는 대부분의 C 또는 C ++ 버전과는 다릅니다. Python 및 awk 및 Emacs .elc 파일 과 함께 중간에 있습니다.
Perl 프로그램 작성을 시작하기 전에 Perl 환경을 설정하는 방법을 이해합시다. Perl은 다양한 플랫폼에서 사용할 수 있습니다.
- Unix (Solaris, Linux, FreeBSD, AIX, HP / UX, SunOS, IRIX 등)
- 승리 9x / NT / 2000 /
- WinCE
- Macintosh (PPC, 68K)
- Solaris (x86, SPARC)
- OpenVMS
- 알파 (7.2 이상)
- Symbian
- 데비안 GNU / kFreeBSD
- MirOS BSD
- 그리고 더 많은...
시스템에 perl이 설치되어있을 가능성이 높습니다. $ 프롬프트에서 다음 명령을 입력하십시오.
$perl -v
컴퓨터에 Perl이 설치되어 있으면 다음과 같은 메시지가 표시됩니다.
This is perl 5, version 16, subversion 2 (v5.16.2) built for i686-linux
Copyright 1987-2012, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
Perl이 아직 설치되지 않은 경우 다음 섹션으로 진행하십시오.
Perl 설치하기
최신 최신 소스 코드, 바이너리, 문서, 뉴스 등은 Perl의 공식 웹 사이트에서 확인할 수 있습니다.
Perl Official Website − https://www.perl.org/
다음 사이트에서 Perl 문서를 다운로드 할 수 있습니다.
Perl Documentation Website − https://perldoc.perl.org
Perl 설치
Perl 배포는 다양한 플랫폼에서 사용할 수 있습니다. 플랫폼에 적용 가능한 바이너리 코드 만 다운로드하고 Perl을 설치하면됩니다.
플랫폼의 바이너리 코드를 사용할 수없는 경우 소스 코드를 수동으로 컴파일하려면 C 컴파일러가 필요합니다. 소스 코드를 컴파일하면 설치에 필요한 기능 선택 측면에서 더 많은 유연성을 제공합니다.
다음은 다양한 플랫폼에 Perl을 설치하는 방법에 대한 간략한 개요입니다.
Unix 및 Linux 설치
다음은 Unix / Linux 시스템에 Perl을 설치하는 간단한 단계입니다.
웹 브라우저를 열고 https://www.perl.org/get.html.
링크를 따라 Unix / Linux에서 사용할 수있는 압축 된 소스 코드를 다운로드하십시오.
다운로드 perl-5.x.y.tar.gz 파일을 열고 $ 프롬프트에서 다음 명령을 실행하십시오.
$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install
NOTE − 여기서 $는 명령을 입력하는 Unix 프롬프트이므로 위에서 언급 한 명령을 입력하는 동안 $를 입력하지 않도록하십시오.
그러면 표준 위치 / usr / local / bin에 Perl이 설치 되고 해당 라이브러리는 / usr / local / lib / perlXX 에 설치됩니다. 여기서 XX는 사용중인 Perl의 버전입니다.
발행 후 소스 코드를 컴파일하는 데 시간이 걸립니다. make명령. 설치가 완료되면 다음을 발급 할 수 있습니다.perl -v$ 프롬프트에서 명령을 실행하여 Perl 설치를 확인하십시오. 모든 것이 정상이면 위에 표시된 것과 같은 메시지가 표시됩니다.
Windows 설치
Windows 시스템에 Perl을 설치하는 단계는 다음과 같습니다.
Windows에서 Strawberry Perl 설치 링크를 따르십시오. http://strawberryperl.com
32 비트 또는 64 비트 버전의 설치를 다운로드하십시오.
Windows 탐색기에서 다운로드 한 파일을 두 번 클릭하여 실행합니다. 이렇게하면 정말 사용하기 쉬운 Perl 설치 마법사가 나타납니다. 기본 설정을 수락하고 설치가 완료 될 때까지 기다리면 롤 준비가 완료됩니다!
Macintosh 설치
자신 만의 Perl 버전을 빌드하려면 일반적으로 Mac OS 설치 DVD와 함께 제공되는 Apple 개발자 도구의 일부인 'make'가 필요합니다. make를 설치하기 위해 최신 버전의 Xcode (현재 요금이 부과됨)가 필요하지 않습니다.
다음은 Mac OS X 시스템에 Perl을 설치하는 간단한 단계입니다.
웹 브라우저를 열고 https://www.perl.org/get.html.
링크를 따라 가면 Mac OS X에서 사용할 수있는 압축 된 소스 코드를 다운로드 할 수 있습니다.
다운로드 perl-5.x.y.tar.gz 파일을 열고 $ 프롬프트에서 다음 명령을 실행하십시오.
$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install
그러면 표준 위치 / usr / local / bin에 Perl이 설치 되고 해당 라이브러리는 / usr / local / lib / perlXX 에 설치됩니다. 여기서 XX는 사용중인 Perl의 버전입니다.
Perl 실행
다음은 Perl을 시작하는 다양한 방법입니다.
대화 형 통역사
당신은 들어갈 수 있습니다 perl명령 줄에서 시작하여 대화 형 인터프리터에서 즉시 코딩을 시작합니다. Unix, DOS 또는 명령 줄 인터프리터 또는 셸 창을 제공하는 다른 시스템에서이 작업을 수행 할 수 있습니다.
$perl -e <perl code> # Unix/Linux
or
C:>perl -e <perl code> # Windows/DOS
다음은 사용 가능한 모든 명령 줄 옵션 목록입니다.
Sr. 아니. | 옵션 및 설명 |
---|---|
1 | -d[:debugger] 디버거에서 프로그램 실행 |
2 | -Idirectory @ INC / # include 디렉토리를 지정합니다. |
삼 | -T 오염 검사 활성화 |
4 | -t 오염 경고 활성화 |
5 | -U 안전하지 않은 작업 허용 |
6 | -w 많은 유용한 경고를 활성화합니다. |
7 | -W 모든 경고를 활성화합니다. |
8 | -X 모든 경고를 비활성화합니다. |
9 | -e program 프로그램으로 전송 된 Perl 스크립트 실행 |
10 | file 주어진 파일에서 Perl 스크립트를 실행합니다. |
명령 줄에서 스크립트
Perl 스크립트는 perl 코드를 보관하는 텍스트 파일이며 다음과 같이 애플리케이션에서 인터프리터를 호출하여 명령 줄에서 실행할 수 있습니다.
$perl script.pl # Unix/Linux
or
C:>perl script.pl # Windows/DOS
통합 개발 환경
그래픽 사용자 인터페이스 (GUI) 환경에서도 Perl을 실행할 수 있습니다. Perl을 지원하는 시스템의 GUI 애플리케이션 만 있으면됩니다. Perl IDE 인 Padre 를 다운로드 할 수 있습니다 . Eclipse 에 익숙한 경우 Eclipse 플러그인 EPIC-Perl 편집기 및 Eclipse 용 IDE를 사용할 수도 있습니다 .
다음 장으로 진행하기 전에 환경이 올바르게 설정되고 완벽하게 작동하는지 확인하십시오. 환경을 올바르게 설정할 수없는 경우 시스템 관리자의 도움을받을 수 있습니다.
이후 장에서 제공되는 모든 예제는 Linux의 CentOS 버전에서 사용할 수있는 v5.16.2 버전으로 실행되었습니다.
Perl은 awk, sed, C, Bourne Shell, Smalltalk, Lisp 및 심지어 영어와 같은 다양한 언어에서 구문과 개념을 차용합니다. 그러나 언어 간에는 몇 가지 확실한 차이점이 있습니다. 이 장은 Perl에서 예상되는 구문을 빠르게 익힐 수 있도록 설계되었습니다.
Perl 프로그램은 위에서 아래로 실행되는 일련의 선언과 명령문으로 구성됩니다. 루프, 서브 루틴 및 기타 제어 구조를 사용하면 코드 내에서 이동할 수 있습니다. 모든 간단한 문은 세미콜론 (;)으로 끝나야합니다.
Perl은 자유 형식 언어입니다. 원하는대로 형식을 지정하고 들여 쓸 수 있습니다. 공백은 구문의 중요한 부분 인 Python이나 중요하지 않은 Fortran과 같은 언어와 달리 대부분 토큰을 분리하는 역할을합니다.
첫 번째 Perl 프로그램
대화 형 모드 프로그래밍
Perl 인터프리터를 다음과 함께 사용할 수 있습니다. -e옵션을 사용하면 명령 줄에서 Perl 문을 실행할 수 있습니다. $ 프롬프트에서 다음과 같이 시도해 보겠습니다.
$perl -e 'print "Hello World\n"'
이 실행은 다음 결과를 생성합니다-
Hello, world
스크립트 모드 프로그래밍
이미 $ 프롬프트에 있다고 가정하고 vi 또는 vim 편집기를 사용하여 hello.pl 텍스트 파일을 열고 다음 줄을 파일에 넣습니다.
#!/usr/bin/perl
# This will print "Hello, World"
print "Hello, world\n";
여기 /usr/bin/perl실제 펄 인터프리터 바이너리입니다. 스크립트를 실행하기 전에 스크립트 파일의 모드를 변경하고 실행 권한을 부여하십시오. 일반적으로 0755 설정이 완벽하게 작동하고 마지막으로 다음과 같이 위 스크립트를 실행합니다.
$chmod 0755 hello.pl $./hello.pl
이 실행은 다음 결과를 생성합니다-
Hello, world
함수 인수에 괄호를 사용하거나 개인 취향에 따라 생략 할 수 있습니다. 우선 순위 문제를 명확히하기 위해 가끔 만 필요합니다. 다음 두 명령문은 동일한 결과를 생성합니다.
print("Hello, world\n");
print "Hello, world\n";
Perl 파일 확장자
Perl 스크립트는 일반적인 단순 텍스트 편집기 프로그램 내에서 만들 수 있습니다. 모든 유형의 플랫폼에 사용할 수있는 여러 프로그램이 있습니다. 프로그래머를 위해 설계된 많은 프로그램이 웹에서 다운로드 할 수 있습니다.
Perl 규칙에 따라 Perl 파일은 작동하는 Perl 스크립트로 인식되기 위해 .pl 또는 .PL 파일 확장자로 저장되어야합니다. 파일 이름은 숫자, 기호 및 문자를 포함 할 수 있지만 공백은 포함 할 수 없습니다. 공백 자리에는 밑줄 (_)을 사용하십시오.
Perl의 주석
모든 프로그래밍 언어의 주석은 개발자의 친구입니다. 주석은 프로그램을 사용자 친화적으로 만드는 데 사용할 수 있으며 코드 기능에 영향을주지 않고 인터프리터가 주석을 건너 뛸 수 있습니다. 예를 들어, 위 프로그램에서 해시로 시작하는 줄# 댓글입니다.
Perl에서 주석을 간단히 말하면 해시 기호로 시작하여 줄 끝까지 실행됩니다.
# This is a comment in perl
=로 시작하는 줄은 포함 된 문서 (pod) 섹션의 시작으로 해석되며 다음 = cut까지의 모든 후속 줄은 컴파일러에서 무시됩니다. 다음은 예입니다-
#!/usr/bin/perl
# This is a single line comment
print "Hello, world\n";
=begin comment
This is all part of multiline comment.
You can use as many lines as you like
These comments will be ignored by the
compiler until the next =cut is encountered.
=cut
이것은 다음 결과를 생성합니다-
Hello, world
Perl의 공백
Perl 프로그램은 공백을 고려하지 않습니다. 다음 프로그램은 완벽하게 잘 작동합니다-
#!/usr/bin/perl
print "Hello, world\n";
그러나 인용 된 문자열 안에 공백이 있으면 그대로 인쇄됩니다. 예를 들면-
#!/usr/bin/perl
# This would print with a line break in the middle
print "Hello
world\n";
이것은 다음 결과를 생성합니다-
Hello
world
공백, 탭, 줄 바꿈 등과 같은 모든 유형의 공백은 따옴표 외부에서 사용될 때 인터프리터와 동일합니다. 공백 만 포함하고 주석이있는 줄을 빈 줄이라고하며 Perl은이를 완전히 무시합니다.
Perl의 작은 따옴표와 큰 따옴표
다음과 같이 리터럴 문자열 주위에 큰 따옴표 또는 작은 따옴표를 사용할 수 있습니다.
#!/usr/bin/perl
print "Hello, world\n";
print 'Hello, world\n';
이것은 다음 결과를 생성합니다-
Hello, world
Hello, world\n$
작은 따옴표와 큰 따옴표에는 중요한 차이가 있습니다. 큰 따옴표 만interpolate변수 및 개행 문자와 같은 특수 문자 \ n, 반면 작은 따옴표는 변수 나 특수 문자를 보간하지 않습니다. 값을 저장하고 나중에 그 값을 인쇄하기 위해 $ a를 변수로 사용하는 아래 예제를 확인하십시오.
#!/usr/bin/perl
$a = 10; print "Value of a = $a\n";
print 'Value of a = $a\n';
이것은 다음 결과를 생성합니다-
Value of a = 10
Value of a = $a\n$
"여기"문서
매우 편안하게 여러 줄 텍스트를 저장하거나 인쇄 할 수 있습니다. "here"문서 내에서 변수를 사용할 수도 있습니다. 다음은 간단한 구문입니다. <<와 식별자 사이에 공백이 없어야합니다.
식별자는 아래의 EOF에서 사용한 것처럼 맨 단어이거나 인용 된 텍스트 일 수 있습니다. 식별자가 인용 된 경우 사용하는 인용 유형에 따라 일반 인용에서와 마찬가지로 여기 문서 내부의 텍스트 처리가 결정됩니다. 인용되지 않은 식별자는 큰 따옴표처럼 작동합니다.
#!/usr/bin/perl
$a = 10;
$var = <<"EOF"; This is the syntax for here document and it will continue until it encounters a EOF in the first line. This is case of double quote so variable value will be interpolated. For example value of a = $a
EOF
print "$var\n"; $var = <<'EOF';
This is case of single quote so variable value will be
interpolated. For example value of a = $a EOF print "$var\n";
이것은 다음 결과를 생성합니다-
This is the syntax for here document and it will continue
until it encounters a EOF in the first line.
This is case of double quote so variable value will be
interpolated. For example value of a = 10
This is case of single quote so variable value will be
interpolated. For example value of a = $a
이스케이프 문자
Perl은 백 슬래시 (\) 문자를 사용하여 코드를 방해 할 수있는 모든 유형의 문자를 이스케이프합니다. 큰 따옴표와 $ 기호를 인쇄하려는 예를 하나 들어 보겠습니다.
#!/usr/bin/perl
$result = "This is \"number\""; print "$result\n";
print "\$result\n";
이것은 다음 결과를 생성합니다-
This is "number"
$result
Perl 식별자
Perl 식별자는 변수, 함수, 클래스, 모듈 또는 기타 개체를 식별하는 데 사용되는 이름입니다. Perl 변수 이름은 $, @ 또는 %로 시작하고 0 개 이상의 문자, 밑줄 및 숫자 (0-9)가 이어집니다.
Perl은 식별자 내에서 @, $ 및 %와 같은 구두점 문자를 허용하지 않습니다. Perl은case sensitive프로그래밍 언어. 그러므로$Manpower 과 $manpower Perl에서 두 개의 다른 식별자입니다.
Perl은 느슨한 형식의 언어이며 프로그램에서 사용하는 동안 데이터 형식을 지정할 필요가 없습니다. Perl 인터프리터는 데이터 자체의 컨텍스트에 따라 유형을 선택합니다.
Perl에는 스칼라, 스칼라 배열 및 연관 배열이라고도하는 스칼라 해시의 세 가지 기본 데이터 유형이 있습니다. 다음은 이러한 데이터 유형에 대한 세부 정보입니다.
Sr. 아니. | 유형 및 설명 |
---|---|
1 | Scalar 스칼라는 단순 변수입니다. 앞에 달러 기호 ($)가옵니다. 스칼라는 숫자, 문자열 또는 참조입니다. 참조는 실제로 변수의 주소이며 다음 장에서 볼 것입니다. |
2 | Arrays 배열은 0으로 시작하는 숫자 인덱스로 액세스하는 순서가 지정된 스칼라 목록입니다. 앞에 "at"기호 (@)가옵니다. |
삼 | Hashes 해시는 키를 첨자로 사용하여 액세스하는 키 / 값 쌍의 순서가 지정되지 않은 집합입니다. 앞에 퍼센트 기호 (%)가옵니다. |
숫자 리터럴
Perl은 모든 숫자를 내부적으로 부호있는 정수 또는 배정 밀도 부동 소수점 값으로 저장합니다. 숫자 리터럴은 다음 부동 소수점 또는 정수 형식으로 지정됩니다.
유형 | 값 |
---|---|
정수 | 1234 |
음의 정수 | -100 |
부동 소수점 | 2000 년 |
과학적 표기법 | 16.12E14 |
16 진수 | 0xffff |
8 진법 | 0577 |
문자열 리터럴
문자열은 일련의 문자입니다. 일반적으로 작은 따옴표 ( ') 또는 큰 따옴표 ( ")로 구분 된 영숫자 값입니다. 작은 따옴표 문자열과 큰 따옴표 문자열을 사용할 수있는 UNIX 쉘 따옴표와 매우 유사합니다.
큰 따옴표로 묶인 문자열 리터럴은 변수 보간을 허용하지만 작은 따옴표로 묶인 문자열은 그렇지 않습니다. 백 슬래시로 진행되는 특정 문자는 특별한 의미를 가지며 개행 문자 (\ n) 또는 탭 (\ t)과 같이 표현하는 데 사용됩니다.
줄 바꿈 또는 다음 이스케이프 시퀀스를 큰 따옴표로 묶은 문자열에 직접 포함 할 수 있습니다.
탈출 시퀀스 | 의미 |
---|---|
\\ | 백 슬래시 |
\ ' | 작은 따옴표 |
\ " | 큰 따옴표 |
\ㅏ | 경고 또는 벨 |
\비 | 역행 키이 |
\에프 | 양식 피드 |
\엔 | 개행 |
\아르 자형 | 캐리지 리턴 |
\티 | 수평 탭 |
\V | 수직 탭 |
\ 0nn | 8 진수 형식의 숫자를 만듭니다. |
\ xnn | 16 진수 형식의 숫자를 만듭니다. |
\ cX | 제어 문자, x는 임의의 문자 일 수 있습니다. |
\유 | 다음 문자를 대문자로 강제 |
\엘 | 다음 문자를 소문자로 강제 |
\유 | 다음 문자를 모두 대문자로 강제 적용 |
\엘 | 다음 문자를 모두 소문자로 강제 설정 |
\큐 | 다음의 영숫자가 아닌 문자 모두 백 슬래시 |
\이자형 | \ U, \ L 또는 \ Q 끝 |
예
문자열이 작은 따옴표와 큰 따옴표로 어떻게 작동하는지 다시 살펴 보겠습니다. 여기서는 위의 표에서 언급 한 문자열 이스케이프를 사용하고 스칼라 변수를 사용하여 문자열 값을 할당합니다.
#!/usr/bin/perl
# This is case of interpolation.
$str = "Welcome to \ntutorialspoint.com!";
print "$str\n"; # This is case of non-interpolation. $str = 'Welcome to \ntutorialspoint.com!';
print "$str\n"; # Only W will become upper case. $str = "\uwelcome to tutorialspoint.com!";
print "$str\n"; # Whole line will become capital. $str = "\UWelcome to tutorialspoint.com!";
print "$str\n"; # A portion of line will become capital. $str = "Welcome to \Ututorialspoint\E.com!";
print "$str\n"; # Backsalash non alpha-numeric including spaces. $str = "\QWelcome to tutorialspoint's family";
print "$str\n";
이것은 다음 결과를 생성합니다-
Welcome to
tutorialspoint.com!
Welcome to \ntutorialspoint.com!
Welcome to tutorialspoint.com!
WELCOME TO TUTORIALSPOINT.COM!
Welcome to TUTORIALSPOINT.com!
Welcome\ to\ tutorialspoint\'s\ family
변수는 값을 저장하기 위해 예약 된 메모리 위치입니다. 이것은 변수를 만들 때 메모리에 약간의 공간을 예약한다는 것을 의미합니다.
변수의 데이터 유형에 따라 인터프리터는 메모리를 할당하고 예약 된 메모리에 저장할 수있는 항목을 결정합니다. 따라서 변수에 다른 데이터 유형을 할당하여 이러한 변수에 정수, 십진수 또는 문자열을 저장할 수 있습니다.
우리는 Perl이 다음과 같은 세 가지 기본 데이터 유형을 가지고 있음을 배웠습니다.
- Scalars
- Arrays
- Hashes
따라서 Perl에서는 세 가지 유형의 변수를 사용할 것입니다. ㅏscalar변수 앞에 달러 기호 ($)가오고 숫자, 문자열 또는 참조를 저장할 수 있습니다. 안array변수 앞에 @ 기호가오고 순서가 지정된 스칼라 목록을 저장합니다. 마지막으로Hash 변수 앞에 % 기호가오고 키 / 값 쌍 집합을 저장하는 데 사용됩니다.
Perl은 모든 변수 유형을 별도의 네임 스페이스에 유지합니다. 따라서 충돌에 대한 두려움없이 스칼라 변수, 배열 또는 해시에 동일한 이름을 사용할 수 있습니다. 이것은 $ foo와 @foo가 두 개의 다른 변수라는 것을 의미합니다.
변수 생성
Perl 변수는 메모리 공간을 예약하기 위해 명시 적으로 선언 할 필요가 없습니다. 변수에 값을 할당하면 선언이 자동으로 발생합니다. 등호 (=)는 변수에 값을 할당하는 데 사용됩니다.
다음을 사용하는 경우 사용하기 전에 변수를 선언해야합니다. use strict 우리 프로그램의 성명.
= 연산자의 왼쪽에있는 피연산자는 변수의 이름이고 = 연산자의 오른쪽에있는 피연산자는 변수에 저장된 값입니다. 예를 들면-
$age = 25; # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50; # A floating point
여기서 25, "John Paul"및 1445.50은 각각 $ age , $ name 및 $ salary 변수에 할당 된 값 입니다. 곧 배열과 해시에 값을 할당하는 방법을 살펴 보겠습니다.
스칼라 변수
스칼라는 단일 데이터 단위입니다. 해당 데이터는 정수, 부동 소수점, 문자, 문자열, 단락 또는 전체 웹 페이지 일 수 있습니다. 간단히 말해서 무엇이든 될 수 있지만 단 하나뿐입니다.
다음은 스칼라 변수를 사용하는 간단한 예입니다.
#!/usr/bin/perl
$age = 25; # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50; # A floating point
print "Age = $age\n"; print "Name = $name\n";
print "Salary = $salary\n";
이것은 다음 결과를 생성합니다-
Age = 25
Name = John Paul
Salary = 1445.5
배열 변수
배열은 정렬 된 스칼라 값 목록을 저장하는 변수입니다. 배열 변수 앞에는 "at"(@) 기호가 있습니다. 배열의 단일 요소를 참조하려면 변수 이름과 함께 달러 기호 ($)를 사용하고 그 뒤에 대괄호로 묶인 요소의 인덱스를 사용합니다.
다음은 배열 변수를 사용하는 간단한 예입니다.
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");
print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";
여기서 우리는 $ 기호 앞에 이스케이프 기호 (\)를 사용하여 인쇄했습니다. 다른 Perl은 그것을 변수로 이해하고 그 값을 출력 할 것입니다. 실행되면 다음 결과가 생성됩니다.
$ages[0] = 25
$ages[1] = 30 $ages[2] = 40
$names[0] = John Paul $names[1] = Lisa
$names[2] = Kumar
해시 변수
해시는 key/value한 쌍. 해시 변수 앞에는 백분율 (%) 기호가 있습니다. 해시의 단일 요소를 참조하려면 중괄호로 묶인 값과 연관된 "키"가 뒤에 오는 해시 변수 이름을 사용합니다.
다음은 해시 변수를 사용하는 간단한 예입니다.
#!/usr/bin/perl
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";
이것은 다음 결과를 생성합니다-
$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40
가변 컨텍스트
Perl은 Context, 즉 변수가 사용되는 상황에 따라 동일한 변수를 다르게 취급합니다. 다음 예를 확인해 보겠습니다.
#!/usr/bin/perl
@names = ('John Paul', 'Lisa', 'Kumar');
@copy = @names;
$size = @names; print "Given names are : @copy\n"; print "Number of names are : $size\n";
이것은 다음 결과를 생성합니다-
Given names are : John Paul Lisa Kumar
Number of names are : 3
여기서 @names는 두 가지 다른 컨텍스트에서 사용 된 배열입니다. 먼저 다른 배열, 즉 목록에 복사하여 컨텍스트가 목록 컨텍스트라고 가정하고 모든 요소를 반환했습니다. 다음으로 동일한 배열을 사용하고이 배열을 스칼라에 저장하려고했기 때문에이 경우 컨텍스트가 스칼라 컨텍스트라고 가정하고이 배열의 요소 수만 반환했습니다. 다음 표에는 다양한 컨텍스트가 나열되어 있습니다.
Sr. 아니. | 컨텍스트 및 설명 |
---|---|
1 | Scalar 스칼라 변수에 대한 할당은 스칼라 컨텍스트에서 우변을 평가합니다. |
2 | List 배열 또는 해시에 대한 할당은 목록 컨텍스트에서 오른쪽을 평가합니다. |
삼 | Boolean 부울 컨텍스트는 표현식이 참인지 거짓인지 확인하기 위해 평가되는 모든 위치입니다. |
4 | Void 이 컨텍스트는 반환 값이 무엇인지 신경 쓰지 않을뿐만 아니라 반환 값도 원하지 않습니다. |
5 | Interpolative 이 컨텍스트는 따옴표 내에서만 발생하거나 따옴표처럼 작동하는 것입니다. |
스칼라는 단일 데이터 단위입니다. 해당 데이터는 정수, 부동 소수점, 문자, 문자열, 단락 또는 전체 웹 페이지 일 수 있습니다.
다음은 스칼라 변수를 사용하는 간단한 예입니다.
#!/usr/bin/perl
$age = 25; # An integer assignment $name = "John Paul"; # A string
$salary = 1445.50; # A floating point print "Age = $age\n";
print "Name = $name\n"; print "Salary = $salary\n";
이것은 다음 결과를 생성합니다-
Age = 25
Name = John Paul
Salary = 1445.5
숫자 형 스칼라
스칼라는 대부분 숫자 또는 문자열입니다. 다음 예제는 다양한 유형의 숫자 형 스칼라 사용을 보여줍니다.
#!/usr/bin/perl
$integer = 200; $negative = -300;
$floating = 200.340; $bigfloat = -1.2E-23;
# 377 octal, same as 255 decimal
$octal = 0377; # FF hex, also 255 decimal $hexa = 0xff;
print "integer = $integer\n"; print "negative = $negative\n";
print "floating = $floating\n"; print "bigfloat = $bigfloat\n";
print "octal = $octal\n"; print "hexa = $hexa\n";
이것은 다음 결과를 생성합니다-
integer = 200
negative = -300
floating = 200.34
bigfloat = -1.2e-23
octal = 255
hexa = 255
문자열 스칼라
다음 예제는 다양한 유형의 문자열 스칼라 사용을 보여줍니다. 작은 따옴표로 묶인 문자열과 큰 따옴표로 묶은 문자열의 차이점을 확인하세요.
#!/usr/bin/perl
$var = "This is string scalar!"; $quote = 'I m inside single quote - $var'; $double = "This is inside single quote - $var"; $escape = "This example of escape -\tHello, World!";
print "var = $var\n"; print "quote = $quote\n";
print "double = $double\n"; print "escape = $escape\n";
이것은 다음 결과를 생성합니다-
var = This is string scalar!
quote = I m inside single quote - $var
double = This is inside single quote - This is string scalar!
escape = This example of escape - Hello, World
스칼라 연산
Perl에서 사용할 수있는 다양한 연산자에 대한 자세한 내용은 별도의 장에서 볼 수 있지만 여기에서는 몇 가지 숫자 및 문자열 연산을 나열합니다.
#!/usr/bin/perl
$str = "hello" . "world"; # Concatenates strings.
$num = 5 + 10; # adds two numbers. $mul = 4 * 5; # multiplies two numbers.
$mix = $str . $num; # concatenates string and number. print "str = $str\n";
print "num = $num\n"; print "mix = $mix\n";
이것은 다음 결과를 생성합니다-
str = helloworld
num = 15
mul = 20
mix = helloworld15
여러 줄 문자열
프로그램에 여러 줄 문자열을 도입하려면 다음과 같이 표준 작은 따옴표를 사용할 수 있습니다.
#!/usr/bin/perl
$string = 'This is a multiline string'; print "$string\n";
이것은 다음 결과를 생성합니다-
This is
a multiline
string
"여기"문서 구문을 사용하여 아래와 같이 여러 줄을 저장하거나 인쇄 할 수 있습니다.
#!/usr/bin/perl
print <<EOF;
This is
a multiline
string
EOF
이것은 또한 동일한 결과를 생성합니다-
This is
a multiline
string
V- 스트링
v1.20.300.4000 형식의 리터럴은 지정된 서수를 가진 문자로 구성된 문자열로 구문 분석됩니다. 이 형식을 v- 문자열이라고합니다.
v- 문자열은 다소 읽기 어려운 보간 형식 "\ x {1} \ x {14} \ x {12c} \ x {fa0}"를 사용하는 대신 문자열을 구성하는 대안적이고 읽기 쉬운 방법을 제공합니다.
av로 시작하고 그 뒤에 하나 이상의 점으로 구분 된 요소가 오는 리터럴입니다. 예를 들면-
#!/usr/bin/perl
$smile = v9786; $foo = v102.111.111;
$martin = v77.97.114.116.105.110; print "smile = $smile\n";
print "foo = $foo\n"; print "martin = $martin\n";
이것은 또한 동일한 결과를 생성합니다-
smile = ☺
foo = foo
martin = Martin
Wide character in print at main.pl line 7.
특수 리터럴
지금까지 문자열 스칼라와 그 연결 및 보간 연산에 대해 알고 있어야합니다. 따라서 세 가지 특수 리터럴 __FILE__, __LINE__ 및 __PACKAGE__는 프로그램의 해당 지점에서 현재 파일 이름, 줄 번호 및 패키지 이름을 나타냅니다.
별도의 토큰으로 만 사용할 수 있으며 문자열로 보간되지 않습니다. 아래 예를 확인하십시오-
#!/usr/bin/perl
print "File name ". __FILE__ . "\n";
print "Line Number " . __LINE__ ."\n";
print "Package " . __PACKAGE__ ."\n";
# they can not be interpolated
print "__FILE__ __LINE__ __PACKAGE__\n";
이것은 다음 결과를 생성합니다-
File name hello.pl
Line Number 4
Package main
__FILE__ __LINE__ __PACKAGE__
배열은 정렬 된 스칼라 값 목록을 저장하는 변수입니다. 배열 변수 앞에는 "at"(@) 기호가 있습니다. 배열의 단일 요소를 참조하려면 변수 이름과 함께 달러 기호 ($)를 사용하고 그 뒤에 대괄호로 묶인 요소의 인덱스를 사용합니다.
다음은 배열 변수를 사용하는 간단한 예입니다.
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");
print "\$ages[0] = $ages[0]\n"; print "\$ages[1] = $ages[1]\n"; print "\$ages[2] = $ages[2]\n"; print "\$names[0] = $names[0]\n"; print "\$names[1] = $names[1]\n"; print "\$names[2] = $names[2]\n";
여기에서는 $ 기호 앞에 이스케이프 기호 (\)를 사용하여 인쇄했습니다. 다른 Perl은 그것을 변수로 이해하고 그 값을 출력 할 것입니다. 실행되면 다음 결과가 생성됩니다.
$ages[0] = 25 $ages[1] = 30
$ages[2] = 40 $names[0] = John Paul
$names[1] = Lisa $names[2] = Kumar
Perl에서 List 및 Array 용어는 종종 상호 교환 가능한 것처럼 사용됩니다. 그러나 목록은 데이터이고 배열은 변수입니다.
어레이 생성
배열 변수는 @ 기호로 시작되며 괄호 또는 qw 연산자를 사용하여 채워집니다. 예를 들면-
@array = (1, 2, 'Hello');
@array = qw/This is an array/;
두 번째 줄은 문자열 목록을 반환하는 qw // 연산자를 사용하여 구분 된 문자열을 공백으로 구분합니다. 이 예에서는 요소가 4 개인 배열이됩니다. 첫 번째 요소는 'this'이고 마지막 (네 번째) 요소는 'array'입니다. 이것은 다음과 같이 다른 줄을 사용할 수 있음을 의미합니다.
@days = qw/Monday
Tuesday
...
Sunday/;
다음과 같이 각 값을 개별적으로 할당하여 배열을 채울 수도 있습니다.
$array[0] = 'Monday'; ... $array[6] = 'Sunday';
배열 요소에 액세스
배열에서 개별 요소에 액세스 할 때 변수 앞에 달러 기호 ($)를 붙인 다음 변수 이름 뒤에 대괄호 안에 요소 인덱스를 추가해야합니다. 예를 들면-
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
print "$days[0]\n";
print "$days[1]\n"; print "$days[2]\n";
print "$days[6]\n"; print "$days[-1]\n";
print "$days[-7]\n";
이것은 다음 결과를 생성합니다-
Mon
Tue
Wed
Sun
Sun
Mon
배열 인덱스는 0부터 시작하므로 첫 번째 요소에 액세스하려면 0을 인덱스로 제공해야합니다. 음수 인덱스를 제공 할 수도 있습니다.이 경우 배열의 시작이 아닌 끝에서 요소를 선택합니다. 이것은 다음을 의미합니다-
print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon
순차 배열
Perl은 연속되는 숫자와 문자에 대한 단축키를 제공합니다. 예를 들어 100까지 셀 때 각 요소를 입력하는 대신 다음과 같이 할 수 있습니다.
#!/usr/bin/perl
@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);
print "@var_10\n"; # Prints number from 1 to 10
print "@var_20\n"; # Prints number from 10 to 20
print "@var_abc\n"; # Prints number from a to z
여기서 이중 점 (..)이라고합니다. range operator. 이것은 다음 결과를 생성합니다-
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z
어레이 크기
배열의 크기는 배열의 스칼라 컨텍스트를 사용하여 결정될 수 있습니다. 반환 된 값은 배열의 요소 수입니다.
@array = (1,2,3);
print "Size: ",scalar @array,"\n";
반환되는 값은 항상 유효한 요소 수가 아니라 배열의 물리적 크기입니다. 이것을 증명할 수 있으며,이 조각을 사용하여 스칼라 @array와 $ # array의 차이점은 다음과 같습니다.
#!/usr/bin/perl
@array = (1,2,3);
$array[50] = 4; $size = @array;
$max_index = $#array;
print "Size: $size\n"; print "Max Index: $max_index\n";
이것은 다음 결과를 생성합니다-
Size: 51
Max Index: 50
정보를 포함하는 배열에는 4 개의 요소 만 있지만 배열의 길이는 51 개이며 가장 높은 인덱스는 50입니다.
배열에서 요소 추가 및 제거
Perl은 배열에서 요소를 추가하고 제거하는 데 유용한 여러 기능을 제공합니다. 함수가 무엇인지 궁금 할 수 있습니다. 지금까지 당신은print다양한 값을 인쇄하는 기능. 마찬가지로 다양한 다른 기능에 사용할 수있는 다양한 다른 기능 또는 때로는 서브 루틴이라고도합니다.
Sr. 아니. | 유형 및 설명 |
---|---|
1 | push @ARRAY, LIST 목록의 값을 배열의 끝에 푸시합니다. |
2 | pop @ARRAY 팝 오프하고 배열의 마지막 값을 반환합니다. |
삼 | shift @ARRAY 배열의 첫 번째 값을 해제하고 반환하여 배열을 1만큼 줄이고 모든 값을 아래로 이동합니다. |
4 | unshift @ARRAY, LIST 목록을 배열 앞에 추가하고 새 배열의 요소 수를 반환합니다. |
#!/usr/bin/perl
# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins = @coins\n";
# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins = @coins\n";
# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins = @coins\n";
# remove one element from the last of the array.
pop(@coins);
print "4. \@coins = @coins\n";
# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins = @coins\n";
이것은 다음 결과를 생성합니다-
1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel
배열 요소 슬라이스
배열에서 "슬라이스"를 추출 할 수도 있습니다. 즉, 다른 배열을 생성하기 위해 배열에서 둘 이상의 항목을 선택할 수 있습니다.
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @days[3,4,5];
print "@weekdays\n";
이것은 다음 결과를 생성합니다-
Thu Fri Sat
슬라이스에 대한 사양에는 각각 쉼표로 구분 된 양수 또는 음수 인 유효한 색인 목록이 있어야합니다. 속도를 위해.. 범위 연산자-
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @days[3..5];
print "@weekdays\n";
이것은 다음 결과를 생성합니다-
Thu Fri Sat
배열 요소 교체
이제 우리는 splice(), 다음과 같은 구문-
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
이 함수는 OFFSET 및 LENGTH로 지정된 @ARRAY의 요소를 제거하고 지정된 경우 LIST로 대체합니다. 마지막으로 배열에서 제거 된 요소를 반환합니다. 다음은 예입니다-
#!/usr/bin/perl
@nums = (1..20);
print "Before - @nums\n";
splice(@nums, 5, 5, 21..25);
print "After - @nums\n";
이것은 다음 결과를 생성합니다-
Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
여기서 실제 교체는 6 번째 숫자로 시작하고 5 개의 요소가 6에서 10까지 숫자 21, 22, 23, 24 및 25로 교체 된 후 시작됩니다.
문자열을 배열로 변환
라는 함수를 하나 더 살펴 보겠습니다. split(), 다음과 같은 구문-
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
이 함수는 문자열을 문자열 배열로 분할하고 반환합니다. LIMIT가 지정된 경우 최대 해당 수의 필드로 분할됩니다. PATTERN이 생략되면 공백으로 분할됩니다. 다음은 예입니다-
#!/usr/bin/perl
# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";
# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);
print "$string[3]\n"; # This will print Roses print "$names[4]\n"; # This will print Michael
이것은 다음 결과를 생성합니다-
Roses
Michael
배열을 문자열로 변환
우리는 join()함수를 사용하여 배열 요소를 다시 결합하고 하나의 긴 스칼라 문자열을 형성합니다. 이 함수에는 다음과 같은 구문이 있습니다.
join EXPR, LIST
이 함수는 LIST의 개별 문자열을 EXPR 값으로 구분 된 필드가있는 단일 문자열로 결합하고 문자열을 반환합니다. 다음은 예입니다-
#!/usr/bin/perl
# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";
# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);
$string1 = join( '-', @string ); $string2 = join( ',', @names );
print "$string1\n"; print "$string2\n";
이것은 다음 결과를 생성합니다-
Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom
배열 정렬
그만큼 sort()함수는 ASCII 숫자 표준에 따라 배열의 각 요소를 정렬합니다. 이 함수에는 다음과 같은 구문이 있습니다.
sort [ SUBROUTINE ] LIST
이 함수는 LIST를 정렬하고 정렬 된 배열 값을 반환합니다. SUBROUTINE이 지정되면 요소를 정렬하는 동안 SUBTROUTINE 내부에 지정된 논리가 적용됩니다.
#!/usr/bin/perl
# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";
# sort this array
@foods = sort(@foods);
print "After: @foods\n";
이것은 다음 결과를 생성합니다-
Before: pizza steak chicken burgers
After: burgers chicken pizza steak
정렬은 단어의 ASCII 숫자 값을 기준으로 수행됩니다. 따라서 가장 좋은 방법은 먼저 배열의 모든 요소를 소문자로 변환 한 다음 정렬 기능을 수행하는 것입니다.
배열 병합
배열은 쉼표로 구분 된 값 시퀀스이기 때문에 아래와 같이 결합 할 수 있습니다.
#!/usr/bin/perl
@numbers = (1,3,(4,5,6));
print "numbers = @numbers\n";
이것은 다음 결과를 생성합니다-
numbers = 1 3 4 5 6
임베디드 배열은 아래와 같이 메인 배열의 일부가됩니다.
#!/usr/bin/perl
@odd = (1,3,5);
@even = (2, 4, 6);
@numbers = (@odd, @even);
print "numbers = @numbers\n";
이것은 다음 결과를 생성합니다-
numbers = 1 3 5 2 4 6
목록에서 요소 선택
목록 표기법은 배열 표기법과 동일합니다. 목록에 대괄호를 추가하고 하나 이상의 인덱스를 제공하여 배열에서 요소를 추출 할 수 있습니다.
#!/usr/bin/perl
$var = (5,4,3,2,1)[4]; print "value of var = $var\n"
이것은 다음 결과를 생성합니다-
value of var = 1
마찬가지로 선행 @ 문자가 없어도 슬라이스를 추출 할 수 있습니다.
#!/usr/bin/perl
@list = (5,4,3,2,1)[1..3];
print "Value of list = @list\n";
이것은 다음 결과를 생성합니다-
Value of list = 4 3 2
해시는 key/value한 쌍. 해시 변수 앞에는 백분율 (%) 기호가 있습니다. 해시의 단일 요소를 참조하려면 해시 변수 이름 앞에 "$"기호를 사용하고 그 뒤에 중괄호로 묶인 값과 관련된 "키"를 사용합니다.
다음은 해시 변수를 사용하는 간단한 예입니다.
#!/usr/bin/perl
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";
이것은 다음 결과를 생성합니다-
$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40
해시 만들기
해시는 다음 두 가지 방법 중 하나로 만들어집니다. 첫 번째 방법에서는 이름이 지정된 키에 하나씩 값을 할당합니다.
$data{'John Paul'} = 45; $data{'Lisa'} = 30;
$data{'Kumar'} = 40;
두 번째 경우에는 목록에서 개별 쌍을 가져와 변환 된 목록을 사용합니다. 쌍의 첫 번째 요소는 키로 사용되고 두 번째 요소는 값으로 사용됩니다. 예를 들면-
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
명확성을 위해 =>를 별칭으로 사용하여 다음과 같이 키 / 값 쌍을 나타낼 수 있습니다.
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
여기에 위의 형태의 변형이 하나 더 있습니다. 살펴보십시오. 여기에서 모든 키 앞에 하이픈 (-)이오고 그 주위에 따옴표가 필요하지 않습니다.
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
그러나 한 단어가 있다는 점에 유의하는 것이 중요합니다. 즉, 공백없이 키가 이러한 형태의 해시 형성에 사용되었으며 이러한 방식으로 해시를 구축하면 아래 표시된 대로만 하이픈을 사용하여 키에 액세스 할 수 있습니다.
$val = %data{-JohnPaul}
$val = %data{-Lisa}
해시 요소 액세스
해시에서 개별 요소에 액세스 할 때 변수 앞에 달러 기호 ($)를 붙인 다음 변수 이름 뒤에 중괄호 안에 요소 키를 추가해야합니다. 예를 들면-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
print "$data{'John Paul'}\n"; print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";
이것은 다음 결과를 생성합니다-
45
30
40
슬라이스 추출
배열에서 조각을 추출 할 수있는 것처럼 해시 조각을 추출 할 수 있습니다. 반환 된 값을 저장하려면 변수에 @ 접두사를 사용해야합니다.
#!/uer/bin/perl
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
@array = @data{-JohnPaul, -Lisa};
print "Array : @array\n";
이것은 다음 결과를 생성합니다-
Array : 45 30
키 및 값 추출
다음을 사용하여 해시에서 모든 키 목록을 가져올 수 있습니다. keys 다음 구문이있는 함수-
keys %HASH
이 함수는 명명 된 해시의 모든 키 배열을 반환합니다. 다음은 예입니다-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@names = keys %data;
print "$names[0]\n";
print "$names[1]\n"; print "$names[2]\n";
이것은 다음 결과를 생성합니다-
Lisa
John Paul
Kumar
마찬가지로 다음을 사용할 수 있습니다. values모든 값의 목록을 가져 오는 함수입니다. 이 함수에는 다음과 같은 구문이 있습니다.
values %HASH
이 함수는 명명 된 해시의 모든 값으로 구성된 일반 배열을 반환합니다. 다음은 예입니다-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@ages = values %data;
print "$ages[0]\n"; print "$ages[1]\n";
print "$ages[2]\n";
이것은 다음 결과를 생성합니다-
30
45
40
존재 여부 확인
존재하지 않는 해시에서 키 / 값 쌍에 액세스하려고하면 일반적으로 undefined값이 있고 경고가 켜져있는 경우 런타임에 경고가 생성됩니다. 이 문제를 해결하려면exists 그 값이 무엇인지에 관계없이 명명 된 키가 존재하면 true를 반환하는 함수
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
if( exists($data{'Lisa'} ) ) {
print "Lisa is $data{'Lisa'} years old\n";
} else {
print "I don't know age of Lisa\n";
}
여기에서 IF ... ELSE 문을 소개했으며, 별도의 장에서 공부할 것입니다. 지금은if( condition ) 주어진 조건이 참일 때만 부분이 실행됩니다. else부분이 실행됩니다. 따라서 위의 프로그램을 실행하면 주어진 조건 이 존재 하기 때문에 다음과 같은 결과가 생성됩니다 ($ data { 'Lisa'} 는 true를 반환합니다-
Lisa is 30 years old
해시 크기 얻기
키 또는 값에 스칼라 컨텍스트를 사용하여 크기, 즉 해시의 요소 수를 가져올 수 있습니다. 간단히 말해서 먼저 키 또는 값의 배열을 가져와야하며 다음과 같이 배열의 크기를 얻을 수 있습니다.
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";
@values = values %data;
$size = @values; print "2 - Hash size: is $size\n";
이것은 다음 결과를 생성합니다-
1 - Hash size: is 3
2 - Hash size: is 3
해시에서 요소 추가 및 제거
간단한 할당 연산자를 사용하여 한 줄의 코드로 새 키 / 값 쌍을 추가 할 수 있습니다. 그러나 해시에서 요소를 제거하려면delete 예에서 아래 표시된 기능-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";
# adding an element to the hash;
$data{'Ali'} = 55; @keys = keys %data; $size = @keys;
print "2 - Hash size: is $size\n"; # delete the same element from the hash; delete $data{'Ali'};
@keys = keys %data;
$size = @keys; print "3 - Hash size: is $size\n";
이것은 다음 결과를 생성합니다-
1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3
Perl 조건문은 의사 결정에 도움이되며, 이는 프로그래머가 조건이 참인 경우 실행될 명령문과 함께 프로그램에서 평가하거나 테스트 할 하나 이상의 조건을 지정해야하며 선택적으로 기타 조건이 거짓으로 결정되면 실행될 명령문.
다음은 대부분의 프로그래밍 언어에서 발견되는 일반적인 의사 결정 구조의 일반입니다.
숫자 0, 문자열 '0'및 "", 빈 목록 () 및 undef는 모두 false 부울 컨텍스트에서 다른 모든 값은 true. 진정한 가치의 부정! 또는 not 특별한 거짓 값을 반환합니다.
Perl 프로그래밍 언어는 다음 유형의 조건문을 제공합니다.
Sr. 아니. | 성명 및 설명 |
---|---|
1 | if 문 안 if statement 부울 표현식과 하나 이상의 문으로 구성됩니다. |
2 | if ... else 문 안 if statement 뒤에 선택 사항이 올 수 있습니다. else statement. |
삼 | if ... elsif ... else 문 안 if statement 뒤에 선택 사항이 올 수 있습니다. elsif statement 그런 다음 선택 사항 else statement. |
4 | 진술이 없으면 안 unless statement 부울 표현식과 하나 이상의 문으로 구성됩니다. |
5 | ... else 문 안 unless statement 뒤에 선택 사항이 올 수 있습니다. else statement. |
6 | un ... elsif..else 문 안 unless statement 뒤에 선택 사항이 올 수 있습니다. elsif statement 그런 다음 선택 사항 else statement. |
7 | switch 문 최신 버전의 Perl을 사용하면 switch성명서. 다양한 조건에 대해 변수 값을 비교하는 간단한 방법을 허용합니다. |
? : 운영자
확인합시다 conditional operator ? :대체하는 데 사용할 수 있습니다 if...else진술. 그것은 다음과 같은 일반적인 형태를 가지고 있습니다-
Exp1 ? Exp2 : Exp3;
Exp1, Exp2 및 Exp3은 표현식입니다. 콜론의 사용과 배치에 주목하십시오.
값은? 식은 다음과 같이 결정됩니다. Exp1이 평가됩니다. 참이면 Exp2가 평가되고 전체?의 값이됩니다. 표현. Exp1이 false이면 Exp3이 평가되고 해당 값이 표현식의 값이됩니다. 다음은이 연산자를 사용하는 간단한 예입니다.
#!/usr/local/bin/perl
$name = "Ali"; $age = 10;
$status = ($age > 60 )? "A senior citizen" : "Not a senior citizen";
print "$name is - $status\n";
이것은 다음 결과를 생성합니다-
Ali is - Not a senior citizen
코드 블록을 여러 번 실행해야하는 상황이있을 수 있습니다. 일반적으로 명령문은 순차적으로 실행됩니다. 함수의 첫 번째 명령문이 먼저 실행되고 두 번째 명령문이 실행되는 식입니다.
프로그래밍 언어는보다 복잡한 실행 경로를 허용하는 다양한 제어 구조를 제공합니다.
루프 문을 사용하면 문 또는 문 그룹을 여러 번 실행할 수 있으며 다음은 대부분의 프로그래밍 언어에서 루프 문의 일반적인 형식입니다.
Perl 프로그래밍 언어는 루핑 요구 사항을 처리하기 위해 다음 유형의 루프를 제공합니다.
Sr. 아니. | 루프 유형 및 설명 |
---|---|
1 | while 루프 주어진 조건이 참인 동안 명령문 또는 명령문 그룹을 반복합니다. 루프 본문을 실행하기 전에 조건을 테스트합니다. |
2 | 루프까지 주어진 조건이 참이 될 때까지 명령문 또는 명령문 그룹을 반복합니다. 루프 본문을 실행하기 전에 조건을 테스트합니다. |
삼 | for 루프 일련의 명령문을 여러 번 실행하고 루프 변수를 관리하는 코드를 축약합니다. |
4 | foreach 루프 foreach 루프는 일반 목록 값을 반복하고 변수 VAR을 목록의 각 요소로 차례로 설정합니다. |
5 | do ... while 루프 while 문과 비슷하지만 루프 본문의 끝에서 조건을 테스트한다는 점이 다릅니다. |
6 | 중첩 된 루프 while, for 또는 do..while 루프 내에서 하나 이상의 루프를 사용할 수 있습니다. |
루프 제어문
루프 제어문은 정상적인 순서에서 실행을 변경합니다. 실행이 범위를 벗어나면 해당 범위에서 생성 된 모든 자동 개체가 삭제됩니다.
Perl은 다음 제어문을 지원합니다. 세부 사항을 확인하려면 다음 링크를 클릭하십시오.
Sr. 아니. | 제어문 및 설명 |
---|---|
1 | 다음 진술 루프가 본문의 나머지 부분을 건너 뛰고 반복하기 전에 즉시 상태를 다시 테스트하도록합니다. |
2 | 마지막 진술 루프 문을 종료하고 루프 바로 다음 문으로 실행을 전송합니다. |
삼 | 계속 진술 계속 BLOCK은 조건이 다시 평가되기 직전에 항상 실행됩니다. |
4 | 재실행 진술 redo 명령은 조건을 다시 평가하지 않고 루프 블록을 다시 시작합니다. 계속 블록이있는 경우 실행되지 않습니다. |
5 | goto 문 Perl은 goto label, goto expr 및 goto & name의 세 가지 형식으로 goto 명령을 지원합니다. |
무한 루프
조건이 거짓이되지 않으면 루프는 무한 루프가됩니다. 그만큼for루프는 전통적으로 이러한 목적으로 사용됩니다. 세 가지 표현 중 어느 것도 형성하지 않기 때문에for 루프가 필요하면 조건식을 비워 두어 무한 루프를 만들 수 있습니다.
#!/usr/local/bin/perl
for( ; ; ) {
printf "This loop will run forever.\n";
}
Ctrl + C 키를 눌러 위의 무한 루프를 종료 할 수 있습니다.
조건식이 없으면 참으로 간주됩니다. 초기화 및 증분식이있을 수 있지만 프로그래머는 더 일반적으로 for (;;) 구문을 사용하여 무한 루프를 나타냅니다.
운영자는 무엇입니까?
4 + 5 is equal to 9 식을 사용하여 간단한 답을 얻을 수 있습니다 . 여기서 4와 5는 피연산자, +는 연산자라고합니다. Perl 언어는 많은 연산자 유형을 지원하지만 다음은 중요하고 가장 자주 사용되는 연산자 목록입니다.
- 산술 연산자
- 평등 연산자
- 논리 연산자
- 할당 연산자
- 비트 연산자
- 논리 연산자
- 따옴표와 유사한 연산자
- 기타 연산자
모든 연산자를 하나씩 살펴 보겠습니다.
Perl 산술 연산자
변수 가정 $a holds 10 and variable $b는 20을 보유하고 다음은 Perl 산술 연산자입니다.
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | + ( Addition ) 연산자의 양쪽에 값을 추가합니다. Example − $a + $b는 30을 줄 것입니다 |
2 | - (Subtraction) 왼쪽 피연산자에서 오른쪽 피연산자를 뺍니다. Example − $a - $b는 -10을 줄 것입니다 |
삼 | * (Multiplication) 연산자의 양쪽에 값을 곱합니다. Example − $a * $b는 200을 줄 것입니다 |
4 | / (Division) 왼손 피연산자를 오른손 피연산자로 나눕니다. Example − $b / $a는 2를 준다 |
5 | % (Modulus) 왼손 피연산자를 오른손 피연산자로 나누고 나머지를 반환합니다. Example − $b % $a는 0을 준다 |
6 | ** (Exponent) 연산자에 대한 지수 (승수) 계산을 수행합니다. Example − $a**$b는 20의 제곱에 10을 줄 것입니다. |
Perl 동등 연산자
관계 연산자라고도합니다. 변수 가정$a holds 10 and variable $b는 20을 보유하고 다음 숫자 등식 연산자를 확인합니다.
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | == (equal to) 두 피연산자의 값이 같은지 확인합니다. 그렇다면 조건이 참이됩니다. Example − ($a == $b) 사실이 아닙니다. |
2 | != (not equal to) 두 피연산자의 값이 같은지 확인하고, 값이 같지 않으면 조건이 참이됩니다. Example − ($a != $b) 사실입니다. |
삼 | <=> 두 피연산자의 값이 같은지 확인하고 왼쪽 인수가 숫자 적으로 오른쪽 인수보다 작은 지, 같은지 또는 큰지에 따라 -1, 0 또는 1을 반환합니다. Example − ($a <=> $b) -1을 반환합니다. |
4 | > (greater than) 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 큰지 확인하고, 그렇다면 조건이 참이됩니다. Example − ($a > $b) 사실이 아닙니다. |
5 | < (less than) 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작은 지 확인하고, 그렇다면 조건이 참이됩니다. Example − ($a < $b) 사실입니다. |
6 | >= (greater than or equal to) 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 크거나 같은지 확인하고, 그렇다면 조건이 참이됩니다. Example − ($a >= $b) 사실이 아닙니다. |
7 | <= (less than or equal to) 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작거나 같은지 확인하고, 그렇다면 조건이 참이됩니다. Example − ($a <= $b) 사실입니다. |
아래는 주식 연산자 목록입니다. 변수 가정$a holds "abc" and variable $b는 "xyz"를 보유하고 다음 문자열 등식 연산자를 확인합니다.
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | lt 왼쪽 인수가 오른쪽 인수보다 문자열이 작 으면 true를 반환합니다. Example − ($a lt $b) 사실입니다. |
2 | gt 왼쪽 인수가 오른쪽 인수보다 문자열 방식으로 크면 true를 반환합니다. Example − ($a gt $b) 거짓입니다. |
삼 | le 왼쪽 인수가 오른쪽 인수보다 작거나 같은 문자열이면 true를 반환합니다. Example − ($a le $b) 사실입니다. |
4 | ge 왼쪽 인수가 문자열 방식으로 오른쪽 인수보다 크거나 같으면 true를 반환합니다. Example − ($a ge $b) 거짓입니다. |
5 | eq 왼쪽 인수가 오른쪽 인수와 문자열 방식으로 같으면 true를 반환합니다. Example − ($a eq $b) 거짓입니다. |
6 | ne 왼쪽 인수가 오른쪽 인수와 같지 않은 문자열이면 true를 반환합니다. Example − ($a ne $b) 사실입니다. |
7 | cmp 왼쪽 인수가 문자열 방식으로 오른쪽 인수보다 작거나 같거나 큰지 여부에 따라 -1, 0 또는 1을 반환합니다. Example − ($a cmp $b)는 -1입니다. |
Perl 할당 연산자
변수 가정 $a holds 10 and variable $b는 20을 보유하고 있으며 아래는 Perl에서 사용할 수있는 할당 연산자와 그 사용법입니다.
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | = 단순 할당 연산자, 오른쪽 피연산자의 값을 왼쪽 피연산자로 할당합니다. Example − $c = $a + $b will assigned value of $a + $b into $씨 |
2 | += AND 할당 연산자 추가, 왼쪽 피연산자에 오른쪽 피연산자를 추가하고 결과를 왼쪽 피연산자에 할당합니다. Example − $c += $a는 $c = $c + $ a |
삼 | -= 빼기 AND 할당 연산자, 왼쪽 피연산자에서 오른쪽 피연산자를 빼고 결과를 왼쪽 피연산자에 할당합니다. Example − $ c-= $a is equivalent to $c = $c - $ㅏ |
4 | *= 곱하기 AND 할당 연산자, 오른쪽 피연산자와 왼쪽 피연산자를 곱하고 결과를 왼쪽 피연산자에 할당합니다. Example − $c *= $a는 $c = $c * $ a |
5 | /= 나누기 AND 할당 연산자, 왼쪽 피연산자를 오른쪽 피연산자로 나누고 결과를 왼쪽 피연산자에 할당합니다. Example − $ c / = $a is equivalent to $c = $c / $ㅏ |
6 | %= Modulus AND assignment operator, 두 개의 피연산자를 사용하여 모듈러스를 취하고 그 결과를 왼쪽 피연산자에 할당 Example − $c %= $a는 $c = $c % a |
7 | **= 지수 AND 할당 연산자, 연산자에 대한 지수 (승수) 계산을 수행하고 값을 왼쪽 피연산자에 할당합니다. Example − $c **= $a는 $c = $c ** $ a |
Perl 비트 연산자
비트 연산자는 비트에서 작동하고 비트 단위로 작동합니다. $ a = 60이라고 가정합니다. 그리고 $ b = 13; 이제 바이너리 형식으로 다음과 같이됩니다.
$ a = 0011 1100
$ b = 0000 1101
-----------------
$ a & $ b = 0000 1100
$ a | $ b = 0011 1101
$ a ^ $ b = 0011 0001
~ $ a = 1100 0011
Perl 언어에서 지원하는 Bitwise 연산자는 다음과 같습니다. $a = 60; and $b = 13
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | & 이진 AND 연산자는 두 피연산자에 모두있는 경우 결과에 비트를 복사합니다. Example − ($a & $b) 0000 1100 인 12를 제공합니다. |
2 | | 이진 OR 연산자는 eather 피연산자에있는 경우 비트를 복사합니다. Example − ($a | $b) 0011 1101 인 61을 제공합니다. |
삼 | ^ 이진 XOR 연산자는 하나의 피연산자에만 설정되어 있지만 둘 다에 설정되지 않은 경우 비트를 복사합니다. Example − ($a ^ $b) 0011 0001 인 49를 제공합니다. |
4 | ~ Binary Ones Complement Operator는 단항이며 비트 '플립 핑'효과가 있습니다. Example − (~ $ a)는 부호있는 이진수로 인해 2의 보수 형식으로 1100 0011 인 -61을 제공합니다. |
5 | << 이진 왼쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자에 지정된 비트 수만큼 왼쪽으로 이동합니다. Example − $ a << 2는 1111 0000 인 240을 제공합니다. |
6 | >> 이진 오른쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자에 지정된 비트 수만큼 오른쪽으로 이동합니다. Example − $ a >> 2는 0000 1111 인 15를 제공합니다. |
Perl 논리 연산자
Perl 언어에서 지원하는 논리 연산자는 다음과 같습니다. 변수 $ a가 참이고 변수 $ b가 거짓이라고 가정하면-
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | and 논리 AND 연산자라고합니다. 두 피연산자가 모두 참이면 조건이 참이됩니다. Example − ($ a 및 $ b)는 거짓입니다. |
2 | && C 스타일 논리 AND 연산자는 두 피연산자에 모두있는 경우 결과에 비트를 복사합니다. Example − ($ a && $ b)는 거짓입니다. |
삼 | or 논리 OR 연산자라고합니다. 두 피연산자 중 하나가 0이 아니면 조건이 참이됩니다. Example − ($ a 또는 $ b)가 참입니다. |
4 | || C 스타일 논리 OR 연산자는 eather 피연산자에있는 경우 비트를 복사합니다. Example − ($ a || $ b)는 참입니다. |
5 | not 논리 NOT 연산자라고합니다. 피연산자의 논리 상태를 반전하는 데 사용합니다. 조건이 참이면 논리 NOT 연산자는 거짓으로 만듭니다. Example − not ($ a 및 $ b)는 참입니다. |
따옴표와 유사한 연산자
Perl 언어에서 지원하는 다음과 같은 Quote 유사 연산자가 있습니다. 다음 표에서 {}는 선택한 구분 기호 쌍을 나타냅니다.
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | q{ } 작은 따옴표로 문자열을 묶습니다. Example − q {abcd}는 'abcd'를 제공합니다. |
2 | qq{ } 큰 따옴표로 문자열을 묶습니다. Example − qq {abcd}는 "abcd"를 제공합니다. |
삼 | qx{ } 반전 따옴표로 문자열을 묶습니다. Example − qx {abcd}는`abcd`를 제공합니다. |
기타 연산자
Perl 언어에서 지원하는 기타 연산자는 다음과 같습니다. 변수 a가 10을 보유하고 변수 b가 20을 보유한다고 가정하면-
보기 예
Sr. 아니. | 연산자 및 설명 |
---|---|
1 | . 이항 연산자 도트 (.)는 두 문자열을 연결합니다. Example − $ a = "abc"이면 $b = "def" then $a. $ b는 "abcdef"를 제공합니다. |
2 | x 반복 연산자 x는 오른쪽 피연산자가 지정한 횟수만큼 반복되는 왼쪽 피연산자로 구성된 문자열을 반환합니다. Example − ( '-'x 3)은 ---를 줄 것입니다. |
삼 | .. 범위 연산자 ..는 왼쪽 값에서 오른쪽 값까지 세는 값 목록 (1 씩 증가)을 반환합니다. Example − (2..5)는 (2, 3, 4, 5)를 줄 것입니다. |
4 | ++ Auto Increment 연산자는 정수 값을 1 씩 증가시킵니다. Example − $ a ++는 11을 줄 것입니다 |
5 | -- 자동 감소 연산자는 정수 값을 1 씩 감소시킵니다. Example − $ a--는 9를줍니다. |
6 | -> 화살표 연산자는 주로 객체 또는 클래스 이름에서 메서드 나 변수를 역 참조하는 데 사용됩니다. Example − $ obj->$a is an example to access variable $개체 $ obj에서. |
Perl 연산자 우선 순위
다음 표에는 가장 높은 우선 순위부터 가장 낮은 순위까지 모든 연산자가 나열되어 있습니다.
보기 예
left terms and list operators (leftward)
left ->
nonassoc ++ --
right **
right ! ~ \ and unary + and -
left =~ !~
left * / % x
left + - .
left << >>
nonassoc named unary operators
nonassoc < > <= >= lt gt le ge
nonassoc == != <=> eq ne cmp ~~
left &
left | ^
left &&
left || //
nonassoc .. ...
right ?:
right = += -= *= etc.
left , =>
nonassoc list operators (rightward)
right not
left and
left or xor
이 장에서는 Perl에서 날짜와 시간을 처리하고 조작하는 방법에 대한 기본적인 이해를 제공합니다.
현재 날짜 및 시간
시작하자 localtime()인수가 제공되지 않으면 현재 날짜 및 시간에 대한 값을 반환하는 함수입니다. 다음은localtime 목록 컨텍스트에서 사용하는 동안 기능-
sec, # seconds of minutes from 0 to 61
min, # minutes of hour from 0 to 59
hour, # hours of day from 0 to 24
mday, # day of month from 1 to 31
mon, # month of year from 0 to 11
year, # year since 1900
wday, # days since sunday
yday, # days since January 1st
isdst # hours of daylight savings time
다음 예제를 사용하여 localtime () 함수가 반환 한 다른 요소를 인쇄 해보십시오.
#!/usr/local/bin/perl
@months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
@days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
print "$mday $months[$mon] $days[$wday]\n";
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
16 Feb Sat
스칼라 컨텍스트에서 localtime () 함수를 사용하면 시스템에 설정된 현재 시간대의 날짜와 시간을 반환합니다. 다음 예제를 사용하여 현재 날짜와 시간을 전체 형식으로 인쇄하십시오.
#!/usr/local/bin/perl
$datestring = localtime();
print "Local date and time $datestring\n";
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
Local date and time Sat Feb 16 06:50:45 2013
GMT 시간
함수 gmtime()localtime () 함수처럼 작동하지만 반환 된 값은 표준 그리니치 표준 시간대에 맞게 현지화됩니다. 목록 컨텍스트에서 호출 될 때 gmtime에 의해 반환되는 마지막 값인 $ isdst는 항상 0입니다. GMT에는 일광 절약 시간이 없습니다.
localtime ()은 스크립트를 실행하는 컴퓨터의 현재 현지 시간을 반환하고 gmtime ()은 보편적 인 그리니치 표준시 또는 GMT (또는 UTC)를 반환한다는 사실에 유의해야합니다.
다음 예제를 사용하여 현재 날짜와 시간을 GMT 단위로 인쇄 해보십시오.
#!/usr/local/bin/perl
$datestring = gmtime(); print "GMT date and time $datestring\n";
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
GMT date and time Sat Feb 16 13:50:45 2013
날짜 및 시간 형식
localtime () 함수를 사용하여 9 개 요소 목록을 가져올 수 있으며 나중에 printf() 다음과 같이 요구 사항에 따라 날짜와 시간을 형식화하는 기능-
#!/usr/local/bin/perl
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); printf("Time Format - HH:MM:SS\n"); printf("%02d:%02d:%02d", $hour, $min, $sec);
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
Time Format - HH:MM:SS
06:58:52
Epoch 시간
time () 함수를 사용하여 epoch 시간을 가져올 수 있습니다. 즉, 주어진 날짜 이후 경과 된 초 수를 Unix에서 1970 년 1 월 1 일로 가져올 수 있습니다.
#!/usr/local/bin/perl
$epoc = time(); print "Number of seconds since Jan 1, 1970 - $epoc\n";
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
Number of seconds since Jan 1, 1970 - 1361022130
주어진 초 수를 다음과 같이 날짜 및 시간 문자열로 변환 할 수 있습니다.
#!/usr/local/bin/perl
$datestring = localtime(); print "Current date and time $datestring\n";
$epoc = time(); $epoc = $epoc - 24 * 60 * 60; # one day before of current date. $datestring = localtime($epoc); print "Yesterday's date and time $datestring\n";
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
Current date and time Tue Jun 5 05:54:43 2018
Yesterday's date and time Mon Jun 4 05:54:43 2018
POSIX 함수 strftime ()
POSIX 기능을 사용할 수 있습니다. strftime()다음 표를 사용하여 날짜 및 시간 형식을 지정합니다. 별표 (*)로 표시된 지정자는 로케일에 따라 다릅니다.
지정자 | 로 교체되다 | 예 |
---|---|---|
%a |
축약 된 요일 이름 * | Thu |
%A |
전체 평일 이름 * | Thursday |
%b |
축약 된 월 이름 * | Aug |
%B |
전체 월 이름 * | August |
%c |
날짜 및 시간 표시 * | Thu Aug 23 14:55:02 2001 |
%C |
연도를 100으로 나누고 정수로 잘림 ( 00-99 ) |
20 |
%d |
0으로 채워진 날짜 ( 01-31 ) |
23 |
%D |
짧은 MM/DD/YY 날짜,%m/%d/%y |
08/23/01 |
%e |
공백으로 채워진 날짜 ( 1-31 ) |
23 |
%F |
짧은 YYYY-MM-DD 날짜,%Y-%m-%d |
2001-08-23 |
%g |
주 기반 연도, 마지막 두 자리 ( 00-99 ) |
01 |
%G |
주 단위 연도 | 2001 |
%h |
축약 된 월 이름 * (와 동일 %b ) |
Aug |
%H |
24 시간 형식의 시간 ( 00-23 ) |
14 |
%I |
12 시간 형식의 시간 ( 01-12 ) |
02 |
%j |
올해의 날짜 ( 001-366 ) |
235 |
%m |
십진수로 표시된 월 ( 01-12 ) |
08 |
%M |
분 ( 00-59 ) |
55 |
%n |
줄 바꾸기 문자 ( '\n' ) |
|
%p |
AM 또는 PM 지정 | PM |
%r |
12 시간제 * | 02:55:02 pm |
%R |
24 시간 HH:MM 시간 당량%H:%M |
14:55 |
%S |
두 번째 ( 00-61 ) |
02 |
%t |
가로 탭 문자 ( '\t' ) |
|
%T |
ISO 8601 시간 형식 ( HH:MM:SS ), 다음과 동일%H:%M:%S |
14:55 |
%u |
ISO 8601 요일을 월요일 1 ( 1-7 ) 로 숫자로 표시 |
4 |
%U |
첫 번째 일요일이 첫 번째 요일 인 주 번호 ( 00-53 ) |
33 |
%V |
ISO 8601 주 번호 ( 00-53 ) |
34 |
%w |
일요일을 0 ( 0-6 ) 로하는 십진수로 표시된 요일 |
4 |
%W |
첫 번째 월요일이 첫 번째주의 첫 번째 날인 주 번호 ( 00-53 ) |
34 |
%x |
날짜 표기 * | 08/23/01 |
%X |
시간 표현 * | 14:55:02 |
%y |
연도, 마지막 두 자리 ( 00-99 ) |
01 |
%Y |
년 | 2001 |
%z |
시간대의 UTC에서 ISO 8601 오프셋 (1 분 = 1, 1 시간 = 100) 시간대를 종료 할 수없는 경우 문자가 없습니다. |
+100 |
%Z |
시간대 이름 또는 약어 * 시간대를 종료 할 수없는 경우 문자가 없습니다. |
CDT |
%% |
% 기호 |
% |
사용법을 이해하기 위해 다음 예제를 확인하십시오.
#!/usr/local/bin/perl
use POSIX qw(strftime);
$datestring = strftime "%a %b %e %H:%M:%S %Y", localtime; printf("date and time - $datestring\n");
# or for GMT formatted appropriately for your locale:
$datestring = strftime "%a %b %e %H:%M:%S %Y", gmtime; printf("date and time - $datestring\n");
위의 코드가 실행되면 다음과 같은 결과가 생성됩니다.
date and time - Sat Feb 16 07:10:23 2013
date and time - Sat Feb 16 14:10:23 2013
Perl 서브 루틴 또는 함수는 함께 작업을 수행하는 명령문 그룹입니다. 코드를 별도의 서브 루틴으로 나눌 수 있습니다. 다른 서브 루틴으로 코드를 나누는 방법은 사용자에게 달려 있지만 논리적으로 나누는 것은 일반적으로 각 함수가 특정 작업을 수행하는 것입니다.
Perl은 서브 루틴, 방법 및 기능이라는 용어를 같은 의미로 사용합니다.
서브 루틴 정의 및 호출
Perl 프로그래밍 언어에서 서브 루틴 정의의 일반적인 형식은 다음과 같습니다.
sub subroutine_name {
body of the subroutine
}
Perl 서브 루틴을 호출하는 일반적인 방법은 다음과 같습니다.
subroutine_name( list of arguments );
5.0 이전의 Perl 버전에서는 서브 루틴을 호출하는 구문이 아래와 같이 약간 달랐습니다. 이것은 Perl의 최신 버전에서 여전히 작동하지만 서브 루틴 프로토 타입을 우회하므로 권장되지 않습니다.
&subroutine_name( list of arguments );
간단한 함수를 정의한 다음 호출하는 다음 예제를 살펴 보겠습니다. Perl은 프로그램을 실행하기 전에 컴파일하기 때문에 서브 루틴을 선언하는 위치는 중요하지 않습니다.
#!/usr/bin/perl
# Function definition
sub Hello {
print "Hello, World!\n";
}
# Function call
Hello();
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Hello, World!
서브 루틴에 인수 전달
다른 프로그래밍 언어 에서처럼 다양한 인수를 서브 루틴에 전달할 수 있으며 특수 배열 @_를 사용하여 함수 내에서 액세스 할 수 있습니다. 따라서 함수의 첫 번째 인수는$_[0], the second is in $_ [1] 등.
스칼라와 같은 인수로 배열 및 해시를 전달할 수 있지만 둘 이상의 배열 또는 해시를 전달하면 일반적으로 개별 ID가 손실됩니다. 따라서 참조 (다음 장에서 설명)를 사용하여 배열이나 해시를 전달합니다.
숫자 목록을 가져온 다음 평균을 인쇄하는 다음 예제를 시도해 보겠습니다.
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_); $sum = 0;
foreach $item (@_) { $sum += $item; } $average = $sum / $n;
print "Average for the given numbers : $average\n";
}
# Function call
Average(10, 20, 30);
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Average for the given numbers : 20
목록을 서브 루틴으로 전달
@_ 변수는 배열이기 때문에 서브 루틴에 목록을 제공하는 데 사용할 수 있습니다. 그러나 Perl이 목록과 배열을 받아들이고 구문 분석하는 방식 때문에 @_에서 개별 요소를 추출하기가 어려울 수 있습니다. 다른 스칼라 인수와 함께 목록을 전달해야하는 경우 다음과 같이 목록을 마지막 인수로 만듭니다.
#!/usr/bin/perl
# Function definition
sub PrintList {
my @list = @_;
print "Given list is @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);
# Function call with list parameter
PrintList($a, @b);
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Given list is 10 1 2 3 4
서브 루틴에 해시 전달
목록을 허용하는 서브 루틴 또는 연산자에 해시를 제공하면 해시가 자동으로 키 / 값 쌍 목록으로 변환됩니다. 예를 들면-
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach my $key ( keys %hash ) {
my $value = $hash{$key}; print "$key : $value\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Function call with hash parameter
PrintHash(%hash);
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
name : Tom
age : 19
서브 루틴에서 값 반환
다른 프로그래밍 언어 에서처럼 서브 루틴에서 값을 반환 할 수 있습니다. 서브 루틴에서 값을 반환하지 않는 경우 서브 루틴에서 마지막으로 수행 된 계산이 자동으로 반환 값이됩니다.
스칼라와 같이 서브 루틴에서 배열과 해시를 반환 할 수 있지만 둘 이상의 배열 또는 해시를 반환하면 일반적으로 개별 ID가 손실됩니다. 따라서 함수에서 배열이나 해시를 반환하기 위해 참조 (다음 장에서 설명)를 사용할 것입니다.
숫자 목록을 가져온 다음 평균을 반환하는 다음 예제를 시도해 보겠습니다.
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_);
$sum = 0; foreach $item (@_) {
$sum += $item;
}
$average = $sum / $n; return $average;
}
# Function call
$num = Average(10, 20, 30); print "Average for the given numbers : $num\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Average for the given numbers : 20
서브 루틴의 전용 변수
기본적으로 Perl의 모든 변수는 전역 변수이므로 프로그램의 어느 곳에서나 액세스 할 수 있습니다. 그러나 당신은 만들 수 있습니다private 호출 된 변수 lexical variables 언제든지 my 운영자.
그만큼 my연산자는 변수를 사용하고 액세스 할 수있는 특정 코드 영역으로 제한합니다. 해당 지역 외부에서는이 변수를 사용하거나 액세스 할 수 없습니다. 이 영역을 범위라고합니다. 어휘 범위는 일반적으로 서브 루틴의 본문을 정의하거나 if, while, for, foreach 및 eval 문의 코드 블록을 표시하는 것과 같이 그 주위에 중괄호 세트가있는 코드 블록입니다 .
다음은 사용하여 단일 또는 여러 개인 변수를 정의하는 방법을 보여주는 예입니다. my 연산자-
sub somefunc {
my $variable; # $variable is invisible outside somefunc()
my ($another, @an_array, %a_hash); # declaring many variables at once
}
전역 변수와 개인 변수를 구별하기 위해 다음 예제를 확인하십시오.
#!/usr/bin/perl
# Global variable
$string = "Hello, World!";
# Function definition
sub PrintHello {
# Private variable for PrintHello function
my $string; $string = "Hello, Perl!";
print "Inside the function $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Inside the function Hello, Perl!
Outside the function Hello, World!
local ()을 통한 임시 값
그만큼 local변수의 현재 값이 호출 된 서브 루틴에 표시되어야 할 때 주로 사용됩니다. 로컬은 전역 (의미 패키지) 변수에 임시 값을 제공합니다. 이를 동적 범위 지정이라고 합니다. 어휘 범위 지정은 my로 수행되며 C의 자동 선언과 더 비슷합니다.
둘 이상의 변수 또는 표현식이 로컬에 제공되는 경우 괄호로 묶어야합니다. 이 연산자는 해당 변수의 현재 값을 숨겨진 스택의 인수 목록에 저장하고 블록, 서브 루틴 또는 평가를 종료 할 때 복원하는 방식으로 작동합니다.
전역 변수와 지역 변수를 구별하기 위해 다음 예제를 확인해 보겠습니다.
#!/usr/bin/perl
# Global variable
$string = "Hello, World!"; sub PrintHello { # Private variable for PrintHello function local $string;
$string = "Hello, Perl!"; PrintMe(); print "Inside the function PrintHello $string\n";
}
sub PrintMe {
print "Inside the function PrintMe $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Inside the function PrintMe Hello, Perl!
Inside the function PrintHello Hello, Perl!
Outside the function Hello, World!
state ()를 통한 상태 변수
또 다른 유형의 어휘 변수가 있는데, 이는 개인 변수와 유사하지만 상태를 유지하며 서브 루틴을 여러 번 호출 할 때 다시 초기화되지 않습니다. 이러한 변수는state 연산자이며 Perl 5.9.4부터 사용할 수 있습니다.
다음 예제를 확인하여 state 변수-
#!/usr/bin/perl
use feature 'state';
sub PrintCount {
state $count = 0; # initial value print "Value of counter is $count\n";
$count++;
}
for (1..5) {
PrintCount();
}
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Value of counter is 0
Value of counter is 1
Value of counter is 2
Value of counter is 3
Value of counter is 4
Perl 5.10 이전에는 다음과 같이 작성해야합니다.
#!/usr/bin/perl
{
my $count = 0; # initial value
sub PrintCount {
print "Value of counter is $count\n"; $count++;
}
}
for (1..5) {
PrintCount();
}
서브 루틴 호출 컨텍스트
서브 루틴 또는 문의 컨텍스트는 예상되는 반환 값의 유형으로 정의됩니다. 이를 통해 사용자가받을 것으로 기대하는 것에 따라 다른 값을 반환하는 단일 함수를 사용할 수 있습니다. 예를 들어 다음 localtime ()은 스칼라 컨텍스트에서 호출되면 문자열을 반환하지만 목록 컨텍스트에서 호출되면 목록을 반환합니다.
my $datestring = localtime( time );
이 예에서 $ timestr의 값은 현재 날짜와 시간으로 구성된 문자열입니다 (예 : Thu Nov 30 15:21:33 2000). 반대로-
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
이제 개별 변수에는 localtime () 서브 루틴에서 반환 된 해당 값이 포함됩니다.
Perl 참조는 스칼라, 배열 또는 해시 일 수있는 다른 값의 위치를 보유하는 스칼라 데이터 유형입니다. 스칼라 특성으로 인해 참조는 어디에서나 사용할 수 있으며 스칼라를 사용할 수 있습니다.
해시 등에 대한 참조를 포함 할 수있는 다른 목록에 대한 참조를 포함하는 목록을 구성 할 수 있습니다. 이것이 Perl에서 중첩 된 데이터 구조가 구축되는 방식입니다.
참조 생성
다음과 같이 백 슬래시를 접두사로 붙이면 변수, 서브 루틴 또는 값에 대한 참조를 쉽게 만들 수 있습니다.
$scalarref = \$foo; $arrayref = \@ARGV;
$hashref = \%ENV; $coderef = \&handler;
$globref = \*foo;
백 슬래시 연산자를 사용하여 I / O 핸들 (filehandle 또는 dirhandle)에 대한 참조를 만들 수 없지만 다음과 같이 대괄호를 사용하여 익명 배열에 대한 참조를 만들 수 있습니다.
$arrayref = [1, 2, ['a', 'b', 'c']];
비슷한 방법으로 다음과 같이 중괄호를 사용하여 익명 해시에 대한 참조를 만들 수 있습니다.
$hashref = {
'Adam' => 'Eve',
'Clyde' => 'Bonnie',
};
익명 서브 루틴에 대한 참조는 다음과 같이 하위 이름없이 sub를 사용하여 만들 수 있습니다.
$coderef = sub { print "Boink!\n" };
역 참조
역 참조는 참조 지점에서 위치까지의 값을 반환합니다. 참조를 역 참조하려면 참조가 스칼라, 배열 또는 해시를 가리키는 지 여부에 따라 참조 변수의 접두사로 $, @ 또는 %를 사용하면됩니다. 다음은 개념을 설명하는 예입니다.
#!/usr/bin/perl
$var = 10;
# Now $r has reference to $var scalar.
$r = \$var;
# Print value available at the location stored in $r. print "Value of $var is : ", $$r, "\n"; @var = (1, 2, 3); # Now $r has reference to @var array.
$r = \@var; # Print values available at the location stored in $r.
print "Value of @var is : ", @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # Now $r has reference to %var hash.
$r = \%var; # Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110
변수 유형에 대해 잘 모르면 다음을 사용하여 유형을 쉽게 알 수 있습니다. ref, 인수가 참조 인 경우 다음 문자열 중 하나를 반환합니다. 그렇지 않으면 false를 반환합니다.
SCALAR
ARRAY
HASH
CODE
GLOB
REF
다음 예를 들어 보겠습니다.
#!/usr/bin/perl
$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n"; @var = (1, 2, 3); $r = \@var;
print "Reference type in r : ", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var;
print "Reference type in r : ", ref($r), "\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH
순환 참조
순환 참조는 두 참조가 서로에 대한 참조를 포함 할 때 발생합니다. 참조를 생성하는 동안주의해야합니다. 그렇지 않으면 순환 참조로 인해 메모리 누수가 발생할 수 있습니다. 다음은 예입니다-
#!/usr/bin/perl
my $foo = 100;
$foo = \$foo;
print "Value of foo is : ", $$foo, "\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Value of foo is : REF(0x9aae38)
함수에 대한 참조
함수 이름 앞에 \ &를 붙여 함수에 대한 참조를 생성하고 해당 참조를 역 참조하려면 앰퍼샌드 &를 사용하여 참조 변수를 접두사로 지정하면됩니다. 다음은 예입니다-
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach $item (%hash) {
print "Item : $item\n"; } } %hash = ('name' => 'Tom', 'age' => 19); # Create a reference to above function. $cref = \&PrintHash;
# Function call using reference.
&$cref(%hash);
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Item : name
Item : Tom
Item : age
Item : 19
Perl은 '형식'이라는 쓰기 템플릿을 사용하여 보고서를 출력합니다. Perl의 형식 기능을 사용하려면 먼저 형식을 정의한 다음 해당 형식을 사용하여 형식화 된 데이터를 쓸 수 있습니다.
형식 정의
다음은 Perl 형식을 정의하는 구문입니다.
format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.
여기 FormatName형식의 이름을 나타냅니다. 그만큼fieldline데이터의 형식을 지정해야합니다. 값 라인은 필드 라인에 입력 될 값을 나타냅니다. 단일 마침표로 형식을 종료합니다.
다음 fieldline텍스트 또는 필드 홀더를 포함 할 수 있습니다. 필드 홀더는 나중에 배치 될 데이터를위한 공간을 보유합니다. 필드 홀더의 형식은-
@<<<<
이 필드 홀더는 필드 공간이 5 인 왼쪽 맞춤입니다. 필드의 공백 수를 알기 위해 @ 기호와 <기호를 계산해야합니다. 기타 필드 보유자는 다음과 같습니다.
@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder
예제 형식은 다음과 같습니다.
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age @#####.## $salary
===================================
.
이 예에서 $ name은 22 자 공백 내에서 왼쪽 맞춤으로 작성되고 해당 연령 이후에는 두 개의 공백으로 작성됩니다.
형식 사용
이 형식 선언을 호출하기 위해 우리는 write 키워드 −
write EMPLOYEE;
문제는 형식 이름이 일반적으로 열린 파일 핸들의 이름이고 write 문이 출력을이 파일 핸들로 보낸다는 것입니다. 데이터를 STDOUT으로 보내려면 EMPLOYEE를 STDOUT 파일 핸들과 연결해야합니다. 그러나 먼저 select () 함수를 사용하여 STDOUT이 선택한 파일 핸들인지 확인해야합니다.
select(STDOUT);
그런 다음 특수 변수 $ ~ 또는 $ FORMAT_NAME을 사용하여 새 형식 이름을 STDOUT으로 설정하여 EMPLOYEE를 STDOUT과 연결합니다.
$~ = "EMPLOYEE";
이제 write ()를 수행하면 데이터가 STDOUT으로 전송됩니다. 기억하십시오 : STDOUT 대신 다른 파일 핸들에 보고서를 작성하려는 경우 select () 함수를 사용하여 해당 파일 핸들을 선택할 수 있으며 나머지 논리는 동일하게 유지됩니다.
다음 예를 들어 보겠습니다. 여기에 사용법을 보여주기위한 하드 코딩 된 값이 있습니다. 실제 사용에서는 실제 보고서를 생성하기 위해 파일 또는 데이터베이스에서 값을 읽고 최종 보고서를 파일에 다시 작성해야 할 수 있습니다.
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age
@#####.##
$salary =================================== . select(STDOUT); $~ = EMPLOYEE;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
$salary = $s[$i++];
write;
}
실행되면 다음 결과가 생성됩니다.
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
보고서 헤더 정의
모든 것이 괜찮아 보입니다. 그러나 보고서에 헤더를 추가하고 싶을 것입니다. 이 헤더는 각 페이지의 상단에 인쇄됩니다. 이렇게하는 것은 매우 간단합니다. 템플릿을 정의하는 것 외에도 헤더를 정의하고 $ ^ 또는 $ FORMAT_TOP_NAME 변수에 할당해야합니다.
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age @#####.## $salary
===================================
.
format EMPLOYEE_TOP =
===================================
Name Age
===================================
.
select(STDOUT);
$~ = EMPLOYEE; $^ = EMPLOYEE_TOP;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
$salary = $s[$i++];
write;
}
이제 보고서는 다음과 같습니다.
===================================
Name Age
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
페이지 매김 정의
보고서가 두 페이지 이상을 차지하는 경우에는 어떻게합니까? 그에 대한 해결책이 있습니다.$% 또는 다음과 같이 헤더와 함께 사용할 수있는 $ FORMAT_PAGE_NUMBER-
format EMPLOYEE_TOP =
===================================
Name Age Page @<
$%
===================================
.
이제 출력은 다음과 같습니다.
===================================
Name Age Page 1
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
페이지의 줄 수
특수 변수를 사용하여 페이지 당 줄 수를 설정할 수 있습니다. $= (또는 $ FORMAT_LINES_PER_PAGE), 기본적으로 $ =는 60입니다.
보고서 바닥 글 정의
$ ^ 또는 $FORMAT_TOP_NAME contains the name of the current header format, there is no corresponding mechanism to automatically do the same thing for a footer. If you have a fixed-size footer, you can get footers by checking variable $-또는 $ FORMAT_LINES_LEFT 각 write () 전에 다음과 같이 정의 된 다른 형식을 사용하여 필요한 경우 바닥 글을 직접 인쇄합니다.
format EMPLOYEE_BOTTOM =
End of Page @<
$%
.
형식화와 관련된 전체 변수 세트는 Perl 특수 변수 섹션을 참조하십시오 .
파일 처리의 기본은 간단합니다. filehandle 외부 엔티티 (일반적으로 파일)와 연결 한 다음 Perl 내의 다양한 연산자 및 함수를 사용하여 파일 핸들과 연관된 데이터 스트림에 저장된 데이터를 읽고 업데이트합니다.
파일 핸들은 실제 파일을 이름과 연관시키는 명명 된 내부 Perl 구조입니다. 모든 파일 핸들은 읽기 / 쓰기 액세스가 가능하므로 파일 핸들과 연관된 모든 파일 또는 장치에서 읽고 업데이트 할 수 있습니다. 그러나 파일 핸들을 연결할 때 파일 핸들이 열리는 모드를 지정할 수 있습니다.
세 가지 기본 파일 핸들은 다음과 같습니다. STDIN, STDOUT, 및 STDERR, 표준 입력, 표준 출력 및 표준 오류 장치를 각각 나타냅니다.
파일 열기 및 닫기
Perl에서 새 파일이나 기존 파일을 여는 데 사용할 수있는 여러 형식의 다음 두 가지 기능이 있습니다.
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
여기서 FILEHANDLE은 open function 및 EXPR은 파일 이름과 파일 열기 모드를 갖는 표현식입니다.
오픈 기능
다음은 여는 구문입니다. file.txt읽기 전용 모드에서. 여기서 <기호보다 작음은 파일을 읽기 전용 모드로 열어야 함을 나타냅니다.
open(DATA, "<file.txt");
여기서 DATA는 파일을 읽는 데 사용되는 파일 핸들입니다. 다음은 파일을 열고 해당 내용을 화면에 인쇄하는 예제입니다.
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!"; while(<DATA>) { print "$_";
}
다음은 쓰기 모드에서 file.txt를 여는 구문입니다. 여기서> 기호는 쓰기 모드에서 파일을 열어야 함을 나타냅니다.
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
이 예제는 쓰기 위해 파일을 열기 전에 실제로 파일을 자르고 (비 웁니다) 원하는 효과가 아닐 수 있습니다. 읽고 쓰기 위해 파일을 열려면> 또는 <문자 앞에 더하기 기호를 넣을 수 있습니다.
예를 들어, 파일을 자르지 않고 업데이트 할 파일을 열려면-
open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";
먼저 파일을 자르려면-
open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";
추가 모드에서 파일을 열 수 있습니다. 이 모드에서는 쓰기 포인트가 파일의 끝으로 설정됩니다.
open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";
이중 >>는 추가 할 파일을 열고 파일 포인터를 끝에 놓아 즉시 정보 추가를 시작할 수 있습니다. 그러나 그 앞에 더하기 기호를 붙이지 않으면 읽을 수 없습니다.
open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";
다음은 다양한 모드의 가능한 값을 제공하는 표입니다.
Sr. 아니. | 엔티티 및 정의 |
---|---|
1 | < or r 읽기 전용 액세스 |
2 | > or w 만들기, 쓰기 및 자르기 |
삼 | >> or a 쓰기, 추가 및 생성 |
4 | +< or r+ 읽기 및 쓰기 |
5 | +> or w+ 읽기, 쓰기, 만들기 및 자르기 |
6 | +>> or a+ 읽기, 쓰기, 추가 및 생성 |
Sysopen 기능
그만큼 sysopen 기능은 시스템을 사용한다는 점을 제외하면 메인 열기 기능과 유사합니다. open() 시스템 기능에 대한 매개 변수로 제공된 매개 변수를 사용하여 함수-
예를 들어, 업데이트 할 파일을 열려면 +<filename 오픈에서 형식-
sysopen(DATA, "file.txt", O_RDWR);
또는 업데이트하기 전에 파일을 자르려면-
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
O_CREAT를 사용하여 새 파일을 만들고 O_WRONLY- 파일을 쓰기 전용 모드로 열고 O_RDONLY-파일을 읽기 전용 모드로 열 수 있습니다.
그만큼 PERMS인수는 파일을 만들어야하는 경우 지정된 파일에 대한 파일 권한을 지정합니다. 기본적으로0x666.
다음은 MODE의 가능한 값을 제공하는 표입니다.
Sr. 아니. | 엔티티 및 정의 |
---|---|
1 | O_RDWR 읽고 쓰기 |
2 | O_RDONLY 읽기 전용 |
삼 | O_WRONLY 쓰기 만 |
4 | O_CREAT 파일 생성 |
5 | O_APPEND 파일 추가 |
6 | O_TRUNC 파일 자르기 |
7 | O_EXCL 파일이 이미있는 경우 중지 |
8 | O_NONBLOCK 비 차단 사용성 |
닫기 기능
파일 핸들을 닫고 해당 파일에서 파일 핸들을 분리하려면 close함수. 이것은 파일 핸들의 버퍼를 플러시하고 시스템의 파일 설명자를 닫습니다.
close FILEHANDLE
close
FILEHANDLE을 지정하지 않으면 현재 선택된 파일 핸들을 닫습니다. 버퍼를 성공적으로 비우고 파일을 닫을 수있는 경우에만 true를 반환합니다.
close(DATA) || die "Couldn't close file properly";
파일 읽기 및 쓰기
파일 핸들이 열려 있으면 정보를 읽고 쓸 수 있어야합니다. 파일에 데이터를 읽고 쓰는 방법에는 여러 가지가 있습니다.
<FILEHANDL> 연산자
열린 파일 핸들에서 정보를 읽는 주요 방법은 <FILEHANDLE> 연산자입니다. 스칼라 컨텍스트에서는 파일 핸들에서 한 줄을 반환합니다. 예를 들면-
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
목록 컨텍스트에서 <FILEHANDLE> 연산자를 사용하면 지정된 파일 핸들에서 줄 목록이 반환됩니다. 예를 들어 파일의 모든 행을 배열로 가져 오려면-
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
getc 함수
getc 함수는 지정된 FILEHANDLE에서 단일 문자를 반환하거나 지정되지 않은 경우 STDIN을 반환합니다.
getc FILEHANDLE
getc
오류가 있거나 파일 핸들이 파일 끝에 있으면 undef가 대신 반환됩니다.
읽기 기능
읽기 함수는 버퍼링 된 파일 핸들에서 정보 블록을 읽습니다.이 함수는 파일에서 이진 데이터를 읽는 데 사용됩니다.
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
읽은 데이터의 길이는 LENGTH로 정의되며 OFFSET이 지정되지 않은 경우 데이터는 SCALAR의 시작 부분에 배치됩니다. 그렇지 않으면 데이터가 SCALAR에서 OFFSET 바이트 뒤에 배치됩니다. 이 함수는 성공시 읽은 바이트 수, 파일 끝에서 0, 오류가있는 경우 undef를 반환합니다.
인쇄 기능
파일 핸들에서 정보를 읽는 데 사용되는 모든 다른 방법에서 정보를 다시 쓰는 주요 기능은 인쇄 기능입니다.
print FILEHANDLE LIST
print LIST
print
print 함수는 LIST의 평가 된 값을 FILEHANDLE 또는 현재 출력 파일 핸들 (기본적으로 STDOUT)에 인쇄합니다. 예를 들면-
print "Hello World!\n";
파일 복사
다음은 기존 파일 file1.txt를 열고 한 줄씩 읽고 또 다른 사본 파일 file2.txt를 생성하는 예제입니다.
#!/usr/bin/perl
# Open file to read
open(DATA1, "<file1.txt");
# Open new file to write
open(DATA2, ">file2.txt");
# Copy data from one file to another.
while(<DATA1>) {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
파일 이름 바꾸기
다음은 file1.txt 파일의 이름을 file2.txt로 바꾸는 방법을 보여주는 예입니다. 파일이 / usr / test 디렉토리에 있다고 가정합니다.
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
이 기능 renames 두 개의 인수를 취하고 기존 파일의 이름을 바꿉니다.
기존 파일 삭제
다음은 파일을 사용하여 file1.txt 파일을 삭제하는 방법을 보여주는 예입니다. unlink 함수.
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
파일 내부 위치 지정
사용할 수 있습니다 tell 파일의 현재 위치를 알고 seek 파일 내부의 특정 위치를 가리키는 함수.
기능을 말하십시오
첫 번째 요구 사항은 tell 함수를 사용하여 파일 내에서 위치를 찾는 것입니다.
tell FILEHANDLE
tell
지정된 경우 FILEHANDLE 내에서 파일 포인터의 위치를 바이트 단위로 반환하고, 지정되지 않은 경우 현재 기본 선택된 파일 핸들을 반환합니다.
탐색 기능
탐색 기능은 파일 내에서 지정된 바이트 수에 파일 포인터를 위치시킵니다.
seek FILEHANDLE, POSITION, WHENCE
이 함수는 fseek 시스템 함수를 사용하며 시작, 끝 및 현재 위치의 세 지점을 기준으로 위치를 지정할 수있는 동일한 기능이 있습니다. WHENCE에 대한 값을 지정하여이를 수행합니다.
0은 파일 시작을 기준으로 위치를 설정합니다. 예를 들어, 행은 파일 포인터를 파일의 256 번째 바이트로 설정합니다.
seek DATA, 256, 0;
파일 정보
집합 적으로 -X 테스트로 알려진 일련의 테스트 연산자를 사용하여 Perl 내에서 특정 기능을 매우 빠르게 테스트 할 수 있습니다. 예를 들어, 파일에 대한 다양한 권한에 대한 빠른 테스트를 수행하려면 다음과 같은 스크립트를 사용할 수 있습니다.
#/usr/bin/perl
my $file = "/usr/test/file1.txt"; my (@description, $size);
if (-e $file) { push @description, 'binary' if (-B _); push @description, 'a socket' if (-S _); push @description, 'a text file' if (-T _); push @description, 'a block special file' if (-b _); push @description, 'a character special file' if (-c _); push @description, 'a directory' if (-d _); push @description, 'executable' if (-x _); push @description, (($size = -s _)) ? "$size bytes" : 'empty'; print "$file is ", join(', ',@description),"\n";
}
다음은 파일 또는 디렉토리를 확인할 수있는 기능 목록입니다.
Sr. 아니. | 연산자 및 정의 |
---|---|
1 | -A 스크립트 시작 시간에서 파일 마지막 액세스 시간 (일)을 뺀 시간입니다. |
2 | -B 바이너리 파일입니까? |
삼 | -C 스크립트 시작 시간에서 파일 마지막 inode 변경 시간 (일)을 뺀 값입니다. |
삼 | -M 스크립트 시작 시간에서 파일 수정 시간 (일)을 뺀 값입니다. |
4 | -O 실제 사용자 ID가 파일을 소유합니까? |
5 | -R 실제 사용자 ID 또는 실제 그룹으로 파일을 읽을 수 있습니까? |
6 | -S 파일이 소켓입니까? |
7 | -T 텍스트 파일입니까? |
8 | -W 실제 사용자 ID 또는 실제 그룹으로 파일을 쓸 수 있습니까? |
9 | -X 실제 사용자 ID 또는 실제 그룹으로 파일을 실행할 수 있습니까? |
10 | -b 블록 특수 파일입니까? |
11 | -c 캐릭터 특수 파일입니까? |
12 | -d 파일이 디렉토리입니까? |
13 | -e 파일이 있습니까? |
14 | -f 일반 파일입니까? |
15 | -g 파일에 setgid 비트가 설정되어 있습니까? |
16 | -k 파일에 고정 비트가 설정되어 있습니까? |
17 | -l 파일이 심볼릭 링크입니까? |
18 | -o 유효 사용자 ID가 파일을 소유합니까? |
19 | -p 파일이 명명 된 파이프입니까? |
20 | -r 유효 사용자 또는 그룹 ID로 파일을 읽을 수 있습니까? |
21 | -s 파일의 크기를 반환합니다. 0 크기 = 빈 파일입니다. |
22 | -t 파일 핸들이 TTY (터미널)에 의해 열려 있습니까? |
23 | -u 파일에 setuid 비트가 설정되어 있습니까? |
24 | -w 유효 사용자 또는 그룹 ID로 파일을 쓸 수 있습니까? |
25 | -x 유효 사용자 또는 그룹 ID로 파일을 실행할 수 있습니까? |
26 | -z 파일 크기가 0입니까? |
다음은 디렉토리를 사용하는 데 사용되는 표준 기능입니다.
opendir DIRHANDLE, EXPR # To open a directory
readdir DIRHANDLE # To read a directory
rewinddir DIRHANDLE # Positioning pointer to the begining
telldir DIRHANDLE # Returns current position of the dir
seekdir DIRHANDLE, POS # Pointing pointer to POS inside dir
closedir DIRHANDLE # Closing a directory.
모든 파일 표시
특정 디렉토리에서 사용 가능한 모든 파일을 나열하는 방법에는 여러 가지가 있습니다. 먼저 간단한 방법으로 모든 파일을 가져 와서 나열 해 보겠습니다.glob 연산자-
#!/usr/bin/perl
# Display all the files in /tmp directory.
$dir = "/tmp/*"; my @files = glob( $dir );
foreach (@files ) {
print $_ . "\n"; } # Display all the C source files in /tmp directory. $dir = "/tmp/*.c";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}
# Display all the hidden files.
$dir = "/tmp/.*"; @files = glob( $dir );
foreach (@files ) {
print $_ . "\n"; } # Display all the files from /tmp and /home directories. $dir = "/tmp/* /home/*";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}
다음은 디렉토리를 열고이 디렉토리에서 사용할 수있는 모든 파일을 나열하는 또 다른 예입니다.
#!/usr/bin/perl
opendir (DIR, '.') or die "Couldn't open directory, $!"; while ($file = readdir DIR) {
print "$file\n";
}
closedir DIR;
사용할 수있는 C 소스 파일 목록을 인쇄하는 또 다른 예는 다음과 같습니다.
#!/usr/bin/perl
opendir(DIR, '.') or die "Couldn't open directory, $!";
foreach (sort grep(/^.*\.c$/,readdir(DIR))) { print "$_\n";
}
closedir DIR;
새 디렉토리 생성
당신이 사용할 수있는 mkdir새 디렉토리를 만드는 기능. 디렉토리를 생성하려면 필요한 권한이 있어야합니다.
#!/usr/bin/perl
$dir = "/tmp/perl"; # This creates perl directory in /tmp directory. mkdir( $dir ) or die "Couldn't create $dir directory, $!";
print "Directory created successfully\n";
디렉토리 제거
당신이 사용할 수있는 rmdir디렉토리를 제거하는 기능. 디렉토리를 제거하려면 필요한 권한이 있어야합니다. 또한이 디렉터리를 제거하기 전에 비어 있어야합니다.
#!/usr/bin/perl
$dir = "/tmp/perl"; # This removes perl directory from /tmp directory. rmdir( $dir ) or die "Couldn't remove $dir directory, $!";
print "Directory removed successfully\n";
디렉토리 변경
당신이 사용할 수있는 chdir디렉토리를 변경하고 새 위치로 이동하는 기능. 디렉토리를 변경하고 새 디렉토리로 이동하려면 필요한 권한이 있어야합니다.
#!/usr/bin/perl
$dir = "/home"; # This changes perl directory and moves you inside /home directory. chdir( $dir ) or die "Couldn't go inside $dir directory, $!";
print "Your new location is $dir\n";
실행과 오류는 항상 함께 진행됩니다. 존재하지 않는 파일을 여는 경우. 이 상황을 제대로 처리하지 않으면 프로그램의 품질이 좋지 않은 것으로 간주됩니다.
오류가 발생하면 프로그램이 중지됩니다. 따라서 적절한 오류 처리는 프로그램 실행 중에 발생할 수있는 다양한 유형의 오류를 처리하는 데 사용되며 프로그램을 완전히 중지하는 대신 적절한 조치를 취합니다.
다양한 방법으로 오류를 식별하고 트랩 할 수 있습니다. Perl에서 오류를 포착하고 적절하게 처리하는 것은 매우 쉽습니다. 다음은 사용할 수있는 몇 가지 방법입니다.
if 문
그만큼 if statement문에서 반환 값을 확인해야 할 때 확실한 선택입니다. 예를 들면-
if(open(DATA, $file)) {
...
} else {
die "Error: Couldn't open the file - $!";
}
여기 변수 $! 실제 오류 메시지를 반환합니다. 또는 그렇게하는 것이 타당한 상황에서 문장을 한 줄로 줄일 수 있습니다. 예를 들면-
open(DATA, $file) || die "Error: Couldn't open the file $!";
이상 기능
그만큼 unlessfunction은 if : 문이 성공 상태를 완전히 우회 할 수 있으며 표현식이 false를 반환하는 경우에만 실행됩니다. 예를 들면-
unless(chdir("/etc")) {
die "Error: Can't change directory - $!";
}
그만큼 unless문은 오류를 발생 시키거나 표현식이 실패하는 경우에만 대안을 발생시킬 때 가장 잘 사용됩니다. 이 문장은 한 줄 문장에서 사용될 때도 의미가 있습니다.
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
여기서 우리는 chdir 작업이 실패 할 때만 죽고 잘 읽습니다.
삼항 연산자
매우 짧은 테스트의 경우 조건부 연산자를 사용할 수 있습니다. ?:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
여기서 우리가 달성하고자하는 것이 무엇인지는 명확하지 않지만 그 효과는 if 또는 unless성명서. 조건부 연산자는 식 또는 문 내에서 두 값 중 하나를 빠르게 반환하려는 경우에 가장 적합합니다.
경고 기능
경고 기능은 경고를 발생시키고 메시지가 STDERR에 인쇄되지만 추가 조치는 수행되지 않습니다. 따라서 사용자에 대한 경고를 인쇄하고 나머지 작업을 계속하려는 경우 더 유용합니다.
chdir('/etc') or warn "Can't change directory";
다이 기능
die 함수는 exit를 호출한다는 점을 제외하면 warn과 똑같이 작동합니다. 일반 스크립트 내에서이 함수는 실행을 즉시 종료하는 효과가 있습니다. 이 기능은 프로그램에 오류가있을 경우 진행해도 쓸모가없는 경우에 사용해야합니다.
chdir('/etc') or die "Can't change directory";
모듈 내의 오류
우리가 처리 할 수있는 두 가지 다른 상황이 있습니다.
모듈의 파일 이름과 줄 번호를 인용하는 모듈의 오류보고-이는 모듈을 디버깅 할 때 또는 스크립트 관련이 아닌 모듈 관련 오류를 구체적으로 발생시키려는 경우에 유용합니다.
오류를 일으킨 스크립트 내에서 행을 디버그 할 수 있도록 호출자의 정보를 인용하는 모듈 내의 오류를보고합니다. 이러한 방식으로 발생한 오류는 호출 스크립트의 시작 라인과 관련하여 오류를 강조하기 때문에 최종 사용자에게 유용합니다.
그만큼 warn 과 die함수는 모듈 내에서 호출 될 때 예상하는 것과 약간 다르게 작동합니다. 예를 들어, 간단한 모듈-
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
warn "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at T.pm line 9.
이것은 당신이 기대했던 것과 다소 차이가 있지만 반드시 당신이 원하는 것은 아닙니다. 모듈 프로그래머의 관점에서이 정보는 모듈 자체 내의 버그를 가리키는 데 도움이되기 때문에 유용합니다. 최종 사용자에게 제공된 정보는 상당히 쓸모가 없으며, 강화 된 프로그래머를 제외한 모든 사람에게는 완전히 무의미합니다.
이러한 문제에 대한 해결책은 호출 스크립트에 대한 정보를 반환하는 모듈 내에서 오류를보고하는 단순화 된 방법을 제공하는 Carp 모듈입니다. Carp 모듈은 carp, cluck, croak, confess의 네 가지 기능을 제공합니다. 이러한 기능은 아래에서 설명합니다.
잉어 기능
carp 함수는 warn과 기본적으로 동일하며 실제로 스크립트를 종료하고 스크립트 이름을 인쇄하지 않고 메시지를 STDERR에 인쇄합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
carp "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at test.pl line 4
cluck 기능
cluck 함수는 일종의 슈퍼 차지 잉어이며, 동일한 기본 원리를 따르지만 원래 스크립트에 대한 정보를 포함하여 호출되는 함수로 이어진 모든 모듈의 스택 추적을 인쇄합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);
sub function {
cluck "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at T.pm line 9
T::function() called at test.pl line 4
croak 기능
그만큼 croak 함수는 다음과 같습니다. die, 단 한 단계 위로 발신자를보고한다는 점만 다릅니다. die와 마찬가지로이 함수는 STDERR에 오류를보고 한 후 스크립트를 종료합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
croak "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at test.pl line 4
잉어와 마찬가지로 경고 및 다이 기능에 따른 줄 및 파일 정보 포함에 대해서도 동일한 기본 규칙이 적용됩니다.
고백 기능
그만큼 confess 기능은 같다 cluck; die를 호출 한 다음 원본 스크립트까지 스택 추적을 인쇄합니다.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
confess "Error in module!";
}
1;
아래와 같은 스크립트에서 호출하면-
use T;
function();
다음 결과가 생성됩니다-
Error in module! at T.pm line 9
T::function() called at test.pl line 4
Perl에서 사전 정의되고 특별한 의미를 갖는 몇 가지 변수가 있습니다. $ _ (아래 설명 참조)와 같이 일반적인 변수 표시기 ($, @ 또는 %) 뒤에 구두점 문자를 사용하는 변수입니다.
대부분의 특수 변수에는 긴 이름과 같은 영어가 있습니다 (예 : 운영 체제 오류 변수 $! $ OS_ERROR로 쓸 수 있습니다. 하지만 이름처럼 영어를 사용하려면 한 줄을 넣어야합니다use English;프로그램 파일 상단에 있습니다. 이것은 인터프리터가 변수의 정확한 의미를 파악하도록 안내합니다.
가장 일반적으로 사용되는 특수 변수는 기본 입력 및 패턴 검색 문자열을 포함하는 $ _입니다. 예를 들어, 다음 줄에서-
#!/usr/bin/perl
foreach ('hickory','dickory','doc') {
print $_;
print "\n";
}
실행되면 다음 결과가 생성됩니다.
hickory
dickory
doc
다시 말하지만 $ _ 변수를 명시 적으로 사용하지 않고 동일한 예를 확인합니다.
#!/usr/bin/perl
foreach ('hickory','dickory','doc') {
print;
print "\n";
}
실행되면 다음 결과도 생성됩니다.
hickory
dickory
doc
루프가 처음 실행되면 "hickory"가 인쇄됩니다. 두 번째로 "dickory"가 인쇄되고 세 번째로 "doc"가 인쇄됩니다. 그 이유는 루프의 각 반복에서 현재 문자열이$_, and is used by default by print. Here are the places where Perl will assume $_ 지정하지 않아도 −
ord 및 int와 같은 함수와 STDIN으로 기본 설정되는 -t를 제외한 모든 파일 테스트 (-f, -d)를 포함한 다양한 단항 함수.
인쇄 및 연결 해제와 같은 다양한 목록 기능.
= ~ 연산자없이 사용되는 경우 패턴 일치 작업 m //, s /// 및 tr ///.
다른 변수가 제공되지 않은 경우 foreach 루프의 기본 반복기 변수입니다.
grep 및 map 함수의 암시 적 반복기 변수입니다.
라인 입력 작업의 결과가 while 테스트의 유일한 기준으로 자체적으로 테스트 될 때 입력 레코드를 넣는 기본 위치입니다 (예 :). 잠시 테스트를 마치면 이런 일이 발생하지 않습니다.
특수 변수 유형
특수 변수의 용도와 특성에 따라 다음 범주로 분류 할 수 있습니다.
- 글로벌 스칼라 특수 변수.
- 전역 배열 특수 변수.
- 글로벌 해시 특수 변수.
- 글로벌 특수 파일 핸들.
- 글로벌 특수 상수.
- 정규식 특수 변수.
- 특수 변수를 파일 처리합니다.
글로벌 스칼라 특수 변수
다음은 모든 스칼라 특수 변수의 목록입니다. 우리는 상징적 인 이름과 함께 해당하는 영어 유사 이름을 나열했습니다.
$ _ | 기본 입력 및 패턴 검색 공간입니다. |
$ ARG | |
$. | 마지막으로 읽은 파일 핸들의 현재 입력 행 번호입니다. 파일 핸들을 명시 적으로 닫으면 행 번호가 재설정됩니다. |
$ NR | |
$ / | 입력 레코드 분리 자. 기본적으로 개행. 널 문자열로 설정되면 공백 행을 구분 기호로 처리합니다. |
$ RS | |
$, | 인쇄 연산자의 출력 필드 구분 기호입니다. |
$ OFS | |
$ \ | 인쇄 연산자의 출력 레코드 구분 기호입니다. |
$ ORS | |
$ " | 큰 따옴표로 묶인 문자열 (또는 유사한 해석 문자열)로 보간 된 목록 값에 적용된다는 점을 제외하면 "$"와 같습니다. 기본값은 공백입니다. |
$ LIST_SEPARATOR | |
$; | 다차원 배열 에뮬레이션을위한 아래 첨자 구분 기호입니다. 기본값은 "\ 034"입니다. |
$ SUBSCRIPT_SEPARATOR | |
$ ^ L | 양식 공급을 수행하기 위해 형식이 출력하는 내용입니다. 기본값은 "\ f"입니다. |
$ FORMAT_FORMFEED | |
$ : | 형식의 연속 필드 (^로 시작)를 채우기 위해 문자열이 끊어 질 수있는 현재 문자 집합입니다. 기본값은 "\ n" "입니다. |
$ FORMAT_LINE_BREAK_CHARACTERS | |
$ ^ A | 형식 행에 대한 쓰기 누산기의 현재 값입니다. |
$ ACCUMULATOR | |
$ # | 인쇄 된 숫자의 출력 형식을 포함합니다 (사용되지 않음). |
$ OFMT | |
$? | 마지막 파이프 닫기, 백틱 (``) 명령 또는 시스템 운영자가 반환 한 상태입니다. |
$ CHILD_ERROR | |
$! | 숫자 컨텍스트에서 사용되는 경우 errno 변수의 현재 값을 산출하여 마지막 시스템 호출 오류를 식별합니다. 문자열 컨텍스트에서 사용되는 경우 해당 시스템 오류 문자열을 생성합니다. |
$OS_ERROR or $에르 노 | |
$ @ | 마지막 eval 명령의 Perl 구문 오류 메시지입니다. |
$ EVAL_ERROR | |
$$ | 이 스크립트를 실행하는 Perl 프로세스의 pid입니다. |
$ PROCESS_ID 또는 $ PID | |
$ < | 이 프로세스의 실제 사용자 ID (uid)입니다. |
$REAL_USER_ID or $UID | |
$> | 이 프로세스의 유효 사용자 ID입니다. |
$ EFFECTIVE_USER_ID 또는 $ EUID | |
$ ( | 이 프로세스의 실제 그룹 ID (gid). |
$REAL_GROUP_ID or $GID | |
$) | 이 프로세스의 효과적인 가이드. |
$ EFFECTIVE_GROUP_ID 또는 $ EGID | |
$ 0 | 실행중인 Perl 스크립트를 포함하는 파일의 이름을 포함합니다. |
$ PROGRAM_NAME | |
$ [ | 배열의 첫 번째 요소와 하위 문자열의 첫 번째 문자의 인덱스입니다. 기본값은 0입니다. |
$] | 버전과 패치 수준을 1000으로 나눈 값을 반환합니다. |
$ PERL_VERSION | |
$ ^ D | 디버깅 플래그의 현재 값입니다. |
$ 디버깅 | |
$ ^ E | 일부 플랫폼에서 확장 된 오류 메시지. |
$ EXTENDED_OS_ERROR | |
$ ^ F | 최대 시스템 파일 설명자, 일반적으로 2입니다. |
$ SYSTEM_FD_MAX | |
$ ^ H | 특정 실용적인 모듈에서 활성화 된 내부 컴파일러 힌트를 포함합니다. |
$ ^ I | inplace-edit 확장의 현재 값입니다. 내부 편집을 비활성화하려면 undef를 사용하십시오. |
$ INPLACE_EDIT | |
$ ^ M | 내용 $M can be used as an emergency memory pool in case Perl dies with an out-of-memory error. Use of $M에는 Perl의 특별한 컴파일이 필요합니다. 자세한 내용은 INSTALL 문서를 참조하십시오. |
$ ^ O | 현재 Perl 바이너리가 컴파일 된 운영 체제의 이름을 포함합니다. |
$ OSNAME | |
$ ^ P | 디버거가 자체적으로 디버깅하지 않도록 삭제하는 내부 플래그입니다. |
$ PERLDB | |
$ ^ T | 에포크 이후 스크립트 실행이 시작된 시간 (초)입니다. |
$ BASETIME | |
$ ^ W | 경고 스위치의 현재 값 (true 또는 false)입니다. |
$ 경고 | |
$ ^ X | Perl 바이너리 자체가 실행 된 이름입니다. |
$ EXECUTABLE_NAME | |
$ ARGV | <ARGV>에서 읽을 때 현재 파일의 이름을 포함합니다. |
전역 배열 특수 변수
@ARGV | 스크립트를위한 명령 줄 인수를 포함하는 배열입니다. |
@INC | do, require 또는 use 구문으로 평가할 Perl 스크립트를 찾을 위치 목록이 포함 된 배열입니다. |
@에프 | -a 명령 줄 스위치가 제공 될 때 입력 줄이 분할되는 배열입니다. |
글로벌 해시 특수 변수
% INC | do 또는 require를 통해 포함 된 각 파일의 파일 이름 항목을 포함하는 해시입니다. |
% ENV | 현재 환경을 포함하는 해시입니다. |
% SIG | 다양한 신호에 대한 신호 처리기를 설정하는 데 사용되는 해시입니다. |
글로벌 특수 파일 핸들
ARGV | @ARGV의 명령 줄 파일 이름을 반복하는 특수 파일 핸들입니다. 일반적으로 <>에서 널 파일 핸들로 작성됩니다. |
STDERR | 모든 패키지의 표준 오류에 대한 특수 파일 핸들입니다. |
STDIN | 모든 패키지의 표준 입력을위한 특수 파일 핸들입니다. |
STDOUT | 모든 패키지의 표준 출력을위한 특수 파일 핸들입니다. |
데이터 | 스크립트를 포함하는 파일에서 __END__ 토큰 다음에 오는 모든 것을 참조하는 특수 파일 핸들입니다. 또는 동일한 패키지 __DATA__에서 데이터를 읽는 동안 필요한 파일에서 __DATA__ 토큰 다음의 모든 항목에 대한 특수 파일 핸들이 발견되었습니다. |
_ (밑줄) | 마지막 stat, lstat 또는 파일 테스트 연산자의 정보를 캐시하는 데 사용되는 특수 파일 핸들입니다. |
글로벌 특수 상수
__종료__ | 프로그램의 논리적 끝을 나타냅니다. 다음 텍스트는 무시되지만 DATA 파일 핸들을 통해 읽을 수 있습니다. |
__파일__ | 프로그램에서 사용되는 지점의 파일 이름을 나타냅니다. 문자열로 보간되지 않습니다. |
__선__ | 현재 줄 번호를 나타냅니다. 문자열로 보간되지 않습니다. |
__꾸러미__ | 컴파일 타임에 현재 패키지 이름을 나타내거나 현재 패키지가없는 경우 정의되지 않음을 나타냅니다. 문자열로 보간되지 않습니다. |
정규식 특수 변수
$ 자리 | 일치 된 마지막 패턴에서 해당하는 괄호 세트와 일치하는 텍스트를 포함합니다. 예를 들어, $ 1은 이전 정규식에서 첫 번째 괄호 집합에 포함 된 모든 항목과 일치합니다. |
$ & | 마지막으로 성공한 패턴 일치와 일치하는 문자열입니다. |
$ MATCH | |
$` | 마지막으로 성공한 패턴 일치에 의해 일치 된 항목 앞의 문자열입니다. |
$ PREMATCH | |
$ ' | 마지막으로 성공한 패턴 일치와 일치 된 항목 뒤에 오는 문자열입니다. |
$ POSTMATCH | |
$ + | 마지막 검색 패턴과 일치하는 마지막 대괄호입니다. 이것은 어떤 대체 패턴이 일치하는지 모르는 경우에 유용합니다. 예 : / Version : (. *) | Revision : (. *) / && ($rev = $+); |
$ LAST_PAREN_MATCH |
파일 핸들 특수 변수
$ | | 0이 아닌 값으로 설정하면 현재 선택된 출력 채널에서 쓰기 또는 인쇄 할 때마다 fflush (3)가 강제 실행됩니다. |
$ OUTPUT_AUTOFLUSH | |
$ % | 현재 선택된 출력 채널의 현재 페이지 번호. |
$ FORMAT_PAGE_NUMBER | |
$ = | 현재 선택한 출력 채널의 현재 페이지 길이 (인쇄 가능한 줄)입니다. 기본값은 60입니다. |
$ FORMAT_LINES_PER_PAGE | |
$- | 현재 선택된 출력 채널의 페이지에 남아있는 라인 수입니다. |
$ FORMAT_LINES_LEFT | |
$ ~ | 현재 선택된 출력 채널에 대한 현재 보고서 형식의 이름입니다. 기본값은 파일 핸들의 이름입니다. |
$ FORMAT_NAME | |
$ ^ | 현재 선택된 출력 채널에 대한 현재 페이지 상단 형식의 이름입니다. 기본값은 _TOP가 추가 된 파일 핸들의 이름입니다. |
$ FORMAT_TOP_NAME |
물론 각 프로그래머는 형식 지정과 관련하여 자신의 선호도를 가지고 있지만 프로그램을보다 쉽게 읽고 이해하고 유지 관리 할 수있는 몇 가지 일반적인 지침이 있습니다.
가장 중요한 것은 항상 -w 플래그로 프로그램을 실행하는 것입니다. 경고 없음 pragma 또는 필요한 경우 $ ^ W 변수를 통해 코드의 특정 부분에 대해 명시 적으로 해제 할 수 있습니다. 또한 항상 엄격하게 사용하거나 그 이유를 알아야합니다. sigtrap을 사용하고 진단 pragma를 사용하는 것도 유용 할 수 있습니다.
코드 레이아웃의 미학과 관련하여 Larry가 강하게 관심을 갖는 유일한 것은 다중 행 BLOCK의 닫는 중괄호가 구성을 시작하는 키워드와 일치해야한다는 것입니다. 그 외에도 그는 그렇게 강하지 않은 다른 선호도를 가지고 있습니다.
- 4 열 들여 쓰기.
- 가능하면 키워드와 같은 줄에 곱슬을 열고 그렇지 않으면 줄을 섭니다.
- 다중 라인 BLOCK의 여는 곱슬 앞의 공백.
- 한 줄 BLOCK은 컬리를 포함하여 한 줄에 놓을 수 있습니다.
- 세미콜론 앞에 공백이 없습니다.
- "짧은"단선 BLOCK에서 세미콜론이 생략되었습니다.
- 대부분의 운영자 주위에 공간.
- "복잡한"아래 첨자 주위의 공백 (괄호 안에).
- 다른 일을하는 청크 사이의 빈 줄.
- 껴안은 다른 사람들.
- 함수 이름과 여는 괄호 사이에 공백이 없습니다.
- 각 쉼표 뒤의 공백.
- 연산자 뒤의 긴 줄 (및 및 또는 제외).
- 현재 줄에서 일치하는 마지막 괄호 뒤의 공백.
- 해당 항목을 세로로 정렬합니다.
- 명확성이 떨어지지 않는 한 중복 구두점을 생략하십시오.
생각해야 할 다른 실질적인 스타일 문제가 있습니다. 특정 방식으로 무언가를 할 수 있다고해서 그렇게해야한다는 의미는 아닙니다. Perl은 무엇이든 할 수있는 여러 가지 방법을 제공하도록 설계되었으므로 가장 읽기 쉬운 방법을 선택하는 것이 좋습니다. 예를 들어-
open(FOO,$foo) || die "Can't open $foo: $!";
보다 낫다-
die "Can't open $foo: $!" unless open(FOO,$foo);
두 번째 방법은 수정 자에서 명령문의 요점을 숨기기 때문입니다. 반면에
print "Starting analysis\n" if $verbose;
보다 낫다-
$verbose && print "Starting analysis\n";
요점은 사용자가 -v를 입력했는지 여부가 아니기 때문입니다.
Perl이 마지막 연산자를 제공하므로 중간에서 종료 할 수 있으므로 어리석은 왜곡을 통해 상단 또는 하단의 루프를 종료하지 마십시오. 좀 더 잘 보이게하려면 약간 "내어 쓰기"만하면됩니다.
LINE:
for (;;) {
statements;
last LINE if $foo;
next LINE if /^#/;
statements;
}
몇 가지 중요한 사항을 더 살펴 보겠습니다.
루프 레이블을 사용하는 것을 두려워하지 마십시오. 가독성을 높이고 다중 레벨 루프 중단을 허용하기 위해 존재합니다. 이전 예를 참조하십시오.
grep () (또는 map ()) 또는`backticks`를 void 컨텍스트, 즉 반환 값을 버릴 때 사용하지 마십시오. 이러한 함수에는 모두 반환 값이 있으므로 사용하십시오. 그렇지 않으면 foreach () 루프 또는 system () 함수를 대신 사용하십시오.
이식성을 위해 모든 시스템에서 구현되지 않을 수있는 기능을 사용하는 경우 평가에서 구성을 테스트하여 실패하는지 확인하십시오. 특정 기능이 구현 된 버전 또는 패치 수준을 알고 있다면 $] (영문 $ PERL_VERSION)를 테스트하여 해당 기능이 있는지 확인할 수 있습니다. Config 모듈을 사용하면 Perl이 설치되었을 때 Configure 프로그램에서 결정한 값을 확인할 수도 있습니다.
Choose mnemonic identifiers. If you can't remember what mnemonic means, you've got a problem.
While short identifiers like $gotit are probably ok, use underscores to separate words in longer identifiers. It is generally easier to read $var_names_like_this than $VarNamesLikeThis, especially for non-native speakers of English. It's also a simple rule that works consistently with VAR_NAMES_LIKE_THIS.
Package names are sometimes an exception to this rule. Perl informally reserves lowercase module names for "pragma" modules like integer and strict. Other modules should begin with a capital letter and use mixed case, but probably without underscores due to limitations in primitive file systems' representations of module names as files that must fit into a few sparse bytes.
If you have a really hairy regular expression, use the /x modifier and put in some whitespace to make it look a little less like line noise. Don't use slash as a delimiter when your regexp has slashes or backslashes.
Always check the return codes of system calls. Good error messages should go to STDERR, include which program caused the problem, what the failed system call and arguments were, and (VERY IMPORTANT) should contain the standard system error message for what went wrong. Here's a simple but sufficient example −
opendir(D, $dir) or die "can't opendir $dir: $!";
재사용 가능성에 대해 생각하십시오. 그런 일을 다시하고 싶을 때 왜 원샷에 두뇌 능력을 낭비합니까? 코드 일반화를 고려하십시오. 모듈 또는 객체 클래스 작성을 고려하십시오. 엄격하게 사용하고 경고 (또는 -w)를 적용하여 코드를 깨끗하게 실행하는 것을 고려하십시오. 코드를 제공하는 것을 고려하십시오. 전체 세계관을 바꾸는 것을 고려하십시오. 생각 해봐 ... 오, 신경 쓰지 마.
일관성을 유지하십시오.
착하게 굴 어라.
정규식은보고있는 패턴을 정의하는 문자열입니다. Perl에서 정규식의 구문은 다른 정규식에서 찾을 수있는 것과 매우 유사합니다.sed, grep, 및 awk.
정규식을 적용하는 기본 방법은 패턴 바인딩 연산자 = ~ 및 !~. 첫 번째 연산자는 테스트 및 할당 연산자입니다.
Perl에는 세 가지 정규식 연산자가 있습니다.
- 정규식 일치-m //
- 정규식 대체-s ///
- 정규식 음역-tr ///
각 경우에 슬래시는 지정하는 정규식 (regex)의 구분 기호 역할을합니다. 다른 구분 기호에 익숙하다면 슬래시 대신 사용할 수 있습니다.
매치 연산자
일치 연산자 m //는 문자열 또는 문을 정규식과 일치시키는 데 사용됩니다. 예를 들어 문자 시퀀스 "foo"를 스칼라 $ bar와 일치 시키려면 다음과 같은 명령문을 사용할 수 있습니다.
#!/usr/bin/perl
$bar = "This is foo and again foo"; if ($bar =~ /foo/) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo"; if ($bar =~ /foo/) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
First time is matching
Second time is matching
m //은 실제로 q // 연산자 시리즈와 동일한 방식으로 작동합니다. 자연스럽게 일치하는 문자의 조합을 사용하여 표현식의 구분 기호로 사용할 수 있습니다. 예를 들어, m {}, m () 및 m> <은 모두 유효합니다. 따라서 위의 예는 다음과 같이 다시 작성할 수 있습니다.
#!/usr/bin/perl
$bar = "This is foo and again foo"; if ($bar =~ m[foo]) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo"; if ($bar =~ m{foo}) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
구분 기호가 슬래시 인 경우 m //에서 m을 생략 할 수 있지만 다른 모든 구분 기호의 경우 m 접두사를 사용해야합니다.
전체 일치 표현식, 즉 = ~ 또는! ~의 왼쪽에있는 표현식과 일치 연산자는 표현식이 일치하는 경우 true (스칼라 컨텍스트에서)를 리턴합니다. 따라서 진술-
$true = ($foo =~ m/foo/);
설정됩니다 $true to 1 if $foo는 정규식과 일치하거나 일치하지 않으면 0입니다. 목록 컨텍스트에서 일치는 그룹화 된 표현식의 내용을 반환합니다. 예를 들어 시간 문자열에서 시간, 분, 초를 추출 할 때 다음을 사용할 수 있습니다.
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
일치 연산자 수정 자
일치 연산자는 자체 수정 자 세트를 지원합니다. / g 수정자는 전역 일치를 허용합니다. / i 수정자는 대소 문자를 구분하지 않습니다. 다음은 수정 자의 전체 목록입니다.
Sr. 아니. | 수정 자 및 설명 |
---|---|
1 | i 대소 문자를 구분하지 않습니다. |
2 | m 문자열에 줄 바꿈 또는 캐리지 리턴 문자가있는 경우 ^ 및 $ 연산자가 이제 문자열 경계 대신 줄 바꿈 경계와 일치하도록 지정합니다. |
삼 | o 식을 한 번만 평가합니다. |
4 | s 를 사용할 수 있습니다. 개행 문자와 일치합니다. |
5 | x 명확성을 위해 표현식에 공백을 사용할 수 있습니다. |
6 | g 모든 일치 항목을 전역 적으로 찾습니다. |
7 | cg 전역 일치가 실패한 후에도 검색을 계속할 수 있습니다. |
한 번만 일치
더 간단한 버전의 일치 연산자 인? PATTERN?도 있습니다. 운영자. 이것은 재설정 할 각 호출 사이에서 검색하는 문자열 내에서 한 번만 일치한다는 점을 제외하면 기본적으로 m // 연산자와 동일합니다.
예를 들어, 이것을 사용하여 목록에서 첫 번째와 마지막 요소를 얻을 수 있습니다.
#!/usr/bin/perl
@list = qw/food foosball subeo footnote terfoot canic footbrdige/;
foreach (@list) {
$first = $1 if /(foo.*?)/; $last = $1 if /(foo.*)/; } print "First: $first, Last: $last\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
First: foo, Last: footbrdige
정규식 변수
정규식 변수에는 다음이 포함됩니다. $, 일치하는 마지막 그룹화 일치 항목을 포함합니다. $&, 일치하는 전체 문자열을 포함합니다. $`, 일치하는 문자열 앞의 모든 것을 포함합니다. 과$', 일치하는 문자열 뒤의 모든 항목을 포함합니다. 다음 코드는 결과를 보여줍니다-
#!/usr/bin/perl
$string = "The food is in the salad bar";
$string =~ m/foo/; print "Before: $`\n";
print "Matched: $&\n"; print "After: $'\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Before: The
Matched: foo
After: d is in the salad bar
대체 연산자
대체 연산자 s ///는 일치하는 텍스트를 새 텍스트로 바꿀 수있는 일치 연산자의 확장 일뿐입니다. 연산자의 기본 형태는-
s/PATTERN/REPLACEMENT/;
PATTERN은 우리가 찾고있는 텍스트에 대한 정규식입니다. REPLACEMENT는 찾은 텍스트를 대체하는 데 사용할 텍스트 또는 정규식에 대한 사양입니다. 예를 들어, 우리는dog 와 cat 다음 정규식 사용-
#/user/bin/perl
$string = "The cat sat on the mat"; $string =~ s/cat/dog/;
print "$string\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
The dog sat on the mat
대체 연산자 수정 자
다음은 대체 연산자와 함께 사용되는 모든 수정 자 목록입니다.
Sr. 아니. | 수정 자 및 설명 |
---|---|
1 | i 대소 문자를 구분하지 않습니다. |
2 | m 문자열에 줄 바꿈 또는 캐리지 리턴 문자가있는 경우 ^ 및 $ 연산자가 이제 문자열 경계 대신 줄 바꿈 경계와 일치하도록 지정합니다. |
삼 | o 식을 한 번만 평가합니다. |
4 | s 를 사용할 수 있습니다. 개행 문자와 일치합니다. |
5 | x 명확성을 위해 표현식에 공백을 사용할 수 있습니다. |
6 | g 발견 된 모든 표현식을 대체 텍스트로 바꿉니다. |
7 | e Perl 문인 것처럼 교체를 평가하고 반환 값을 교체 텍스트로 사용합니다. |
번역 연산자
번역은 대체 원칙과 유사하지만 동일하지는 않지만 대체와 달리 번역 (또는 음역)은 대체 값 검색에 정규식을 사용하지 않습니다. 번역 연산자는-
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
변환은 SEARCHLIST의 모든 문자를 REPLACEMENTLIST의 해당 문자로 대체합니다. 예를 들어, "고양이가 매트에 앉았습니다." 이 장에서 사용한 문자열-
#/user/bin/perl
$string = 'The cat sat on the mat'; $string =~ tr/a/o/;
print "$string\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
The cot sot on the mot.
표준 Perl 범위도 사용할 수 있으므로 문자 또는 숫자 값으로 문자 범위를 지정할 수 있습니다. 문자열의 대소 문자를 변경하려면 대신 다음 구문을 사용할 수 있습니다.uc 함수.
$string =~ tr/a-z/A-Z/;
번역 연산자 수정 자
다음은 번역과 관련된 연산자 목록입니다.
Sr. 아니. | 수정 자 및 설명 |
---|---|
1 | c SEARCHLIST를 보완합니다. |
2 | d 발견되었지만 대체되지 않은 문자를 삭제합니다. |
삼 | s 중복 된 대체 문자를 스쿼시합니다. |
/ d 수정자는 REPLACEMENTLIST에 해당 항목이없는 SEARCHLIST와 일치하는 문자를 삭제합니다. 예를 들면-
#!/usr/bin/perl
$string = 'the cat sat on the mat.'; $string =~ tr/a-z/b/d;
print "$string\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
b b b.
마지막 수정자인 / s는 대체 된 문자의 중복 시퀀스를 제거합니다.
#!/usr/bin/perl
$string = 'food';
$string = 'food'; $string =~ tr/a-z/a-z/s;
print "$string\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
fod
더 복잡한 정규식
고정 된 문자열 만 일치시킬 필요는 없습니다. 사실, 더 복잡한 정규식을 사용하여 꿈꾸는 거의 모든 것과 일치시킬 수 있습니다. 다음은 간단한 치트 시트입니다.
다음 표에는 Python에서 사용할 수있는 정규식 구문이 나열되어 있습니다.
Sr. 아니. | 패턴 및 설명 |
---|---|
1 | ^ 줄의 시작과 일치합니다. |
2 | $ 줄 끝과 일치합니다. |
삼 | . 개행을 제외한 모든 단일 문자와 일치합니다. m 옵션을 사용하면 줄 바꿈도 일치시킬 수 있습니다. |
4 | [...] 괄호 안의 모든 단일 문자와 일치합니다. |
5 | [^...] 대괄호가 아닌 단일 문자와 일치합니다. |
6 | * 0 개 이상의 선행 표현식과 일치합니다. |
7 | + 1 회 이상의 선행 표현식과 일치합니다. |
8 | ? 0 또는 1 개의 선행 표현식과 일치합니다. |
9 | { n} 정확히 n 번의 선행 표현식과 일치합니다. |
10 | { n,} n 개 이상의 선행 표현식과 일치합니다. |
11 | { n, m} 이전 표현식의 최소 n 개 및 최대 m 개 항목과 일치합니다. |
12 | a| b a 또는 b와 일치합니다. |
13 | \w 단어 문자와 일치합니다. |
14 | \W 단어가 아닌 문자와 일치합니다. |
15 | \s 공백과 일치합니다. [\ t \ n \ r \ f]와 같습니다. |
16 | \S 공백이 아닌 것과 일치합니다. |
17 | \d 숫자와 일치합니다. [0-9]와 같습니다. |
18 | \D 숫자가 아닌 것과 일치합니다. |
19 | \A 문자열의 시작과 일치합니다. |
20 | \Z 문자열의 끝과 일치합니다. 개행이 존재하면 개행 바로 전에 일치합니다. |
21 | \z 문자열의 끝과 일치합니다. |
22 | \G 마지막 경기가 끝난 지점과 일치합니다. |
23 | \b 괄호 밖에있을 때 단어 경계와 일치합니다. 대괄호 안에있을 때 백 스페이스 (0x08)와 일치합니다. |
24 | \B 비 단어 경계와 일치합니다. |
25 | \n, \t, etc. 줄 바꿈, 캐리지 리턴, 탭 등과 일치합니다. |
26 | \1...\9 n 번째 그룹화 된 하위 표현식과 일치합니다. |
27 | \10 이미 일치하는 경우 n 번째 그룹화 된 하위 표현식과 일치합니다. 그렇지 않으면 문자 코드의 8 진수 표현을 나타냅니다. |
28 | [aeiou] 주어진 세트의 단일 문자와 일치 |
29 | [^aeiou] 주어진 세트 외부의 단일 문자와 일치 |
^ 메타 문자는 문자열의 시작과 일치하고 $ 메타 기호는 문자열의 끝과 일치합니다. 다음은 몇 가지 간단한 예입니다.
# nothing in the string (start and end are adjacent)
/^$/
# a three digits, each followed by a whitespace
# character (eg "3 4 5 ")
/(\d\s) {3}/
# matches a string in which every
# odd-numbered letter is a (eg "abacadaf")
/(a.)+/
# string starts with one or more digits
/^\d+/
# string that ends with one or more digits
/\d+$/
다른 예를 살펴 보겠습니다.
#!/usr/bin/perl
$string = "Cats go Catatonic\nWhen given Catnip";
($start) = ($string =~ /\A(.*?) /);
@lines = $string =~ /^(.*?) /gm; print "First word: $start\n","Line starts: @lines\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
First word: Cats
Line starts: Cats When
경계 일치
그만큼 \b\ w 클래스와 \ W 클래스의 차이로 정의 된 모든 단어 경계에서 일치합니다. \ w는 단어의 문자를 포함하고 \ W는 그 반대이므로 일반적으로 단어의 종료를 의미합니다. 그만큼\Bassertion은 단어 경계가 아닌 모든 위치와 일치합니다. 예를 들면-
/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'
대안 선택
| 문자는 Perl 내의 표준 또는 비트 OR과 같습니다. 정규식 또는 그룹 내에서 대체 일치를 지정합니다. 예를 들어, 표현식에서 "고양이"또는 "개"를 일치 시키려면 다음을 사용할 수 있습니다.
if ($string =~ /cat|dog/)
복잡한 일치를 지원하기 위해 식의 개별 요소를 함께 그룹화 할 수 있습니다. 두 사람의 이름을 검색하는 것은 다음과 같이 두 개의 개별 테스트를 통해 달성 할 수 있습니다.
if (($string =~ /Martin Brown/) || ($string =~ /Sharon Brown/)) This could be written as follows if ($string =~ /(Martin|Sharon) Brown/)
그룹화 매칭
정규 표현의 관점에서 볼 때 전자가 약간 더 명확하다는 점을 제외하고는 차이가 없습니다.
$string =~ /(\S+)\s+(\S+)/; and $string =~ /\S+\s+\S+/;
그러나 그룹화의 이점은 정규 표현식에서 시퀀스를 추출 할 수 있다는 것입니다. 그룹은 원본에 나타나는 순서대로 목록으로 반환됩니다. 예를 들어, 다음 조각에서는 문자열에서 시간, 분 및 초를 가져 왔습니다.
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
이 직접 방법뿐만 아니라 일치하는 그룹은 특수 $ x 변수 내에서도 사용할 수 있습니다. 여기서 x는 정규식 내의 그룹 번호입니다. 따라서 앞의 예를 다음과 같이 다시 작성할 수 있습니다.
#!/usr/bin/perl
$time = "12:05:30";
$time =~ m/(\d+):(\d+):(\d+)/; my ($hours, $minutes, $seconds) = ($1, $2, $3); print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Hours : 12, Minutes: 05, Second: 30
그룹이 대체 표현식에 사용되는 경우 대체 텍스트에 $ x 구문을 사용할 수 있습니다. 따라서 다음을 사용하여 날짜 문자열을 다시 포맷 할 수 있습니다.
#!/usr/bin/perl
$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print "$date\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
1999/03/26
\ G 주장
\ G 어설 션을 사용하면 마지막 일치가 발생한 지점부터 계속 검색 할 수 있습니다. 예를 들어, 다음 코드에서 \ G를 사용하여 더 복잡한 단일 정규 표현식을 만들지 않고도 올바른 위치를 검색 한 다음 일부 정보를 추출 할 수 있습니다.
#!/usr/bin/perl
$string = "The time is: 12:31:02 on 4/12/00";
$string =~ /:\s+/g; ($time) = ($string =~ /\G(\d+:\d+:\d+)/); $string =~ /.+\s+/g;
($date) = ($string =~ m{\G(\d+/\d+/\d+)});
print "Time: $time, Date: $date\n";
위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.
Time: 12:31:02, Date: 4/12/00
\ G 어설 션은 실제로 pos 함수와 동등한 메타 기호이므로 정규식 호출 사이에 계속 pos를 사용할 수 있으며 pos를 lvalue 서브 루틴으로 사용하여 pos (및 따라서 \ G) 값을 수정할 수도 있습니다.
정규식 예
리터럴 문자
Sr. 아니. | 예 및 설명 |
---|---|
1 | Perl "Perl"과 일치합니다. |
캐릭터 클래스
Sr. 아니. | 예 및 설명 |
---|---|
1 | [Pp]ython "Python"또는 "python"과 일치 |
2 | rub[ye] "ruby"또는 "rube"와 일치 |
삼 | [aeiou] 하나의 소문자 모음과 일치 |
4 | [0-9] 모든 숫자와 일치합니다. [0123456789]와 동일 |
5 | [a-z] 모든 소문자 ASCII 문자와 일치 |
6 | [A-Z] 대문자 ASCII 문자와 일치 |
7 | [a-zA-Z0-9] 위 중 하나와 일치 |
8 | [^aeiou] 소문자 모음 이외의 항목과 일치 |
9 | [^0-9] 숫자 이외의 항목과 일치 |
특수 캐릭터 클래스
Sr. 아니. | 예 및 설명 |
---|---|
1 | . 개행을 제외한 모든 문자와 일치 |
2 | \d 숫자와 일치 : [0-9] |
삼 | \D 숫자가 아닌 일치 : [^ 0-9] |
4 | \s 공백 문자와 일치 : [\ t \ r \ n \ f] |
5 | \S 비 공백 일치 : [^ \ t \ r \ n \ f] |
6 | \w 단일 단어 문자와 일치 : [A-Za-z0-9_] |
7 | \W 단어가 아닌 문자와 일치 : [^ A-Za-z0-9_] |
반복 사례
Sr. 아니. | 예 및 설명 |
---|---|
1 | ruby? "rub"또는 "ruby"와 일치 : y는 선택 사항입니다. |
2 | ruby* "rub"+ 0 개 이상의 ys와 일치 |
삼 | ruby+ "rub"+ 1 개 이상의 ys와 일치 |
4 | \d{3} 정확히 3 자리와 일치 |
5 | \d{3,} 3 자리 이상의 숫자와 일치 |
6. | \d{3,5} 3, 4 또는 5 자리 숫자와 일치 |
탐욕스럽지 않은 반복
이것은 가장 적은 반복 횟수와 일치합니다.
Sr. 아니. | 예 및 설명 |
---|---|
1 | <.*> 욕심 많은 반복 : "<python> perl>"과 일치 |
2 | <.*?> Nongreedy : "<python> perl>"의 "<python>"과 일치 |
괄호로 그룹화
Sr. 아니. | 예 및 설명 |
---|---|
1 | \D\d+ 그룹 없음 : + 반복 \ d |
2 | (\D\d)+ 그룹화 : + \ D \ d 쌍 반복 |
삼 | ([Pp]ython(, )?)+ "Python", "Python, python, python"등과 일치합니다. |
역 참조
이전에 일치했던 그룹과 다시 일치합니다.
Sr. 아니. | 예 및 설명 |
---|---|
1 | ([Pp])ython&\1ails python & pails 또는 Python & Pails와 일치합니다. |
2 | (['"])[^\1]*\1 작은 따옴표 또는 큰 따옴표로 묶인 문자열. \ 1은 첫 번째 그룹이 일치하는 것과 일치합니다. \ 2는 두 번째 그룹이 일치하는 항목과 일치합니다. |
대안
Sr. 아니. | 예 및 설명 |
---|---|
1 | python|perl "python"또는 "perl"과 일치 |
2 | rub(y|le)) "ruby"또는 "ruble"과 일치 |
삼 | Python(!+|\?) "Python"다음에 하나 이상의! 또는 하나? |
앵커
일치 위치를 지정해야합니다.
Sr. 아니. | 예 및 설명 |
---|---|
1 | ^Python 문자열 또는 내부 줄의 시작 부분에서 "Python"과 일치 |
2 | Python$ 문자열 또는 줄 끝의 "Python"과 일치 |
삼 | \APython 문자열의 시작 부분에있는 "Python"과 일치 |
4 | Python\Z 문자열 끝에있는 "Python"과 일치 |
5 | \bPython\b 단어 경계에서 "Python"과 일치 |
6 | \brub\B \ B는 단어가 아닌 경계 : "rube"및 "ruby"의 "rub"과 일치하지만 단독으로는 일치하지 않습니다. |
7 | Python(?=!) 느낌표가 뒤에 오는 경우 "Python"과 일치합니다. |
8 | Python(?!!) 느낌표가 뒤에 나오지 않으면 "Python"과 일치합니다. |
괄호가있는 특수 구문
Sr. 아니. | 예 및 설명 |
---|---|
1 | R(?#comment) "R"과 일치합니다. 나머지는 모두 코멘트 |
2 | R(?i)uby "uby"와 일치하는 동안 대소 문자를 구분하지 않음 |
삼 | R(?i:uby) 같은 상기와 |
4 | rub(?:y|le)) \ 1 역 참조를 생성하지 않고 그룹화 |
sendmail 유틸리티 사용
일반 메시지 보내기
Linux / Unix 컴퓨터에서 작업하는 경우 간단히 사용할 수 있습니다. sendmail이메일을 보내기위한 Perl 프로그램 내부의 유틸리티. 다음은 주어진 이메일 ID로 이메일을 보낼 수있는 샘플 스크립트입니다. sendmail 유틸리티의 지정된 경로가 올바른지 확인하십시오. Linux / Unix 시스템에 따라 다를 수 있습니다.
#!/usr/bin/perl
$to = 'abcd@gmail.com';
$from = 'webmaster@yourdomain.com'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
# Email Body
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n";
실제로 위의 스크립트는 클라이언트 이메일 스크립트로, 이메일 초안을 작성하고 Linux / Unix 컴퓨터에서 로컬로 실행되는 서버에 제출합니다. 이 스크립트는 실제 목적지로 이메일을 보내는 데 책임이 없습니다. 따라서 주어진 이메일 ID로 이메일을 보내려면 이메일 서버가 제대로 구성되고 컴퓨터에서 실행되고 있는지 확인해야합니다.
HTML 메시지 보내기
sendmail을 사용하여 HTML 형식의 이메일을 보내려면 다음을 추가하기 만하면됩니다. Content-type: text/html\n 다음과 같이 이메일의 헤더 부분에-
#!/usr/bin/perl
$to = 'abcd@gmail.com';
$from = 'webmaster@yourdomain.com'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
print MAIL "Content-type: text/html\n";
# Email Body
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n";
MIME :: Lite 모듈 사용
Windows 시스템에서 작업하는 경우 sendmail 유틸리티에 액세스 할 수 없습니다. 그러나 MIME : Lite perl 모듈을 사용하여 자신의 이메일 클라이언트를 작성하는 대안이 있습니다. 이 모듈은 MIME-Lite-3.01.tar.gz 에서 다운로드 하여 Windows 또는 Linux / Unix 시스템에 설치할 수 있습니다. 그것을 설치하려면 간단한 단계를 따르십시오-
$tar xvfz MIME-Lite-3.01.tar.gz
$cd MIME-Lite-3.01 $perl Makefile.PL
$make $make install
이것으로 컴퓨터에 MIME :: Lite 모듈이 설치됩니다. 이제 아래에 설명 된 간단한 스크립트로 이메일을 보낼 준비가되었습니다.
일반 메시지 보내기
이제 다음은 주어진 이메일 ID로 이메일을 보내는 스크립트입니다.
#!/usr/bin/perl
use MIME::Lite;
$to = 'abcd@gmail.com'; $cc = 'efgh@mail.com';
$from = 'webmaster@yourdomain.com'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; $msg = MIME::Lite->new(
From => $from, To => $to,
Cc => $cc, Subject => $subject,
Data => $message ); $msg->send;
print "Email Sent Successfully\n";
HTML 메시지 보내기
sendmail을 사용하여 HTML 형식의 이메일을 보내려면 다음을 추가하기 만하면됩니다. Content-type: text/html\n이메일의 헤더 부분에 있습니다. 다음은 HTML 형식의 이메일을 보내는 스크립트입니다.
#!/usr/bin/perl
use MIME::Lite;
$to = 'abcd@gmail.com'; $cc = 'efgh@mail.com';
$from = 'webmaster@yourdomain.com'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; $msg = MIME::Lite->new(
From => $from, To => $to,
Cc => $cc, Subject => $subject,
Data => $message ); $msg->attr("content-type" => "text/html");
$msg->send;
print "Email Sent Successfully\n";
첨부 파일 보내기
첨부 파일을 보내려면 다음 스크립트가 목적을 수행합니다.
#!/usr/bin/perl
use MIME::Lite;
$to = 'abcd@gmail.com';
$cc = 'efgh@mail.com'; $from = 'webmaster@yourdomain.com';
$subject = 'Test Email'; $message = 'This is test email sent by Perl Script';
$msg = MIME::Lite->new( From => $from,
To => $to, Cc => $cc,
Subject => $subject, Type => 'multipart/mixed' ); # Add your text message. $msg->attach(Type => 'text',
Data => $message ); # Specify your file as attachement. $msg->attach(Type => 'image/gif',
Path => '/tmp/logo.gif',
Filename => 'logo.gif',
Disposition => 'attachment'
);
$msg->send;
print "Email Sent Successfully\n";
attach () 메서드를 사용하여 이메일에 원하는만큼 파일을 첨부 할 수 있습니다.
SMTP 서버 사용
컴퓨터에서 이메일 서버를 실행하지 않는 경우 원격 위치에서 사용 가능한 다른 이메일 서버를 사용할 수 있습니다. 그러나 다른 이메일 서버를 사용하려면 ID, 비밀번호, URL 등이 있어야합니다. 필요한 정보를 모두 확보 한 후 해당 정보를send() 다음과 같이 방법-
$msg->send('smtp', "smtp.myisp.net", AuthUser=>"id", AuthPass=>"password" );
이메일 서버 관리자에게 문의하여 위에 사용 된 정보를 얻을 수 있으며 사용자 ID와 비밀번호를 아직 사용할 수없는 경우 관리자가 몇 분 안에 생성 할 수 있습니다.
소켓이란?
소켓은 서로 다른 프로세스간에 가상 이중 연결을 생성하는 Berkeley UNIX 메커니즘입니다. 이것은 나중에 다른 OS 소프트웨어에서 실행되는 지리적 위치에 걸쳐 시스템 간의 통신을 가능하게하는 모든 알려진 OS에 이식되었습니다. 소켓이 아니라면 시스템 간의 대부분의 네트워크 통신은 결코 발생하지 않았을 것입니다.
자세히 살펴보기; 네트워크의 일반적인 컴퓨터 시스템은 실행중인 다양한 응용 프로그램에서 원하는대로 정보를 수신하고 보냅니다. 이 정보는 고유 한 IP 주소가 지정되어 있으므로 시스템으로 라우팅됩니다. 시스템에서이 정보는 다른 포트에서 수신하는 관련 응용 프로그램에 제공됩니다. 예를 들어 인터넷 브라우저는 웹 서버에서받은 정보를 포트 80에서 수신합니다. 또한 특정 포트 번호에 대한 정보를 수신 및 송수신 할 수있는 맞춤형 애플리케이션을 작성할 수 있습니다.
지금은 소켓이 IP 주소 및 포트라고 요약 해 보겠습니다. 연결을 통해 네트워크를 통해 데이터를 보내고받을 수 있습니다.
위에서 언급 한 소켓 개념을 설명하기 위해 Perl을 사용한 클라이언트-서버 프로그래밍의 예를 살펴 보겠습니다. 클라이언트 서버 아키텍처를 완성하려면 다음 단계를 거쳐야합니다.
서버를 만들려면
다음을 사용하여 소켓 만들기 socket 요구.
다음을 사용하여 소켓을 포트 주소에 바인드하십시오. bind 요구.
다음을 사용하여 포트 주소에서 소켓을 청취하십시오. listen 요구.
다음을 사용하여 클라이언트 연결 수락 accept 요구.
클라이언트를 만들려면
소켓 만들기 socket 요구.
다음을 사용하여 서버에 연결 (소켓) connect 요구.
다음 다이어그램은 클라이언트와 서버가 서로 통신하는 데 사용되는 호출의 전체 시퀀스를 보여줍니다.
서버 측 소켓 호출
socket () 호출
그만큼 socket()call은 네트워크 연결을 설정하는 첫 번째 호출이 소켓을 만드는 것입니다. 이 호출에는 다음 구문이 있습니다.
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
위의 호출은 SOCKET을 만들고 다른 세 개의 인수는 TCP / IP 연결에 대해 다음 값을 가져야하는 정수입니다.
DOMAINPF_INET이어야합니다. 컴퓨터에서는 2 일 가능성이 높습니다.
TYPE TCP / IP 연결의 경우 SOCK_STREAM이어야합니다.
PROTOCOL 해야한다 (getprotobyname('tcp'))[2]. 소켓을 통해 말하는 것은 TCP와 같은 특정 프로토콜입니다.
따라서 서버에서 발행 한 소켓 함수 호출은 다음과 같습니다.
use Socket # This defines PF_INET and SOCK_STREAM
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
bind () 호출
socket () 호출에 의해 생성 된 소켓은 호스트 이름과 포트 번호에 바인딩되기 전까지는 쓸모가 없습니다. 서버는 다음을 사용합니다.bind() 클라이언트로부터 연결을 수락 할 포트를 지정하는 함수입니다.
bind( SOCKET, ADDRESS );
여기서 SOCKET은 socket () 호출에 의해 반환 된 설명자이고 ADDRESS는 세 요소를 포함하는 소켓 주소 (TCP / IP 용)입니다.
주소 계열 (TCP / IP의 경우 AF_INET, 아마도 시스템에서 2).
포트 번호 (예 : 21).
컴퓨터의 인터넷 주소 (예 : 10.12.12.168).
bind ()는 서버가 사용하므로 자체 주소를 알 필요가 없으므로 인수 목록은 다음과 같습니다.
use Socket # This defines PF_INET and SOCK_STREAM
$port = 12345; # The unique port used by the sever to listen requests $server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "Can't bind to port $port! \n";
그만큼 or die 절은 매우 중요합니다. 왜냐하면 서버가 미결 연결없이 죽으면 포트는 SO_REUSEADDR 옵션을 사용하지 않는 한 즉시 재사용 할 수 없기 때문입니다. setsockopt()함수. 여기pack_sockaddr_in() 기능은 포트와 IP 주소를 바이너리 형식으로 압축하는 데 사용됩니다.
listen () 호출
이 프로그램이 서버 프로그램 인 경우 다음을 호출해야합니다. listen()수신 할 지정된 포트에서 즉, 들어오는 요청을 기다립니다. 이 호출에는 다음 구문이 있습니다.
listen( SOCKET, QUEUESIZE );
위의 호출은 socket () 호출에 의해 반환 된 SOCKET 설명자를 사용하며 QUEUESIZE는 동시에 허용되는 미해결 연결 요청의 최대 수입니다.
accept () 호출
이 프로그램이 서버 프로그램 인 경우 다음을 호출해야합니다. access()들어오는 연결을 수락하는 기능. 이 호출에는 다음 구문이 있습니다.
accept( NEW_SOCKET, SOCKET );
accept 호출은 socket () 함수에 의해 반환 된 SOCKET 설명자를 수신하고 성공적으로 완료되면 클라이언트와 서버 간의 모든 향후 통신을 위해 새 소켓 설명자 NEW_SOCKET이 반환됩니다. access () 호출이 실패하면 처음에 사용한 Socket 모듈에 정의 된 FLASE를 반환합니다.
일반적으로 accept ()는 무한 루프에서 사용됩니다. 하나의 연결이 도착하자마자 서버는이를 처리 할 자식 프로세스를 만들거나 직접 처리 한 다음 다시 연결하여 더 많은 연결을 수신합니다.
while(1) {
accept( NEW_SOCKET, SOCKT );
.......
}
이제 서버와 관련된 모든 호출이 끝났고 클라이언트가 요구할 호출을 살펴 보겠습니다.
클라이언트 측 소켓 호출
connect () 호출
클라이언트 프로그램을 준비하려면 먼저 socket() 소켓을 만들기 위해 호출 한 다음 사용해야합니다. connect()서버에 연결하려면 호출하십시오. 이미 socket () 호출 구문을 보았으며 서버 socket () 호출과 유사하지만 여기에 대한 구문이 있습니다.connect() 전화-
connect( SOCKET, ADDRESS );
여기서 SCOKET는 클라이언트가 발행 한 socket () 호출에 의해 반환 된 소켓 설명자이고 ADDRESS는 원격 서버의 IP 주소를 포함한다는 점을 제외하면 bind 호출 과 유사한 소켓 주소 입니다.
$port = 21; # For example, the ftp port
$server_ip_address = "10.12.12.168"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) or die "Can't connect to port $port! \n";
서버에 성공적으로 연결되면 SOCKET 디스크립터를 사용하여 서버에 명령을 보낼 수 있습니다. 그렇지 않으면 클라이언트가 오류 메시지를 제공하여 나옵니다.
클라이언트-서버 예
다음은 Perl 소켓을 사용하여 간단한 클라이언트-서버 프로그램을 구현하는 Perl 코드입니다. 여기서 서버는 들어오는 요청을 수신하고 연결이 설정되면 단순히 서버에서 Smile에 응답 합니다 . 클라이언트는 해당 메시지를 읽고 화면에 인쇄합니다. 서버와 클라이언트가 동일한 시스템에 있다고 가정하고 어떻게 수행되었는지 살펴 보겠습니다.
서버를 만드는 스크립트
#!/usr/bin/perl -w
# Filename : server.pl
use strict;
use Socket;
# use port 7890 as default
my $port = shift || 7890; my $proto = getprotobyname('tcp');
my $server = "localhost"; # Host IP running the server # create a socket, make it reusable socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "Can't open socket $!\n"; setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR $!\n";
# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't bind to port $port! \n"; listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n"; # accepting a connection my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) { # send them a message, close connection my $name = gethostbyaddr($client_addr, AF_INET ); print NEW_SOCKET "Smile from the server"; print "Connection recieved from $name\n";
close NEW_SOCKET;
}
백그라운드 모드에서 서버를 실행하려면 Unix 프롬프트에서 다음 명령을 실행하십시오.
$perl sever.pl&
클라이언트를 만드는 스크립트
!/usr/bin/perl -w
# Filename : client.pl
use strict;
use Socket;
# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890; my $server = "localhost"; # Host IP running the server
# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "Can't create a socket $!\n"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server))) or die "Can't connect to port $port! \n";
my $line; while ($line = <SOCKET>) {
print "$line\n"; } close SOCKET or die "close: $!";
이제 명령 프롬프트에서 클라이언트를 시작하겠습니다. 서버에 연결되고 서버에서 보낸 메시지를 읽고 다음과 같이 화면에 동일한 내용을 표시합니다.
$perl client.pl
Smile from the server
NOTE − 실제 IP 주소를 점 표기법으로 제공하는 경우 혼동을 피하기 위해 클라이언트와 서버 모두에서 동일한 형식으로 IP 주소를 제공하는 것이 좋습니다.
우리는 이미 Perl 및 Perl 익명 배열 및 해시의 참조를 연구했습니다. Perl의 객체 지향 개념은 참조와 익명 배열 및 해시를 기반으로합니다. Object Oriented Perl의 기본 개념을 배우기 시작하겠습니다.
개체 기본 사항
Perl이 객체를 처리하는 방법의 관점에서 설명되는 세 가지 주요 용어가 있습니다. 용어는 객체, 클래스 및 방법입니다.
안 objectPerl 내에서는 자신이 속한 클래스를 알고있는 데이터 유형에 대한 참조 일뿐입니다. 객체는 스칼라 변수에 참조로 저장됩니다. 스칼라는 객체에 대한 참조 만 포함하기 때문에 동일한 스칼라는 다른 클래스에 다른 객체를 보유 할 수 있습니다.
ㅏ class Perl 내에는 개체를 만들고 조작하는 데 필요한 해당 메서드가 포함 된 패키지가 있습니다.
ㅏ methodPerl 내에는 패키지로 정의 된 서브 루틴이 있습니다. 메서드의 첫 번째 인수는 메서드가 현재 개체 또는 클래스에 영향을 미치는지 여부에 따라 개체 참조 또는 패키지 이름입니다.
Perl은 bless() 함수는 궁극적으로 객체가되는 참조를 반환하는 데 사용됩니다.
클래스 정의
Perl에서 클래스를 정의하는 것은 매우 간단합니다. 클래스는 가장 단순한 형태의 Perl 패키지에 해당합니다. Perl에서 클래스를 만들기 위해 먼저 패키지를 빌드합니다.
패키지는 사용자 정의 변수 및 서브 루틴의 자체 포함 된 단위로, 반복해서 다시 사용할 수 있습니다.
Perl 패키지는 Perl 프로그램 내에서 별도의 네임 스페이스를 제공하여 서브 루틴과 변수를 다른 패키지와 충돌하지 않도록 유지합니다.
Perl에서 Person이라는 클래스를 선언하려면-
package Person;
패키지 정의의 범위는 파일의 끝까지 또는 다른 패키지 키워드를 만날 때까지 확장됩니다.
개체 생성 및 사용
클래스 (객체)의 인스턴스를 생성하려면 객체 생성자가 필요합니다. 이 생성자는 패키지 내에 정의 된 메서드입니다. 대부분의 프로그래머는이 객체 생성자 메서드의 이름을 new로 선택하지만 Perl에서는 어떤 이름도 사용할 수 있습니다.
Perl에서는 모든 종류의 Perl 변수를 객체로 사용할 수 있습니다. 대부분의 Perl 프로그래머는 배열이나 해시에 대한 참조를 선택합니다.
Perl 해시 참조를 사용하여 Person 클래스에 대한 생성자를 생성 해 보겠습니다. 개체를 만들 때 개체 참조를 반환하는 패키지 내의 서브 루틴 인 생성자를 제공해야합니다. 개체 참조는 패키지의 클래스에 대한 참조를 축복하여 생성됩니다. 예를 들면-
package Person;
sub new {
my $class = shift;
my $self = { _firstName => shift, _lastName => shift, _ssn => shift, }; # Print all the values just for clarification. print "First Name is $self->{_firstName}\n";
print "Last Name is $self->{_lastName}\n"; print "SSN is $self->{_ssn}\n";
bless $self, $class;
return $self;
}
이제 객체를 만드는 방법을 살펴 보겠습니다.
$object = new Person( "Mohammad", "Saleem", 23234345);
클래스 변수에 값을 할당하지 않으려면 생성자에서 간단한 해시를 사용할 수 있습니다. 예를 들면-
package Person;
sub new {
my $class = shift; my $self = {};
bless $self, $class;
return $self;
}
방법 정의
다른 객체 지향 언어에는 프로그래머가 객체 데이터를 직접 변경하지 못하도록 데이터 보안 개념이 있으며 객체 데이터를 수정하는 접근 자 메서드를 제공합니다. Perl에는 개인 변수가 없지만 헬퍼 메소드의 개념을 사용하여 오브젝트 데이터를 조작 할 수 있습니다.
사람의 이름을 얻기 위해 도우미 메서드를 정의하자-
sub getFirstName {
return $self->{_firstName};
}
사람의 이름을 설정하는 또 다른 도우미 기능-
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}
이제 완전한 예제를 살펴 보겠습니다 : Keep Person 패키지와 도우미 함수를 Person.pm 파일에 저장합니다.
#!/usr/bin/perl
package Person;
sub new {
my $class = shift; my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
# Print all the values just for clarification.
print "First Name is $self->{_firstName}\n"; print "Last Name is $self->{_lastName}\n";
print "SSN is $self->{_ssn}\n"; bless $self, $class; return $self;
}
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}
sub getFirstName {
my( $self ) = @_; return $self->{_firstName};
}
1;
이제 employee.pl 파일의 Person 객체를 다음과 같이 사용합니다.
#!/usr/bin/perl
use Person;
$object = new Person( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
위의 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
계승
객체 지향 프로그래밍에는 상속이라는 매우 훌륭하고 유용한 개념이 있습니다. 상속은 단순히 부모 클래스의 속성과 메서드를 자식 클래스에서 사용할 수 있음을 의미합니다. 따라서 동일한 코드를 반복해서 작성할 필요가 없으며 부모 클래스를 상속 할 수 있습니다.
예를 들어, Person에서 상속되는 Employee 클래스를 가질 수 있습니다. 직원이 사람이기 때문에이를 "isa"관계라고합니다. Perl에는이를 돕기위한 특수 변수 @ISA가 있습니다. @ISA는 (메소드) 상속을 관리합니다.
다음은 상속을 사용하는 동안 고려해야 할 중요한 사항입니다.
Perl은 지정된 객체의 클래스에서 주어진 메소드 또는 속성, 즉 변수를 검색합니다.
Perl은 개체 클래스의 @ISA 배열에 정의 된 클래스를 검색합니다.
1 단계 또는 2 단계에서 메소드가 발견되지 않으면 Perl은 @ISA 트리에서 발견되는 경우 AUTOLOAD 서브 루틴을 사용합니다.
여전히 일치하는 메서드를 찾을 수없는 경우 Perl은 표준 Perl 라이브러리의 일부로 제공되는 UNIVERSAL 클래스 (패키지) 내에서 메서드를 검색합니다.
메서드가 여전히 발견되지 않으면 Perl은 포기하고 런타임 예외를 발생시킵니다.
따라서 Person 클래스에서 메서드와 특성을 상속 할 새 Employee 클래스를 만들려면 다음과 같이 코딩하면됩니다.이 코드를 Employee.pm에 유지합니다.
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
이제 Employee 클래스에는 Person 클래스에서 상속 된 모든 메서드와 속성이 있으며 다음과 같이 사용할 수 있습니다. 테스트를 위해 main.pl 파일을 사용합니다.
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "After Setting First Name is : $firstName\n";
위의 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
메서드 재정의
자식 클래스 Employee는 부모 클래스 Person의 모든 메서드를 상속합니다. 그러나 자식 클래스에서 해당 메서드를 재정의하려면 자체 구현을 제공하여 수행 할 수 있습니다. 하위 클래스에 추가 함수를 추가하거나 상위 클래스에있는 기존 메서드의 기능을 추가 또는 수정할 수 있습니다. 다음과 같이 수행 할 수 있습니다. Employee.pm 파일을 수정합니다.
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
# Override constructor
sub new {
my ($class) = @_; # Call the constructor of the parent class, Person. my $self = $class->SUPER::new( $_[1], $_[2], $_[3] );
# Add few more attributes
$self->{_id} = undef; $self->{_title} = undef;
bless $self, $class;
return $self; } # Override helper function sub getFirstName { my( $self ) = @_;
# This is child class function.
print "This is child class helper function\n";
return $self->{_firstName}; } # Add more methods sub setLastName{ my ( $self, $lastName ) = @_; $self->{_lastName} = $lastName if defined($lastName);
return $self->{_lastName}; } sub getLastName { my( $self ) = @_;
return $self->{_lastName};
}
1;
이제 main.pl 파일에서 Employee 개체를 다시 사용하여 실행 해 보겠습니다.
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName = $object->getFirstName();
print "Before Setting First Name is : $firstName\n"; # Now Set first name using helper function. $object->setFirstName( "Mohd." );
# Now get first name set by helper function.
$firstName = $object->getFirstName();
print "After Setting First Name is : $firstName\n";
위의 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
This is child class helper function
Before Setting First Name is : Mohammad
This is child class helper function
After Setting First Name is : Mohd.
기본 자동 로딩
Perl은 다른 프로그래밍 언어에서는 찾을 수없는 기능인 기본 서브 루틴을 제공합니다. 즉, 함수를 정의하면AUTOLOAD(),그러면 정의되지 않은 서브 루틴에 대한 모든 호출이 AUTOLOAD () 함수를 자동으로 호출합니다. 누락 된 서브 루틴의 이름은이 서브 루틴 내에서 $ AUTOLOAD로 액세스 할 수 있습니다.
기본 자동로드 기능은 오류 처리에 매우 유용합니다. 다음은 AUTOLOAD를 구현하는 예입니다.이 기능을 원하는 방식으로 구현할 수 있습니다.
sub AUTOLOAD {
my $self = shift; my $type = ref ($self) || croak "$self is not an object";
my $field = $AUTOLOAD;
$field =~ s/.*://; unless (exists $self->{$field}) { croak "$field does not exist in object/class $type"; } if (@_) { return $self->($name) = shift; } else { return $self->($name);
}
}
소멸자 및 가비지 컬렉션
이전에 객체 지향 프로그래밍을 사용하여 프로그래밍 한 적이 있다면 destructor사용을 마치면 개체에 할당 된 메모리를 해제합니다. Perl은 개체가 범위를 벗어나는 즉시 자동으로이 작업을 수행합니다.
파일 닫기 또는 추가 처리를 처리해야하는 소멸자를 구현하려면 다음과 같은 특수 메서드를 정의해야합니다. DESTROY. 이 메서드는 Perl이 할당 된 메모리를 해제하기 직전에 개체에서 호출됩니다. 다른 모든 측면에서 DESTROY 메서드는 다른 메서드와 동일하며이 메서드 내에서 원하는 논리를 구현할 수 있습니다.
소멸자 메서드는 다음과 같은 경우에 자동으로 호출되는 DESTROY라는 멤버 함수 (서브 루틴)입니다.
- 개체 참조의 변수가 범위를 벗어날 때.
- 객체 참조의 변수가 정의되지 않은 경우.
- 스크립트가 종료 될 때
- Perl 인터프리터가 종료 될 때
예를 들어, 클래스에 다음 메소드 DESTROY를 넣을 수 있습니다.
package MyClass;
...
sub DESTROY {
print "MyClass::DESTROY called\n";
}
객체 지향 Perl 예제
다음은 Perl의 객체 지향 개념을 이해하는 데 도움이되는 또 다른 좋은 예입니다. 이 소스 코드를 perl 파일에 넣고 실행하십시오.
#!/usr/bin/perl
# Following is the implementation of simple Class.
package MyClass;
sub new {
print "MyClass::new called\n";
my $type = shift; # The package/type name
my $self = {}; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MyClass::DESTROY called\n"; } sub MyMethod { print "MyClass::MyMethod called!\n"; } # Following is the implemnetation of Inheritance. package MySubClass; @ISA = qw( MyClass ); sub new { print "MySubClass::new called\n"; my $type = shift; # The package/type name
my $self = MyClass->new; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MySubClass::DESTROY called\n"; } sub MyMethod { my $self = shift;
$self->SUPER::MyMethod(); print " MySubClass::MyMethod called!\n"; } # Here is the main program using above classes. package main; print "Invoke MyClass method\n"; $myObject = MyClass->new();
$myObject->MyMethod(); print "Invoke MySubClass method\n"; $myObject2 = MySubClass->new();
$myObject2->MyMethod(); print "Create a scoped object\n"; { my $myObject2 = MyClass->new();
}
# Destructor is called automatically here
print "Create and undef an object\n";
$myObject3 = MyClass->new(); undef $myObject3;
print "Fall off the end of the script...\n";
# Remaining destructors are called automatically here
위의 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.
Invoke MyClass method
MyClass::new called
MyClass::MyMethod called!
Invoke MySubClass method
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
MySubClass::MyMethod called!
Create a scoped object
MyClass::new called
MyClass::DESTROY called
Create and undef an object
MyClass::new called
MyClass::DESTROY called
Fall off the end of the script...
MyClass::DESTROY called
MySubClass::DESTROY called
이 장에서는 Perl 스크립트 내에서 데이터베이스에 액세스하는 방법을 설명합니다. Perl 5부터는 다음을 사용하여 데이터베이스 애플리케이션을 작성하기가 매우 쉬워졌습니다.DBI기준 치수. DBI는Database Independent Interface 즉, DBI는 Perl 코드와 기본 데이터베이스 사이에 추상화 계층을 제공하므로 데이터베이스 구현을 정말 쉽게 전환 할 수 있습니다.
DBI는 Perl 프로그래밍 언어를위한 데이터베이스 액세스 모듈입니다. 사용중인 실제 데이터베이스에 관계없이 일관된 데이터베이스 인터페이스를 제공하는 일련의 메소드, 변수 및 규칙을 제공합니다.
DBI 애플리케이션의 아키텍처
DBI는 백엔드에서 사용 가능한 모든 데이터베이스와 독립적입니다. Oracle, MySQL 또는 Informix 등으로 작업하든 상관없이 DBI를 사용할 수 있습니다. 이것은 다음 아키텍처 다이어그램에서 분명합니다.
여기서 DBI는 API (즉, 응용 프로그래밍 인터페이스)를 통해 모든 SQL 명령을 가져와 실제 실행을 위해 적절한 드라이버로 보내는 일을 담당합니다. 마지막으로 DBI는 드라이버의 결과를 가져 와서 호출하는 스크립트에 돌려주는 책임이 있습니다.
표기법 및 규칙
이 장 전체에서 다음 표기법이 사용되며 동일한 규칙을 따르는 것이 좋습니다.
$dsn Database source name $dbh Database handle object
$sth Statement handle object $h Any of the handle types above ($dbh, $sth, or $drh) $rc General Return Code (boolean: true=ok, false=error)
$rv General Return Value (typically an integer) @ary List of values returned from the database. $rows Number of rows processed (if available, else -1)
$fh A filehandle
undef NULL values are represented by undefined values in Perl
\%attr Reference to a hash of attribute values passed to methods
데이터베이스 연결
MySQL 데이터베이스로 작업한다고 가정합니다. 데이터베이스에 연결하기 전에 다음 사항을 확인하십시오. MySQL 데이터베이스에서 데이터베이스와 테이블을 만드는 방법을 모르는 경우 MySQL 자습서를 참조 할 수 있습니다.
이름이 TESTDB 인 데이터베이스를 만들었습니다.
TESTDB에 이름이 TEST_TABLE 인 테이블을 생성했습니다.
이 테이블에는 FIRST_NAME, LAST_NAME, AGE, SEX 및 INCOME 필드가 있습니다.
사용자 ID "testuser"및 비밀번호 "test123"은 TESTDB에 액세스하도록 설정됩니다.
Perl 모듈 DBI가 컴퓨터에 올바르게 설치되었습니다.
MySQL 기본 사항을 이해하기 위해 MySQL 자습서를 살펴 보았습니다.
다음은 MySQL 데이터베이스 "TESTDB"와 연결하는 예입니다.
#!/usr/bin/perl
use DBI
use strict;
my $driver = "mysql";
my $database = "TESTDB"; my $dsn = "DBI:$driver:database=$database";
my $userid = "testuser"; my $password = "test123";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
데이터 소스와 연결이 설정되면 데이터베이스 핸들이 반환되고 추가 사용을 위해 $ dbh에 저장됩니다. 그렇지 않으면 $ dbh가 undef 값으로 설정 되고 $ DBI :: errstr은 오류 문자열을 반환합니다.
INSERT 작업
테이블에 일부 레코드를 만들려면 INSERT 작업이 필요합니다. 여기에서는 TEST_TABLE 테이블을 사용하여 레코드를 만듭니다. 따라서 데이터베이스 연결이 설정되면 TEST_TABLE에 레코드를 만들 준비가 된 것입니다. 다음은 TEST_TABLE에 단일 레코드를 생성하는 절차입니다. 동일한 개념을 사용하여 원하는만큼 레코드를 만들 수 있습니다.
레코드 생성은 다음 단계를 따릅니다-
INSERT 문으로 SQL 문을 준비합니다. 이것은 사용하여 수행됩니다prepare() API.
SQL 쿼리를 실행하여 데이터베이스에서 모든 결과를 선택합니다. 이것은 사용하여 수행됩니다execute() API.
Stattement 핸들을 해제합니다. 이것은 사용하여 수행됩니다finish() API.
모든 것이 잘되면 commit 그렇지 않으면이 작업을 수행 할 수 있습니다. rollback완전한 거래. 커밋 및 롤백은 다음 섹션에서 설명합니다.
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
('john', 'poul', 'M', 30, 13000)");
$sth->execute() or die $DBI::errstr;
$sth->finish(); $dbh->commit or die $DBI::errstr;
바인드 값 사용
입력 할 값을 미리 제공하지 않는 경우가 있습니다. 따라서 런타임에 필요한 값을 취하는 바인드 변수를 사용할 수 있습니다. Perl DBI 모듈은 실제 값 대신 물음표를 사용하고 실제 값은 런타임에 execute () API를 통해 전달됩니다. 다음은 예입니다-
my $first_name = "john";
my $last_name = "poul"; my $sex = "M";
my $income = 13000; my $age = 30;
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
(?,?,?,?)");
$sth->execute($first_name,$last_name,$sex, $age, $income)
or die $DBI::errstr; $sth->finish();
$dbh->commit or die $DBI::errstr;
읽기 작업
모든 데이터베이스에 대한 읽기 작업은 데이터베이스에서 유용한 정보, 즉 하나 이상의 테이블에서 하나 이상의 레코드를 가져 오는 것을 의미합니다. 따라서 데이터베이스 연결이 설정되면이 데이터베이스에 쿼리를 작성할 준비가 된 것입니다. 다음은 AGE가 20보다 큰 모든 레코드를 쿼리하는 절차입니다. 이는 4 단계를 거치게됩니다.
필수 조건에 따라 SQL SELECT 쿼리를 준비합니다. 이것은 사용하여 수행됩니다prepare() API.
SQL 쿼리를 실행하여 데이터베이스에서 모든 결과를 선택합니다. 이것은 사용하여 수행됩니다execute() API.
모든 결과를 하나씩 가져와 그 결과를 인쇄합니다. fetchrow_array() API.
Stattement 핸들을 해제합니다. 이것은 사용하여 수행됩니다finish() API.
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > 20");
$sth->execute() or die $DBI::errstr;
print "Number of rows found :" + $sth->rows; while (my @row = $sth->fetchrow_array()) {
my ($first_name, $last_name ) = @row;
print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();
바인드 값 사용
사전에 조건이 주어지지 않은 경우가 있습니다. 따라서 런타임에 필요한 값을 사용하는 바인드 변수를 사용할 수 있습니다. Perl DBI 모듈은 실제 값 대신 물음표를 사용하고 실제 값은 런타임에 execute () API를 통해 전달됩니다. 다음은 예입니다-
$age = 20;
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > ?");
$sth->execute( $age ) or die $DBI::errstr; print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) { my ($first_name, $last_name ) = @row; print "First Name = $first_name, Last Name = $last_name\n"; } $sth->finish();
업데이트 작업
모든 데이터베이스에 대한 UPDATE 작업은 데이터베이스 테이블에서 이미 사용 가능한 하나 이상의 레코드를 업데이트하는 것을 의미합니다. 다음은 SEX가 'M'인 모든 레코드를 업데이트하는 절차입니다. 여기서 우리는 모든 남성의 나이를 1 년 늘릴 것입니다. 세 단계가 필요합니다.
필요한 조건에 따라 SQL 쿼리를 준비합니다. 이것은 사용하여 수행됩니다prepare() API.
SQL 쿼리를 실행하여 데이터베이스에서 모든 결과를 선택합니다. 이것은 사용하여 수행됩니다execute() API.
Stattement 핸들을 해제합니다. 이것은 사용하여 수행됩니다finish() API.
모든 것이 잘되면 commit 그렇지 않으면이 작업을 수행 할 수 있습니다. rollback완전한 거래. 커밋 및 롤백 API는 다음 섹션을 참조하세요.
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET AGE = AGE + 1
WHERE SEX = 'M'");
$sth->execute() or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
바인드 값 사용
사전에 조건이 주어지지 않은 경우가 있습니다. 따라서 런타임에 필요한 값을 사용하는 바인드 변수를 사용할 수 있습니다. Perl DBI 모듈은 실제 값 대신 물음표를 사용하고 실제 값은 런타임에 execute () API를 통해 전달됩니다. 다음은 예입니다-
$sex = 'M'; my $sth = $dbh->prepare("UPDATE TEST_TABLE SET AGE = AGE + 1 WHERE SEX = ?"); $sth->execute('$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
어떤 경우에는 미리 부여되지 않은 값을 설정하고 싶을 때 다음과 같이 바인딩 값을 사용할 수 있습니다. 이 예에서 모든 남성의 소득은 10000으로 설정됩니다.
$sex = 'M'; $income = 10000;
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET INCOME = ?
WHERE SEX = ?");
$sth->execute( $income, '$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
작업 삭제
데이터베이스에서 일부 레코드를 삭제하려면 DELETE 작업이 필요합니다. 다음은 AGE가 30 인 TEST_TABLE에서 모든 레코드를 삭제하는 절차입니다.이 작업은 다음 단계를 수행합니다.
필요한 조건에 따라 SQL 쿼리를 준비합니다. 이것은 사용하여 수행됩니다prepare() API.
데이터베이스에서 필요한 레코드를 삭제하기 위해 SQL 쿼리를 실행합니다. 이것은 사용하여 수행됩니다execute() API.
Stattement 핸들을 해제합니다. 이것은 사용하여 수행됩니다finish() API.
모든 것이 잘되면 commit 그렇지 않으면이 작업을 수행 할 수 있습니다. rollback 완전한 거래.
$age = 30; my $sth = $dbh->prepare("DELETE FROM TEST_TABLE WHERE AGE = ?"); $sth->execute( $age ) or die $DBI::errstr;
print "Number of rows deleted :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
do 문 사용
UPDATE, INSERT 또는 DELETE를 수행하는 경우 데이터베이스에서 돌아 오는 데이터가 없으므로이 작업을 수행하는 지름길이 있습니다. 당신이 사용할 수있는do 다음과 같이 명령을 실행합니다.
$dbh->do('DELETE FROM TEST_TABLE WHERE age =30');
do성공하면 참 값을 반환하고 실패하면 거짓 값을 반환합니다. 실제로 성공하면 영향을받는 행의 수를 반환합니다. 이 예에서는 실제로 삭제 된 행 수를 반환합니다.
COMMIT 작업
커밋은 변경 사항을 완료하기 위해 데이터베이스에 녹색 신호를 제공하는 작업이며이 작업 후에는 변경 사항을 원래 위치로 되돌릴 수 없습니다.
다음은 호출하는 간단한 예입니다. commit API.
$dbh->commit or die $dbh->errstr;
ROLLBACK 작업
모든 변경 사항이 만족스럽지 않거나 작업 사이에 오류가 발생하면 해당 변경 사항을 되돌려 사용할 수 있습니다. rollback API.
다음은 호출하는 간단한 예입니다. rollback API.
$dbh->rollback or die $dbh->errstr;
거래 시작
많은 데이터베이스가 트랜잭션을 지원합니다. 즉, 데이터베이스를 수정하는 전체 쿼리를 만들 수 있지만 실제로 변경된 사항은 없습니다. 그런 다음 마지막에 특수 SQL 쿼리를 실행합니다.COMMIT, 모든 변경이 동시에 이루어집니다. 또는 쿼리 ROLLBACK을 실행할 수 있습니다.이 경우 모든 변경 사항이 삭제되고 데이터베이스는 변경되지 않습니다.
Perl DBI 모듈 제공 begin_work다음 호출이 커밋 또는 롤백 될 때까지 트랜잭션 (AutoCommit 해제)을 활성화하는 API. 다음 커밋 또는 롤백 후에 자동 커밋이 자동으로 다시 켜집니다.
$rc = $dbh->begin_work or die $dbh->errstr;
자동 커밋 옵션
트랜잭션이 단순하다면 많은 커밋을 실행해야하는 번거 로움을 덜 수 있습니다. 연결 호출을 할 때 다음을 지정할 수 있습니다.AutoCommit쿼리가 성공할 때마다 자동 커밋 작업을 수행하는 옵션입니다. 다음과 같이 보입니다.
my $dbh = DBI->connect($dsn, $userid, $password,
{AutoCommit => 1})
or die $DBI::errstr;
여기서 AutoCommit은 값 1 또는 0을 취할 수 있습니다. 여기서 1은 AutoCommit이 켜져 있음을 의미하고 0은 AutoCommit이 꺼져 있음을 의미합니다.
자동 오류 처리
연결 호출을 할 때 자동으로 오류를 처리하는 RaiseErrors 옵션을 지정할 수 있습니다. 오류가 발생하면 DBI는 오류 코드를 반환하는 대신 프로그램을 중단합니다. 오류 발생시 프로그램을 중단하는 것만으로도 편리 할 수 있습니다. 다음과 같이 보입니다.
my $dbh = DBI->connect($dsn, $userid, $password, {RaiseError => 1}) or die $DBI::errstr;
여기서 RaiseError는 값 1 또는 0을 취할 수 있습니다.
데이터베이스 연결 해제
데이터베이스 연결을 끊으려면 다음을 사용하십시오. disconnect 다음과 같이 API-
$rc = $dbh->disconnect or warn $dbh->errstr;
disconnect 메소드의 트랜잭션 동작은 슬프게도 정의되지 않았습니다. 일부 데이터베이스 시스템 (예 : Oracle 및 Ingres)은 미해결 변경 사항을 자동으로 커밋하지만 다른 데이터베이스 시스템 (예 : Informix)은 미해결 변경 사항을 롤백합니다. 자동 커밋을 사용하지 않는 응용 프로그램은 연결 해제를 호출하기 전에 명시 적으로 커밋 또는 롤백을 호출해야합니다.
NULL 값 사용
정의되지 않은 값 또는 undef는 NULL 값을 나타내는 데 사용됩니다. NULL이 아닌 값과 마찬가지로 NULL 값으로 열을 삽입하고 업데이트 할 수 있습니다. 이 예제는 NULL 값으로 열 나이를 삽입하고 업데이트합니다.
$sth = $dbh->prepare(qq { INSERT INTO TEST_TABLE (FIRST_NAME, AGE) VALUES (?, ?) }); $sth->execute("Joe", undef);
여기 qq{} 인용 된 문자열을 반환하는 데 사용됩니다. prepareAPI. 그러나 WHERE 절에서 NULL 값을 사용하려는 경우주의해야합니다. 고려-
SELECT FIRST_NAME FROM TEST_TABLE WHERE age = ?
undef (NULL)를 자리 표시 자에 바인딩하면 NULL 기간이있는 행이 선택되지 않습니다! 최소한 SQL 표준을 준수하는 데이터베이스 엔진의 경우. 이에 대한 이유는 데이터베이스 엔진의 SQL 매뉴얼이나 SQL 책을 참조하십시오. NULL을 명시 적으로 선택하려면 "WHERE age IS NULL"이라고 말해야합니다.
일반적인 문제는 런타임에 정의되거나 undef (NULL 또는 NULL이 아님) 될 수있는 값을 코드 조각에서 처리하도록하는 것입니다. 간단한 기술은 필요에 따라 적절한 문을 준비하고 NULL이 아닌 경우 자리 표시자를 대체하는 것입니다.
$sql_clause = defined $age? "age = ?" : "age IS NULL";
$sth = $dbh->prepare(qq {
SELECT FIRST_NAME FROM TEST_TABLE WHERE $sql_clause }); $sth->execute(defined $age ? $age : ());
기타 DBI 기능
available_drivers
@ary = DBI->available_drivers;
@ary = DBI->available_drivers($quiet);
@INC의 디렉터리를 통해 DBD :: * 모듈을 검색하여 사용 가능한 모든 드라이버 목록을 반환합니다. 기본적으로 일부 드라이버가 이전 디렉토리에서 동일한 이름의 다른 드라이버에 의해 숨겨지면 경고가 표시됩니다. $ quiet에 대해 참 값을 전달하면 경고가 표시되지 않습니다.
설치된 _ 드라이버
%drivers = DBI->installed_drivers();
현재 프로세스에 '설치된'(로드 된) 모든 드라이버에 대한 드라이버 이름 및 드라이버 핸들 쌍 목록을 반환합니다. 드라이버 이름에는 'DBD ::'접두사가 포함되지 않습니다.
데이터 소스
@ary = DBI->data_sources($driver);
명명 된 드라이버를 통해 사용할 수있는 데이터 소스 (데이터베이스) 목록을 반환합니다. $ driver가 비어 있거나 undef이면 DBI_DRIVER 환경 변수의 값이 사용됩니다.
인용문
$sql = $dbh->quote($value); $sql = $dbh->quote($value, $data_type);
문자열에 포함 된 특수 문자 (예 : 인용 부호)를 이스케이프하고 필요한 유형의 외부 인용 부호를 추가하여 SQL 문에서 리터럴 값으로 사용할 문자열 리터럴을 인용하십시오.
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
대부분의 데이터베이스 유형에서 quote는 'Don''t'(외부 인용 부호 포함)를 반환합니다. quote () 메소드가 원하는 문자열로 평가되는 SQL 표현식을 리턴하는 것은 유효합니다. 예를 들면-
$quoted = $dbh->quote("one\ntwo\0three")
may produce results which will be equivalent to
CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')
모든 핸들에 공통적 인 방법
오류
$rv = $h->err; or $rv = $DBI::err or $rv = $h->err
마지막으로 호출 된 드라이버 메서드에서 네이티브 데이터베이스 엔진 오류 코드를 반환합니다. 코드는 일반적으로 정수이지만이를 가정해서는 안됩니다. 이는 $ DBI :: err 또는 $ h-> err와 동일합니다.
errstr
$str = $h->errstr; or $str = $DBI::errstr or $str = $h->errstr
마지막으로 호출 된 DBI 메서드에서 네이티브 데이터베이스 엔진 오류 메시지를 반환합니다. 이것은 위에서 설명한 "err"메소드와 동일한 수명 문제를 가지고 있습니다. 이는 $ DBI :: errstr 또는 $ h-> errstr과 동일합니다.
행
$rv = $h->rows; or $rv = $DBI::rows
이는 이전 SQL 문에 의해 영향을 받고 $ DBI :: rows에 해당하는 행 수를 반환합니다.
자취
$h->trace($trace_settings);
DBI는 수행중인 작업에 대한 런타임 추적 정보를 생성 할 수있는 매우 유용한 기능을 갖추고 있으므로 DBI 프로그램에서 이상한 문제를 추적하려고 할 때 시간을 크게 절약 할 수 있습니다. 다른 값을 사용하여 추적 레벨을 설정할 수 있습니다. 이 값은 0에서 4까지 다양합니다. 값 0은 추적 사용 안함을 의미하고 4는 완전한 추적 생성을 의미합니다.
보간 된 진술은 금지됩니다.
다음과 같이 보간 된 문을 사용하지 않는 것이 좋습니다.
while ($first_name = <>) { my $sth = $dbh->prepare("SELECT * FROM TEST_TABLE WHERE FIRST_NAME = '$first_name'");
$sth->execute();
# and so on ...
}
따라서 보간 된 문을 대신 사용하지 마십시오. bind value 동적 SQL 문을 준비합니다.
CGI 란 무엇입니까?
CGI (Common Gateway Interface)는 웹 서버와 사용자 지정 스크립트간에 정보가 교환되는 방식을 정의하는 표준 집합입니다.
CGI 사양은 현재 NCSA에서 유지 관리하고 있으며 NCSA는 CGI를 다음과 같이 정의합니다.
CGI (Common Gateway Interface)는 HTTP 서버와 같은 정보 서버와 인터페이스하기위한 외부 게이트웨이 프로그램의 표준입니다.
현재 버전은 CGI / 1.1이며 CGI / 1.2가 진행 중입니다.
웹 브라우징
CGI의 개념을 이해하기 위해 웹 페이지에서 사용 가능한 하이퍼 링크를 클릭하여 특정 웹 페이지 또는 URL을 검색 할 때 어떤 일이 발생하는지 살펴 보겠습니다.
브라우저는 HTTP 프로토콜을 사용하여 웹 서버에 접속하고 URL (예 : 웹 페이지 파일 이름)을 요구합니다.
웹 서버는 URL을 확인하고 요청 된 파일 이름을 찾습니다. 웹 서버가 해당 파일을 찾으면 추가 실행없이 브라우저로 파일을 다시 보냅니다. 그렇지 않으면 잘못된 파일을 요청했음을 나타내는 오류 메시지를 보냅니다.
웹 브라우저는 웹 서버로부터 응답을 받아 수신 된 파일 내용을 표시하거나 파일을 찾을 수없는 경우 오류 메시지를 표시합니다.
그러나 특정 디렉토리의 파일이 요청 될 때마다 해당 파일이 다시 전송되지 않도록 HTTP 서버를 설정할 수 있습니다. 대신 프로그램으로 실행되고 그 프로그램이 결과로 출력하는 모든 내용이 브라우저에 표시되도록 다시 전송됩니다. 이것은 웹 서버에서 사용할 수있는 특수 기능을 사용하여 수행 할 수 있으며Common Gateway Interface또는 CGI 및 최종 결과를 생성하기 위해 서버에 의해 실행되는 이러한 프로그램을 CGI 스크립트라고합니다. 이러한 CGI 프로그램은 PERL 스크립트, 쉘 스크립트, C 또는 C ++ 프로그램 등이 될 수 있습니다.
CGI 아키텍처 다이어그램
웹 서버 지원 및 구성
CGI 프로그래밍을 진행하기 전에 웹 서버가 CGI 기능을 지원하고 CGI 프로그램을 처리하도록 구성되어 있는지 확인하십시오. 웹 서버에서 실행되는 모든 CGI 프로그램은 미리 구성된 디렉토리에 보관됩니다. 이 디렉토리를 CGI 디렉토리라고하며 관례 적으로 / cgi-bin으로 이름이 지정됩니다. 관례 상 Perl CGI 파일은 다음과 같은 확장자를 갖습니다..cgi.
첫 번째 CGI 프로그램
다음은 hello.cgi 라는 CGI 스크립트에 연결된 간단한 링크입니다 . 이 파일은/cgi-bin/다음과 같은 내용이 있습니다. CGI 프로그램을 실행하기 전에 다음을 사용하여 파일 모드를 변경했는지 확인하십시오.chmod 755 hello.cgi UNIX 명령.
#!/usr/bin/perl
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';
1;
이제 클릭하면 hello.cgi 링크는 / cgi-bin 디렉토리에서 hello.cgi를 검색하는 웹 서버로 이동하여 실행하고 결과가 생성되면 웹 서버는 해당 결과를 웹 브라우저로 다시 보냅니다.
Hello Word! This is my first CGI program
이 hello.cgi 스크립트는 STDOUT 파일, 즉 화면에 출력을 작성하는 간단한 Perl 스크립트입니다. 인쇄 할 첫 번째 줄인 중요하고 추가 기능이 하나 있습니다.Content-type:text/html\r\n\r\n. 이 행은 브라우저로 다시 전송되고 브라우저 화면에 표시 될 컨텐츠 유형을 지정합니다. 이제 당신은 CGI의 기본 개념을 충분히 이해하지 못했고 Perl을 사용하여 많은 복잡한 CGI 프로그램을 작성할 수 있습니다. 이 스크립트는 데이터베이스, 웹 서비스 또는 기타 복잡한 인터페이스와 같은 정보를 교환하기 위해 다른 실제 시스템과 상호 작용할 수도 있습니다.
HTTP 헤더 이해
첫 번째 줄 Content-type:text/html\r\n\r\nHTTP 헤더의 일부로, 브라우저가 서버 측에서 들어오는 콘텐츠를 이해할 수 있도록 브라우저로 전송됩니다. 모든 HTTP 헤더는 다음과 같은 형식이됩니다.
HTTP Field Name: Field Content
예를 들어-
Content-type:text/html\r\n\r\n
CGI 프로그래밍에서 자주 사용하게 될 다른 중요한 HTTP 헤더는 거의 없습니다.
Sr. 아니. | 헤더 및 설명 |
---|---|
1 | Content-type: String 반환되는 콘텐츠의 형식을 정의하는 MIME 문자열입니다. 예는 Content-type : text / html입니다. |
2 | Expires: Date String 정보가 무효화되는 날짜입니다. 이것은 브라우저가 페이지를 새로 고쳐야 할시기를 결정하는 데 사용해야합니다. 유효한 날짜 문자열은 01 Jan 1998 12:00:00 GMT 형식이어야합니다. |
삼 | Location: URL String 요청 된 URL 대신 반환되어야하는 URL입니다. 이 파일을 사용하여 요청을 다른 위치로 리디렉션 할 수 있습니다. |
4 | Last-modified: String 파일을 마지막으로 수정 한 날짜입니다. |
5 | Content-length: String 리턴되는 데이터의 길이 (바이트)입니다. 브라우저는이 값을 사용하여 파일의 예상 다운로드 시간을보고합니다. |
6 | Set-Cookie: String 문자열을 통해 전달되는 쿠키 설정 |
CGI 환경 변수
모든 CGI 프로그램은 다음 환경 변수에 액세스 할 수 있습니다. 이러한 변수는 CGI 프로그램을 작성하는 동안 중요한 역할을합니다.
Sr. 아니. | 변수 이름 및 설명 |
---|---|
1 | CONTENT_TYPE 콘텐츠의 데이터 유형입니다. 클라이언트가 첨부 된 콘텐츠를 서버로 보낼 때 사용됩니다. 예를 들어 파일 업로드 등 |
2 | CONTENT_LENGTH 쿼리 정보의 길이입니다. POST 요청에만 사용할 수 있습니다. |
삼 | HTTP_COOKIE 설정된 쿠키를 키 및 값 쌍의 형태로 반환합니다. |
4 | HTTP_USER_AGENT User-Agent 요청 헤더 필드에는 요청을 시작한 사용자 에이전트에 대한 정보가 포함됩니다. 웹 브라우저의 이름입니다. |
5 | PATH_INFO CGI 스크립트의 경로입니다. |
6 | QUERY_STRING GET 메서드 요청과 함께 전송되는 URL 인코딩 정보입니다. |
7 | REMOTE_ADDR 요청하는 원격 호스트의 IP 주소입니다. 이는 로깅 또는 인증 목적으로 유용 할 수 있습니다. |
8 | REMOTE_HOST 요청하는 호스트의 완전한 이름입니다. 이 정보를 사용할 수없는 경우 REMOTE_ADDR을 사용하여 IR 주소를 가져올 수 있습니다. |
9 | REQUEST_METHOD 요청을 만드는 데 사용되는 방법입니다. 가장 일반적인 방법은 GET 및 POST입니다. |
10 | SCRIPT_FILENAME CGI 스크립트의 전체 경로입니다. |
11 | SCRIPT_NAME CGI 스크립트의 이름입니다. |
12 | SERVER_NAME 서버의 호스트 이름 또는 IP 주소. |
13 | SERVER_SOFTWARE 서버가 실행중인 소프트웨어의 이름과 버전. |
다음은 웹 서버에서 지원하는 모든 CGI 변수를 나열하는 작은 CGI 프로그램입니다. 결과를 보려면이 링크를 클릭 하십시오. 환경 가져 오기
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
print "<b>$_</b>: $ENV{$_}<br>\n";
}
1;
"파일 다운로드"대화 상자를 올리시겠습니까?
때때로 사용자가 링크를 클릭하는 옵션을 제공하고 싶을 때가 있습니다. 그러면 실제 내용을 표시하는 대신 사용자에게 "파일 다운로드"대화 상자가 나타납니다. 이것은 매우 쉽고 HTTP 헤더를 통해 달성됩니다.
이 HTTP 헤더는 이전 섹션에서 언급 한 헤더와 다릅니다. 예를 들어,FileName 주어진 링크에서 다운로드 할 수있는 파일의 구문은 다음과 같습니다.
#!/usr/bin/perl
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) { print("$buffer");
}
GET 및 POST 메서드
브라우저에서 웹 서버로 그리고 궁극적으로 요청을 처리하는 CGI 프로그램으로 일부 정보를 전달해야 할 때 많은 상황이 발생했을 것입니다. 가장 자주 브라우저는 두 가지 방법을 사용하여이 정보를 웹 서버에 전달합니다. 이 방법은GET 방법 및 POST방법. 하나씩 확인합시다.
GET 메서드를 사용하여 정보 전달
GET 메서드는 페이지 URL 자체에 추가 된 인코딩 된 사용자 정보를 보냅니다. 페이지와 인코딩 된 정보는? 다음과 같이 문자-
http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2
GET 메서드는 브라우저에서 웹 서버로 정보를 전달하는 기본 메서드이며 브라우저의 Location : box에 표시되는 긴 문자열을 생성합니다. 서버에 전달할 비밀번호 또는 기타 민감한 정보가있는 경우 GET 메소드를 사용해서는 안됩니다. GET 메서드에는 크기 제한이 있습니다. 요청 문자열에는 1024 자만 전달할 수 있습니다.
이 정보는 QUERY_STRING CGI 프로그램에서 구문 분석하고 사용할 수있는 QUERY_STRING 환경 변수를 통해 CGI 프로그램에서 액세스 할 수 있습니다.
URL과 함께 키와 값 쌍을 연결하여 정보를 전달하거나 HTML <FORM> 태그를 사용하여 GET 메소드를 사용하여 정보를 전달할 수 있습니다.
간단한 URL 예 : Get 메서드
다음은 GET 메소드를 사용하여 hello_get.cgi 프로그램에 두 값을 전달하는 간단한 URL입니다.
http://www.tutorialspoint.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALI아래는 hello_get.cgi 웹 브라우저에서 제공하는 입력을 처리하는 스크립트입니다.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value; } $first_name = $FORM{first_name}; $last_name = $FORM{last_name}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Hello - Second CGI Program</title>"; print "</head>"; print "<body>"; print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
간단한 FORM 예 : GET 메서드
다음은 HTML FORM 및 제출 버튼을 사용하여 두 개의 값을 전달하는 간단한 예입니다. 이 입력을 처리하기 위해 동일한 CGI 스크립트 hello_get.cgi를 사용할 것입니다.
<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
다음은 위 양식 코딩의 실제 출력입니다. 이제 이름과 성을 입력하고 제출 버튼을 클릭하여 결과를 볼 수 있습니다.
POST 방법을 사용하여 정보 전달
정보를 CGI 프로그램에 전달하는보다 안정적인 방법은 POST방법. 이것은 GET 메소드와 똑같은 방식으로 정보를 패키징하지만,?URL에서 HTTP 헤더의 일부로 별도의 메시지로 보냅니다. 웹 서버는이 메시지를 표준 입력 형식으로 CGI 스크립트에 제공합니다.
아래는 수정 된 hello_post.cgi웹 브라우저에서 제공 한 입력을 처리하는 스크립트입니다. 이 스크립트는 GET 및 POST 메서드를 처리합니다.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
HTML FORM과 제출 버튼을 사용하여 두 값을 전달하는 위와 동일한 예를 다시 보겠습니다. 이 입력을 처리하기 위해 CGI 스크립트 hello_post.cgi를 사용할 것입니다.
<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
위 양식 코딩의 실제 출력은 다음과 같습니다. 이름과 성을 입력하고 제출 버튼을 클릭하여 결과를 확인합니다.
체크 박스 데이터를 CGI 프로그램에 전달
두 개 이상의 옵션을 선택해야하는 경우 확인란이 사용됩니다. 다음은 두 개의 확인란이있는 양식의 HTML 코드 예입니다.
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>
이 코드의 결과는 다음과 같습니다.
아래는 checkbox.cgi 라디오 버튼에 대해 웹 브라우저에서 제공 한 입력을 처리하는 스크립트입니다.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value; } if( $FORM{maths} ) {
$maths_flag ="ON"; } else { $maths_flag ="OFF";
}
if( $FORM{physics} ) { $physics_flag ="ON";
} else {
$physics_flag ="OFF"; } print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Checkbox - Third CGI Program</title>"; print "</head>"; print "<body>"; print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";
1;
라디오 버튼 데이터를 CGI 프로그램에 전달
라디오 버튼은 하나의 옵션 만 선택해야 할 때 사용됩니다. 다음은 두 개의 라디오 버튼이있는 양식에 대한 HTML 코드의 예입니다.
<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>
이 코드의 결과는 다음과 같습니다.
아래는 radiobutton.cgi 라디오 버튼에 대해 웹 브라우저에서 제공 한 입력을 처리하는 스크립트입니다.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{subject};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
CGI 프로그램에 텍스트 영역 데이터 전달
textarea 요소는 여러 줄 텍스트를 CGI 프로그램에 전달해야 할 때 사용됩니다. 다음은 TEXTAREA 상자가있는 양식에 대한 HTML 코드의 예입니다.
<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>
이 코드의 결과는 다음과 같습니다.
아래는 textarea.cgi 웹 브라우저에서 제공 한 입력을 처리하는 스크립트입니다.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";
1;
드롭 다운 상자 데이터를 CGI 프로그램에 전달
드롭 다운 상자는 사용 가능한 옵션이 많지만 하나 또는 두 개만 선택 될 때 사용됩니다. 다음은 드롭 다운 상자가 하나있는 양식의 HTML 코드 예입니다.
<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>
이 코드의 결과는 다음과 같습니다.
아래는 dropdown.cgi 웹 브라우저에서 제공하는 입력을 처리하는 스크립트입니다.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{dropdown};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
CGI에서 쿠키 사용
HTTP 프로토콜은 상태 비 저장 프로토콜입니다. 그러나 상업용 웹 사이트의 경우 서로 다른 페이지간에 세션 정보를 유지해야합니다. 예를 들어 하나의 사용자 등록은 여러 페이지에 걸친 트랜잭션 후에 종료됩니다. 그러나 모든 웹 페이지에서 사용자의 세션 정보를 유지하는 방법은 무엇입니까?
많은 상황에서 쿠키 사용은 더 나은 방문자 경험이나 사이트 통계에 필요한 선호도, 구매, 커미션 및 기타 정보를 기억하고 추적하는 가장 효율적인 방법입니다.
작동 원리
귀하의 서버는 쿠키 형태로 방문자의 브라우저에 일부 데이터를 보냅니다. 브라우저는 쿠키를 수락 할 수 있습니다. 그렇다면 방문자의 하드 드라이브에 일반 텍스트 레코드로 저장됩니다. 이제 방문자가 사이트의 다른 페이지에 도착하면 쿠키를 검색 할 수 있습니다. 검색되면 서버는 저장된 내용을 알고 / 기억합니다.
쿠키는 5 개의 가변 길이 필드의 일반 텍스트 데이터 레코드입니다.
Expires− 쿠키가 만료되는 날짜. 비어있는 경우 방문자가 브라우저를 종료 할 때 쿠키가 만료됩니다.
Domain − 사이트의 도메인 이름.
Path− 쿠키를 설정 한 디렉토리 또는 웹 페이지의 경로. 디렉토리 나 페이지에서 쿠키를 검색하려는 경우 비어있을 수 있습니다.
Secure−이 필드에 "secure"라는 단어가 포함되어 있으면 쿠키는 보안 서버에서만 검색 할 수 있습니다. 이 필드가 비어 있으면 그러한 제한이 없습니다.
Name = Value − 쿠키는 키와 값 쌍의 형태로 설정되고 재 조회됩니다.
쿠키 설정
브라우저에 쿠키를 보내는 것은 매우 쉽습니다. 이러한 쿠키는 HTTP 헤더와 함께 전송됩니다. UserID 및 Password를 쿠키로 설정한다고 가정합니다. 따라서 다음과 같이 수행됩니다.
#!/usr/bin/perl
print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....
여기서 우리는 Set-Cookie쿠키를 설정하기위한 HTTP 헤더. 만료, 도메인 및 경로와 같은 쿠키 속성을 설정하는 것은 선택 사항입니다. 매직 라인을 보내기 전에 쿠키가 설정된다는 점에 유의하는 것이 중요합니다."Content-type:text/html\r\n\r\n.
쿠키 검색
설정된 모든 쿠키를 검색하는 것은 매우 쉽습니다. 쿠키는 CGI 환경 변수 HTTP_COOKIE에 저장되며 다음과 같은 형태를 갖습니다.
key1 = value1;key2 = value2;key3 = value3....
다음은 쿠키를 검색하는 방법의 예입니다.
#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'}; @cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) { ($key, $val) = split(/=/, $cookie); # splits on the first =.
$key =~ s/^\s+//; $val =~ s/^\s+//;
$key =~ s/\s+$//;
$val =~ s/\s+$//;
if( $key eq "UserID" ) { $user_id = $val; } elsif($key eq "Password") {
$password = $val;
}
}
print "User ID = $user_id\n"; print "Password = $password\n";
검색 쿠키 스크립트를 호출하기 전에 위의 쿠키가 설정된 경우 다음과 같은 결과가 생성됩니다.
User ID = XYZ
Password = XYZ123
CGI 모듈 및 라이브러리
인터넷을 통해 CGI 프로그램에서 사용할 직접 기능을 제공하는 많은 내장 모듈을 찾을 수 있습니다. 다음은 중요한 한 번입니다.
CGI 모듈
버클리 cgi-lib.pl
패키지 란 무엇입니까?
그만큼 package문은 현재 명명 컨텍스트를 지정된 네임 스페이스 (기호 테이블)로 전환합니다. 따라서-
패키지는 자체 네임 스페이스에있는 코드 모음입니다.
네임 스페이스는 고유 변수 이름의 명명 된 모음입니다 (심볼 테이블이라고도 함).
네임 스페이스는 패키지 간의 변수 이름 충돌을 방지합니다.
패키지를 사용하면 모듈의 자체 네임 스페이스 외부에서 변수와 함수를 방해하지 않는 모듈을 만들 수 있습니다.
패키지는 다른 패키지 문이 호출 될 때까지 또는 현재 블록이나 파일이 끝날 때까지 유효합니다.
다음을 사용하여 패키지 내의 변수를 명시 적으로 참조 할 수 있습니다. :: 패키지 한정자.
다음은 파일에 main 및 Foo 패키지가있는 예입니다. 여기에서는 패키지 이름을 인쇄하기 위해 특수 변수 __PACKAGE__가 사용되었습니다.
#!/usr/bin/perl
# This is main package
$i = 1; print "Package name : " , __PACKAGE__ , " $i\n";
package Foo;
# This is Foo package
$i = 10; print "Package name : " , __PACKAGE__ , " $i\n";
package main;
# This is again main package
$i = 100; print "Package name : " , __PACKAGE__ , " $i\n";
print "Package name : " , __PACKAGE__ , " $Foo::i\n";
1;
위의 코드가 실행되면 다음 결과가 생성됩니다.
Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10
BEGIN 및 END 블록
각각 생성자 및 소멸자 역할을하는 BEGIN 및 END라는 코드 블록을 원하는만큼 정의 할 수 있습니다.
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
마다 BEGIN 블록은 perl 스크립트가로드되고 컴파일 된 후 다른 명령문이 실행되기 전에 실행됩니다.
모든 END 블록은 perl 인터프리터가 종료되기 직전에 실행됩니다.
BEGIN 및 END 블록은 Perl 모듈을 만들 때 특히 유용합니다.
다음 예제는 사용법을 보여줍니다-
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
위의 코드가 실행되면 다음 결과가 생성됩니다.
This is BEGIN Block
Begin and Block Demo
This is END Block
Perl 모듈이란 무엇입니까?
Perl 모듈은 확장자가 .pm 인 패키지 이름과 이름이 동일한 라이브러리 파일에 정의 된 재사용 가능한 패키지입니다.
Perl 모듈 파일 Foo.pm 다음과 같은 문장이 포함될 수 있습니다.
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
Perl 모듈에 대한 몇 가지 중요한 사항
기능 require 과 use 모듈을로드합니다.
둘 다 검색 경로 목록을 사용합니다. @INC 모듈을 찾습니다.
두 기능 require 과 use ~을 부르다 eval 코드를 처리하는 기능.
그만큼 1; 맨 아래에 있으면 eval이 TRUE로 평가되므로 실패하지 않습니다.
Require 함수
모듈은 다음을 호출하여로드 할 수 있습니다. require 다음과 같이 기능-
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
서브 루틴 이름이이를 호출하려면 완전한 이름이어야한다는 사실을 알고 있어야합니다. 서브 루틴을 활성화하면 좋을 것입니다.bar 과 blat Foo :: 한정자를 사용할 필요가 없도록 자체 네임 스페이스로 가져올 수 있습니다.
사용 기능
모듈은 다음을 호출하여로드 할 수 있습니다. use 함수.
#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );
패키지의 함수 이름을 완전히 한정 할 필요는 없습니다. 그만큼use 함수는 모듈 내부에 몇 가지 추가 된 명령문이 주어지면 모듈에서 심볼 목록을 내 보냅니다.
require Exporter;
@ISA = qw(Exporter);
그런 다음 이름이 지정된 목록 변수를 채워 기호 목록 (스칼라, 목록, 해시, 서브 루틴 등)을 제공합니다. @EXPORT: 예-
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" } sub splat { print "Not $_[0]\n" } # Not exported!
1;
Perl 모듈 트리 만들기
Perl 모듈을 출시 할 준비가되면 Perl 모듈 트리를 만드는 표준 방법이 있습니다. 이것은 사용하여 수행됩니다h2xs유용. 이 유틸리티는 Perl과 함께 제공됩니다. 다음은 h2xs를 사용하는 구문입니다.
$h2xs -AX -n ModuleName
예를 들어, 모듈이 Person.pm 다음 명령을 실행하십시오.
$h2xs -AX -n Person
이것은 다음 결과를 생성합니다-
Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST
다음은 이러한 옵션에 대한 설명입니다.
-A Autoloader 코드를 생략합니다 (자주 사용되지 않는 많은 서브 루틴을 정의하는 모듈에서 가장 잘 사용됨).
-X XS 요소를 생략합니다 (eXternal 서브 루틴, 여기서 eXternal은 Perl의 외부, 즉 C).
-n 모듈의 이름을 지정합니다.
따라서 위의 명령은 Person 디렉토리 내에 다음 구조를 생성합니다. 실제 결과는 위에 표시됩니다.
- Changes
- Makefile.PL
- MANIFEST (패키지의 모든 파일 목록 포함)
- README
- t / (테스트 파일)
- lib / (실제 소스 코드는 여기에 있습니다
그래서 마침내 tar이 디렉토리 구조를 Person.tar.gz 파일에 저장하면이를 제공 할 수 있습니다. 적절한 지침에 따라 README 파일을 업데이트해야합니다. t 디렉토리에 몇 가지 테스트 예제 파일을 제공 할 수도 있습니다.
Perl 모듈 설치
tar.gz 파일 형식으로 Perl 모듈을 다운로드하십시오. 다음 순서를 사용하여 Perl 모듈을 설치하십시오.Person.pm 로 다운로드되었습니다 Person.tar.gz 파일.
tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install
Perl 인터프리터에는 모듈 (전역 배열 @INC)을 검색하는 디렉토리 목록이 있습니다.
Perl을 다양한 방법으로 사용하여 요구 사항에 따라 새 프로세스를 만들 수 있습니다. 이 튜토리얼은 Perl 프로세스를 생성하고 관리하는 데 가장 중요하고 자주 사용되는 몇 가지 방법을 나열합니다.
특수 변수를 사용할 수 있습니다. $$ 또는 $PROCESS_ID 현재 프로세스 ID를 가져옵니다.
언급 된 방법 중 하나를 사용하여 생성 된 모든 프로세스는 자체 가상 환경을 유지합니다. %ENV 변하기 쉬운.
그만큼 exit() 함수는 항상이 함수를 실행하는 하위 프로세스 만 종료하고 실행중인 모든 하위 프로세스가 종료되지 않는 한 전체 메인 프로세스는 종료되지 않습니다.
열려있는 모든 핸들은 자식 프로세스에서 dup () 처리되므로 한 프로세스에서 핸들을 닫아도 다른 핸들에는 영향을주지 않습니다.
백 스틱 연산자
Unix 명령을 실행하는 가장 간단한 방법은 백 스틱 연산자를 사용하는 것입니다. 백 스틱 연산자 안에 명령을 입력하면 명령이 실행되고 다음과 같이 저장 될 수있는 결과가 반환됩니다.
#!/usr/bin/perl
@files = `ls -l`;
foreach $file (@files) { print $file;
}
1;
위의 코드가 실행되면 현재 디렉토리에서 사용 가능한 모든 파일과 디렉토리를 나열합니다.
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm
drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
system () 함수
당신은 또한 사용할 수 있습니다 system()모든 Unix 명령을 실행하는 함수. 출력은 perl 스크립트의 출력으로 이동합니다. 기본적으로 화면, 즉 STDOUT이지만 리디렉션 연산자> −를 사용하여 모든 파일로 리디렉션 할 수 있습니다.
#!/usr/bin/perl
system( "ls -l")
1;
위의 코드가 실행되면 현재 디렉토리에서 사용 가능한 모든 파일과 디렉토리를 나열합니다.
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm
drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
명령에 다음과 같은 쉘 환경 변수가 포함되어있을 때주의하십시오. $PATH or $집. 다음 세 가지 시나리오를 시도하십시오-
#!/usr/bin/perl
$PATH = "I am Perl Variable"; system('echo $PATH'); # Treats $PATH as shell variable system("echo $PATH"); # Treats $PATH as Perl variable system("echo \$PATH"); # Escaping $ works.
1;
위의 코드를 실행하면 $ PATH 쉘 변수에 설정 한 내용에 따라 다음과 같은 결과가 나옵니다.
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
I am Perl Variable
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
fork () 함수
Perl은 fork()같은 이름의 Unix 시스템 호출에 해당하는 함수. fork () 시스템 호출이 가능한 대부분의 유닉스 계열 플랫폼에서 Perl의 fork ()는 단순히 호출합니다. fork () 시스템 호출을 사용할 수없는 Windows와 같은 일부 플랫폼에서 Perl은 인터프리터 수준에서 fork ()를 에뮬레이트하도록 빌드 될 수 있습니다.
fork () 함수는 현재 프로세스를 복제하는 데 사용됩니다. 이 호출은 동일한 지점에서 동일한 프로그램을 실행하는 새 프로세스를 만듭니다. 자식 pid를 부모 프로세스로, 0을 자식 프로세스로, 또는 포크가 실패하면 undef를 반환합니다.
당신이 사용할 수있는 exec() 요청 된 실행 파일을 시작하는 프로세스 내의 함수는 별도의 프로세스 영역에서 실행되며 exec ()는 해당 프로세스와 동일한 종료 상태로 종료하기 전에 완료 될 때까지 기다립니다.
#!/usr/bin/perl
if(!defined($pid = fork())) { # fork returned undef, so unsuccessful die "Cannot fork a child: $!";
} elsif ($pid == 0) { print "Printed by child process\n"; exec("date") || die "can't exec date: $!";
} else {
# fork returned 0 nor undef
# so this branch is parent
print "Printed by parent process\n";
$ret = waitpid($pid, 0);
print "Completed process id: $ret\n";
}
1;
위의 코드가 실행되면 다음 결과가 생성됩니다.
Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777
그만큼 wait() 과 waitpid()fork ()에 의해 반환 된 의사 프로세스 ID로 전달 될 수 있습니다. 이러한 호출은 의사 프로세스가 종료 될 때까지 적절히 대기하고 상태를 반환합니다. 자녀를 기다리지 않고 포크하면waitpid()기능, 당신은 좀비를 축적합니다. Unix 시스템에서는 다음과 같이 $ SIG {CHLD}를 "IGNORE"로 설정하여이를 방지 할 수 있습니다.
#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE"; if(!defined($pid = fork())) {
# fork returned undef, so unsuccessful
die "Cannot fork a child: $!"; } elsif ($pid == 0) {
print "Printed by child process\n";
exec("date") || die "can't exec date: $!"; } else { # fork returned 0 nor undef # so this branch is parent print "Printed by parent process\n"; $ret = waitpid($pid, 0); print "Completed process id: $ret\n";
}
1;
위의 코드가 실행되면 다음 결과가 생성됩니다.
Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1
kill () 함수
Perl kill('KILL', (Process List)) 함수는 fork ()에서 반환 된 ID를 전달하여 의사 프로세스를 종료하는 데 사용할 수 있습니다.
의사 프로세스 ()에서 kill ( 'KILL', (Process List))를 사용하면 의사 프로세스를 구현하는 스레드가 리소스를 정리할 기회를 얻지 못하기 때문에 일반적으로 메모리 누수가 발생할 수 있습니다.
당신이 사용할 수있는 kill() 예를 들어 다음은 프로세스 ID 104 및 102에 SIGINT를 전송합니다.
#!/usr/bin/perl
kill('INT', 104, 102);
1;
Perl 모듈 및 스크립트에 Pod (Plain Old Text) 문서를 임베드 할 수 있습니다. 다음은 Perl 코드에 포함 된 문서를 사용하는 규칙입니다.
빈 줄 a =로 문서를 시작하십시오.head1 명령을 시작하고 =로 끝내십시오.cut
Perl은 코드에 입력 한 Pod 텍스트를 무시합니다. 다음은 Perl 코드에 포함 된 문서를 사용하는 간단한 예입니다.
#!/usr/bin/perl
print "Hello, World\n";
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
=cut
print "Hello, Universe\n";
위의 코드가 실행되면 다음 결과가 생성됩니다.
Hello, World
Hello, Universe
파일 끝에 Pod를 배치하고 __END__ 또는 __DATA__ 절단 표시를 사용하는 경우 다음과 같이 첫 번째 Pod 명령 앞에 빈 줄을 두어야합니다. 그렇지 않으면 앞에 빈 줄이 없어야합니다. =head1, 많은 번역가가 =head1 포드 블록을 시작합니다.
#!/usr/bin/perl
print "Hello, World\n";
while(<DATA>) {
print $_;
}
__END__
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
위의 코드가 실행되면 다음 결과가 생성됩니다.
Hello, World
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
DATA 부분을 읽지 않고 동일한 코드에 대한 예제를 하나 더 살펴 보겠습니다.
#!/usr/bin/perl
print "Hello, World\n";
__END__
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
위의 코드가 실행되면 다음 결과가 생성됩니다.
Hello, World
POD는 무엇입니까?
Pod는 Perl, Perl 프로그램 및 Perl 모듈에 대한 문서를 작성하는 데 사용되는 사용이 간편한 마크 업 언어입니다. Pod를 일반 텍스트, HTML, 매뉴얼 페이지 등과 같은 다양한 형식으로 변환하는 데 사용할 수있는 다양한 변환기가 있습니다. 포드 마크 업은 세 가지 기본 유형의 단락으로 구성됩니다.
Ordinary Paragraph − 굵게, 기울임 꼴, 코드 스타일, 하이퍼 링크 등 일반 단락에 서식 코드를 사용할 수 있습니다.
Verbatim Paragraph − 축 어적 단락은 일반적으로 특별한 구문 분석이나 서식이 필요하지 않고 줄 바꿈해서는 안되는 코드 블록 또는 기타 텍스트를 표시하는 데 사용됩니다.
Command Paragraph− 명령 단락은 일반적으로 제목이나 목록의 일부로 전체 텍스트 청크를 특별하게 처리하는 데 사용됩니다. 모든 명령 단락은 =로 시작하고 그 뒤에 식별자가 있고 그 뒤에 명령이 원하는대로 사용할 수있는 임의의 텍스트가옵니다. 현재 인식 된 명령은-
=pod
=head1 Heading Text
=head2 Heading Text
=head3 Heading Text
=head4 Heading Text
=over indentlevel
=item stuff
=back
=begin format
=end format
=for format text...
=encoding type
=cut
POD 예
다음 POD를 고려하십시오-
=head1 SYNOPSIS
Copyright 2005 [TUTORIALSOPOINT].
=cut
당신이 사용할 수있는 pod2html 위의 POD를 HTML로 변환하기 위해 Linux에서 사용할 수있는 유틸리티이므로 다음과 같은 결과가 생성됩니다.
다음으로, 다음 예를 고려하십시오.
=head2 An Example List
=over 4
=item * This is a bulleted list.
=item * Here's another item.
=back
=begin html
<p>
Here's some embedded HTML. In this block I can
include images, apply <span style="color: green">
styles</span>, or do anything else I can do with
HTML. pod parsers that aren't outputting HTML will
completely ignore it.
</p>
=end html
pod2html을 사용하여 위의 POD를 HTML로 변환하면 다음과 같은 결과가 생성됩니다.
An Example List
This is a bulleted list.
Here's another item.
Here's some embedded HTML. In this block I can include images, apply
styles, or do anything else I can do with HTML. pod parsers that aren't
outputting HTML will completely ignore it.
다음은 표준 Perl에서 지원하는 모든 중요한 기능의 목록입니다.
abs- 절대 값 함수
수락 -들어오는 소켓 연결 수락
알람 -SIGALRM 예약
atan2 --PI ~ PI 범위의 Y / X 아크 탄젠트
bind- 주소를 소켓에 바인딩
binmode -I / O 용 바이너리 파일 준비
축복 -개체 만들기
caller- 현재 서브 루틴 호출의 컨텍스트 가져 오기
chdir- 현재 작업 디렉토리 변경
chmod- 파일 목록에 대한 권한 변경
chomp- 문자열에서 후행 레코드 구분 기호 제거
chop- 문자열에서 마지막 문자 제거
대한 Chown는 - 파일 목록에 owership 변경
chr- 이 숫자가 나타내는 문자 가져 오기
chroot- 경로 조회를위한 디렉토리 새 루트 만들기
close- 닫기 파일 (또는 파이프 또는 소켓) 핸들
closedir- 디렉토리 핸들 닫기
연결 -원격 소켓에 연결
계속 -잠시 또는 foreach의 선택적 후행 블록
cos- 코사인 함수
crypt- 단방향 암호 스타일 암호화
dbmclose- 묶인 dbm 파일에 대한 바인딩 중단
dbmopen- 묶인 dbm 파일에 바인딩 생성
정의 됨 -값, 변수 또는 함수가 정의되었는지 여부 테스트
삭제 - 해시에서 값을 삭제합니다
죽다 -예외를 제기하거나 구제하다
do -BLOCK을 TERM으로 전환
dump- 즉각적인 코어 덤프 생성
각 - 해시에서 다음 키 / 값 쌍을 검색
endgrent- 그룹 파일을 사용하여 수행
endhostent- 호스트 파일을 사용하여 수행
endnetent- 네트워크 파일을 사용하여 수행
endprotoent- 프로토콜 파일을 사용하여 수행
endpwent -passwd 파일을 사용하여 수행
endservent- 서비스 파일을 사용하여 수행
eof- 파일 핸들의 끝을 테스트
eval- 예외 포착 또는 코드 컴파일 및 실행
exec- 이 프로그램을 버리고 다른 프로그램을 실행
존재 -해시 키가 있는지 테스트
종료 -이 프로그램을 종료합니다.
exp- 인상 I
힘으로 fcntl- 파일 제어 시스템 호출
fileno- 파일 핸들에서 파일 설명자 반환
flock- 권고 잠금으로 전체 파일 잠금
fork- 이와 같은 새 프로세스를 만듭니다.
형식 -write () 함수에서 사용하여 그림 형식을 선언합니다.
formline- 형식에 사용되는 내부 함수
getc- 파일 핸들에서 다음 문자 가져 오기
getgrent- 다음 그룹 기록 가져 오기
getgrgid- 그룹 사용자 ID로 그룹 레코드 가져 오기
getgrnam- 그룹 이름으로 그룹 레코드 가져 오기
gethostbyaddr- 주소로 호스트 레코드 가져 오기
gethostbyname- 주어진 이름으로 호스트 레코드 가져 오기
gethostent- 다음 호스트 레코드 가져 오기
getlogin- 이 tty에 로그인 한 사람을 반환
getnetbyaddr- 주소가 주어진 네트워크 레코드 가져 오기
getnetbyname- 주어진 이름으로 네트워크 레코드 가져 오기
getnetent- 다음 네트워크 기록 가져 오기
getpeername- 소켓 연결의 다른 쪽 끝 찾기
getpgrp- 프로세스 그룹 가져 오기
getppid- 부모 프로세스 ID 얻기
getpriority- 현재 좋은 값 얻기
getprotobyname- 주어진 이름의 프로토콜 레코드 가져 오기
getprotobynumber- 프로토콜 레코드 숫자 프로토콜 가져 오기
getprotoent- 다음 프로토콜 레코드 가져 오기
getpwent- 다음 passwd 레코드 가져 오기
getpwnam- 사용자 로그인 이름으로 passwd 레코드 가져 오기
getpwuid- 사용자 ID로 passwd 레코드 가져 오기
getservbyname- 이름으로 서비스 레코드 가져 오기
getservbyport- 주어진 숫자 포트에서 서비스 레코드 가져 오기
getservent- 다음 서비스 기록 받기
getsockname- 주어진 소켓에 대한 sockaddr 검색
getsockopt- 주어진 소켓에서 소켓 옵션 얻기
glob- 와일드 카드를 사용하여 파일 이름 확장
gmtime- 그리니치 시간 형식을 사용하여 UNIX 시간을 레코드 또는 문자열로 변환합니다.
goto- 스파게티 코드 생성
grep- 목록 테스트에서 요소 찾기 주어진 기준에 대해 참
hex- 문자열을 16 진수로 변환
import- 모듈의 네임 스페이스를 자신의 것으로 패치
인덱스 - 문자열 내에서 문자열을 찾을 수
int- 숫자의 정수 부분을 얻습니다.
ioctl- 시스템 종속 장치 제어 시스템 호출
join- 구분 기호를 사용하여 목록을 문자열로 결합
키 -해시에서 인덱스 목록 검색
kill- 프로세스 또는 프로세스 그룹에 신호를 보냅니다.
마지막으로 - 조기 블록을 종료
lc- 문자열의 소문자 버전 반환
lcfirst- 소문자로 된 다음 문자 만있는 문자열을 반환합니다.
길이 -문자열의 바이트 수를 반환
링크 -파일 시스템에 하드 링크 생성
청취 -소켓을 서버로 등록
지역 - 전역 변수에 대한 임시 값 (동적 범위 지정)을 생성
localtime- 현지 시간을 사용하여 UNIX 시간을 레코드 또는 문자열로 변환
lock- 변수, 서브 루틴 또는 메소드에 대한 스레드 잠금을 얻습니다.
로그인 - 숫자의 자연 로그를 검색
lstat- 심볼릭 링크를 stat
m- 정규식 패턴이있는 문자열 일치
맵 -변경 사항을 목록에 적용하여 변경 사항이있는 새 목록을 가져옵니다.
mkdir- 디렉토리 생성
msgctl -SysV IPC 메시지 제어 작업
msgget -SysV IPC 메시지 큐 가져 오기
msgrcv- 메시지 큐에서 SysV IPC 메시지 수신
msgsnd -SysV IPC 메시지를 메시지 대기열로 보냅니다.
내 - 선언 및 지역 변수 (어휘 범위 지정)을 할당
다음 -조기에 블록 반복
no-컴파일 타임에 일부 모듈 심볼 또는 의미를 가져 오지 않음
oct- 문자열을 8 진수로 변환
열기 -파일, 파이프 또는 설명자를 엽니 다.
opendir- 디렉토리 열기
ord- 문자의 숫자 표현 찾기
우리 -패키지 변수 (어휘 범위 지정) 선언 및 할당
pack- 목록을 이진 표현으로 변환
패키지 -별도의 전역 네임 스페이스 선언
파이프 -연결된 파일 핸들 쌍 열기
pop- 배열에서 마지막 요소를 제거하고 반환
pos- 마지막 / 다음 m // g 검색을위한 오프셋 찾기 또는 설정
인쇄 - 출력 a를 목록을 파일 핸들에
printf- 형식화 된 목록을 파일 핸들로 출력
prototype- 서브 루틴의 프로토 타입 (있는 경우) 가져 오기
푸시 - 배열에 추가 된 하나 이상의 요소
q- 단일 인용 문자열
qq- 문자열을 이중으로 인용
qr- 컴파일 패턴
quotemeta- 정규식 매직 문자 인용
qw- 단어 목록 인용
qx- 역 따옴표로 문자열 인용
rand- 다음 의사 난수 검색
읽기 -파일 핸들의 고정 길이 버퍼 입력
readdir- 디렉토리 핸들에서 디렉토리 가져 오기
readline- 파일에서 레코드 가져 오기
readlink- 심볼릭 링크가 가리키는 위치 결정
readpipe- 시스템 명령을 실행하고 표준 출력을 수집합니다.
recv- 소켓을 통해 메시지 수신
다시 실행 -이 루프 반복을 다시 시작합니다.
ref- 참조되는 사물의 유형 찾기
이름 바꾸기 -파일 이름 변경
필요 -런타임에 라이브러리에서 외부 함수로드
재설정 -주어진 이름의 모든 변수 지우기
return- 일찍 함수에서 나옴
reverse- 문자열 또는 목록 뒤집기
rewinddir- 디렉토리 핸들 재설정
rindex- 오른쪽에서 왼쪽 부분 문자열 검색
rmdir- 디렉토리 제거
s- 패턴을 문자열로 대체
스칼라 -스칼라 컨텍스트 강제 적용
seek- 임의 액세스 I / O를위한 파일 포인터 재배치
seekdir- 디렉토리 포인터 재배치
선택 -기본 출력 재설정 또는 I / O 멀티플렉싱 수행
semctl -SysV 세마포어 제어 작업
semget -SysV 세마포어 세트 가져 오기
semop -SysV 세마포어 작업
send- 소켓을 통해 메시지를 보냅니다.
setgrent- 사용할 그룹 파일 준비
sethostent- 사용할 호스트 파일 준비
setnetent- 사용할 네트워크 파일 준비
setpgrp- 프로세스의 프로세스 그룹 설정
setpriority- 프로세스의 좋은 값 설정
setprotoent- 사용할 프로토콜 파일 준비
setpwent- 사용할 passwd 파일 준비
setservent- 사용할 서비스 파일 준비
setsockopt- 일부 소켓 옵션 설정
shift- 배열의 첫 번째 요소를 제거하고 반환
shmctl -SysV 공유 메모리 작업
shmget -SysV 공유 메모리 세그먼트 식별자 가져 오기
shmread -SysV 공유 메모리 읽기
shmwrite -SysV 공유 메모리 쓰기
종료 -소켓 연결의 절반 만 닫습니다.
sin- 숫자의 사인을 반환
sleep- 몇 초 동안 차단
socket-소켓 생성
socketpair- 소켓 쌍 생성
sort- 값 목록 정렬
스플 라이스 -배열의 모든 위치에 요소 추가 또는 제거
분할 - regexp와 구분 기호를 사용하여 문자열을 분할
sprintf- 문자열로 형식화 된 인쇄
sqrt- 제곱근 함수
srand- 난수 생성기 시드
stat- 파일의 상태 정보 얻기
연구 -반복 검색을위한 입력 데이터 최적화
sub- 익명으로 가능한 서브 루틴 선언
SUBSTR - 얻거나 stirng의 일부를 변경
symlink- 파일에 대한 심볼릭 링크 만들기
syscall- 임의의 시스템 호출 실행
sysopen- 파일, 파이프 또는 설명자 열기
sysread- 파일 핸들의 고정 길이 버퍼링되지 않은 입력
sysseek -sysread 및 syswrite와 함께 사용되는 핸들의 I / O 포인터 위치 지정
시스템 -별도의 프로그램 실행
syswrite- 파일 핸들에 대한 고정 길이 버퍼링되지 않은 출력
알 - 파일 핸들에 현재 seekpointer를 얻을 수
telldir- 디렉토리 핸들에서 현재 검색 포인터 가져 오기
tie- 변수를 객체 클래스에 바인딩
tied- 묶인 변수의 기본 객체에 대한 참조를 얻습니다.
시간 -1970 년 이후 초 수 반환
시간 -자체 및 하위 프로세스에 대한 경과 시간 반환
tr- 문자열 음역
자르기 -파일 단축
uc- 문자열의 대문자 버전 반환
ucfirst- 대문자로 된 다음 문자 만있는 문자열을 반환합니다.
umask- 파일 생성 모드 마스크 설정
undef- 변수 또는 함수 정의 제거
연결 해제 -파일에 대한 하나의 링크 제거
unpack- 바이너리 구조를 일반 펄 변수로 변환
unshift- 목록의 시작 부분에 더 많은 요소를 추가합니다.
untie- 변수에 대한 타이 바인딩 끊기
사용 -컴파일 타임에 모듈에로드
utime- 파일의 마지막 액세스 및 수정 시간 설정
값 -해시의 값 목록을 반환합니다.
vec- 문자열의 특정 비트 테스트 또는 설정
기다림 -자식 프로세스가 죽을 때까지 기다립니다.
waitpid- 특정 자식 프로세스가 죽기를 기다립니다.
wantarray- 현재 서브 루틴 호출의 목록 컨텍스트 대 스칼라 대 무효 가져 오기
경고 -디버깅 정보 인쇄
쓰기 -사진 기록 인쇄
-X- 파일 테스트 (-r, -x 등)
y- 문자열 음역