-
- 1. use strict;와 use warnings;를 항상 사용하자
-
- 2. use strict
-
-
- 2.1. vars
-
- 2.2. refs
-
- 2.3. subs
-
3. Syntax Error Checklist
-
- 4. use diagnostics
-
- 5. 명령행 스위치
-
- 6. die와 warn의 동작 변경
-
- 7. Carp 모듈
-
- 8. 실행 흐름 추적
-
- 9. 기타
-
- 10. Comments
-
1. use strict;와 use warnings;를 항상 사용하자
이런 프라그마들은 렉시컬 변수와 동일하게 스코프 적용이 된다.
#!/usr/bin/perl
use warnings;
{
no warnings;
my @a = qw(one , two , three , four);
}
my @b = qw(one , two , three , four);
2. use strict
변수를 사용하려면
- my $var - 렉시컬 변수로 선언하던가
- our $var - 전역 변수로 선언하던가
- use vars '$var', use vars qw($var, $foo) 등으로도 선언 가능
- $main::var - 풀 네임으로 써 주던가
- 심볼릭 레퍼런스 사용 불가
- 레퍼런스의 값이 변수나 서브루틴명이 될 수 없는 값이 들어 있을 경우 문제의 소지가 있음
- 심볼릭 레퍼런스 대신에 해쉬를 사용할 것을 권장
- 예외 - 아래의 형태는 허용됨
$bar = \&{'foo'};
&$bar;
서브루틴 이름 뒤에 괄호를 써야 함
3. Syntax Error Checklist
신택스 에러가 나는 빈번한 경우
- 세미콜론 누락
- 여는/닫는 괄호 누락
- 스트링이나 정규표현식을 제대로 끝맺지 않음
- 콤마 누락
- if, for, while, unless, until 문에서 조건문 좌우에 괄호 필요
- do if condition; 과 같은 statement modifier 형태에서는 불필요
- Bareword
- use strict;에서는 서브루틴을 부를 때 반드시 ()를 써 주자.
4. use diagnostics
에러/경고 메시지에 보충 설명을 출력한다
- 설명 텍스트는 perldiag 문서에 들어있음
또는 별도로 제공되는 splain 프로그램을 쓸 수도 있다.
perl myprogram.pl 2>&1 | splain
perl myprogram.pl 2> error.txt ; splain error.txt
5. 명령행 스위치
- -w : 경고 메시지 출력. use warnigs 를 쓸 것
- -e : 파라메터 텍스트를 실행
> perl -e 'print "Hello world\n";'
- -n, -p : <ARGV>를 읽는 것과 관련
-n 스위치는 다음 구문과 동치
while (<>) { "your code here" }
> perl -ne 'print if /^(Subject|From): /' Mailbox
> perl -ne 's/1999/2000/g; print' newyear.txt
> perl -pe 's/1999/2000/g' newyear.txt
- -c : 프로그램을 실행하지는 않고 문법 에러와 모듈 존재 체크만 해 줌
- -i : 임시 파일을 만들어서 작업
아래는 동작하지 않는다. perl이 불리기 전에 쉘이 newyear.txt를 지워버림
perl -pe 's/1999/2000/g' newyear.txt > newyear.txt
아래처럼 하면 된다
perl -pi -e 's/1999/2000/g' newyear.txt
- 책에는 -i에 인자로 백업파일의 확장자를 명시해야 한다고 했는데 (-i.old 와 같이) perl5.8에서 바뀌었는지 그냥도 된다.
- -M : 인자로 모듈이름을 주어 로드시킨다
> perl -Mstrict -e ...
- -s
- 파일명 뒤에 오는 스위치(예: -v)를 변수로 취급($v)하고, @ARGV에서 제거한다.
- 이 변수에는 값이 "1"이 들어가는 듯
#!/usr/bin/perl -s
use warnings;
use strict;
my $lineno;
my $current = "";
our ($v,$h);
if (defined $v) {
print "$0 - line numberer, version 3\n";
exit;
}
...
-
> ./nl3.plx -v
- -I : 인자로 받은 디렉토리를 @INC에 추가하여 모듈을 검색
- -a, -F
- -n, -p와 같이 쓰임
- -a : 읽은 라인을 @F 배열에 단어별로 분리해서 넣음
perl -an '...'는 다음과 동치
LINE: while (defined ($_ = <ARGV>)) {
@F = split;
'...';
}
텍스트 파일의 각 줄의 첫 단어만 출력
> perl -ane 'print $F[0],"\n"' chapter09.txt
- -F : split할 때 구분자로 사용할 캐릭터를 지정
perl -F: -ane 'print $F[5],"\n"' /etc/passwd
- -l
- output record separator "$\" 변수를 input record separator"$/"변수와 같은 값을 갖도록 설정
- "$\"의 값은 print 출력의 뒤에 추가됨
"\n"을 명시할 필요가 없어진다 -_-;
> perl -le 'print "hello"'
- -T : taint mode
- 외부에서 들어온 데이타를, open등 "unsafe"한 연산에는 사용하지 못하게 한다.
- tainted한 데이타로부터 파생된 데이타도 tainted한 걸로 간주됨
- untaint데이타를 얻고 싶다면 아래와 같이 정규표현식의 백레퍼런스 사용
$tainted =~ /([\w.]+)/;
$untainted = $1;
6. die와 warn의 동작 변경
%SIG 해쉬 변수에 "__WARN__", "__DIE__" 키를 사용하여 die나 warn을 수행할 때의 동작을 지정할 수 있다.
$SIG{__DIE__} = \&my_die_handler;
$SIG{__DIE__} = sub { print "I'm about to die!" }
기존 코드를 수정하지 않고 die 대신에 croak이 불리게 하는 예
use Carp;
$SIG{__DIE__} = sub { &Carp::croak }
die "I'm going now!";
참고: [Perl에서 경고메시지를 가로채어 저장하기]
7. Carp 모듈
Carp
- carp : warn, 호출한 지점의 정보를 제공
- croak : die, 호출한 지점의 정보를 제공
- cluck : warn, 스택 백트레이스
- confess : die, 스택 백트레이스
8. 실행 흐름 추적
서브루틴마다 안에 메시지 출력을 시킬 수도 있지만 그건 너무 큰 작업이고... 소스 수정을 최소한으로 하거나 아예 하지 않으면서도 실행되는 라인을 추적하려면:
그런데 윈도우에서 스트로베리 펄5.12를 가지고 테스트할 때와 리눅스에서 펄5.8로 할 때와 좀 다른게,
- 1) 코드를 그대로 놔두고
perl -d:Trace 스크립트
실행하는 것
- 2) 코드의 shebang 라인을
#!/usr/bin/perl -d:Trace
와 같이 해 두고, 실행은 그냥 perl 스크립트
로 하는 것
리눅스에서는 두 방법 다 동일하게 출력이 되는데, 윈도우에서는 2)처럼 하면 각 실행라인의 코드가 보이지 않는다. 라인 넘버까지만 나오는데, 그나마 라인넘버도 실제보다 1증가된 값으로 나온다.
그러면 뭐가 문제냐 하면, 코드를 전혀 건드리지 않고 트레이스하고 싶으면 1)을 하면 되지만, 가끔은 코드를 실행하는 방법이 고정되어 있고(다른 프로그램에서 호출하거나 하는 식으로) 코드 자체를 수정해서 트레이스시키고 싶을 때도 있을텐데 윈도우에서는 그게 안 된다는 얘기. 뭐 그럴 일이 얼마나 흔하겠냐만.
그 외에 소스에 메시지출력을 시키는 걸로는, 구글링에 잡힌 것들:
10. Comments
컴퓨터분류