[첫화면으로]Perl/디버깅

마지막으로 [b]

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;를 항상 사용하자

이런 프라그마들은 렉시컬 변수와 동일하게 스코프 적용이 된다.1

#!/usr/bin/perl
# warntest4.plx
use warnings;

{
   no warnings;
   my @a = qw(one , two , three , four);     # 경고 없음
}
my @b = qw(one , two , three , four);

2. use strict

2.1. vars

변수를 사용하려면

2.2. refs

    $bar = \&{'foo'};
    &$bar;

2.3. subs

서브루틴 이름 뒤에 괄호를 써야 함

3. Syntax Error Checklist

신택스 에러가 나는 빈번한 경우3

4. use diagnostics

에러/경고 메시지에 보충 설명을 출력한다4

또는 별도로 제공되는 splain 프로그램을 쓸 수도 있다.
perl myprogram.pl 2>&1 | splain
perl myprogram.pl 2> error.txt ; splain error.txt

5. 명령행 스위치

> perl -e 'print "Hello world\n";'
-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
아래는 동작하지 않는다. perl이 불리기 전에 쉘이 newyear.txt를 지워버림
perl -pe 's/1999/2000/g' newyear.txt > newyear.txt
아래처럼 하면 된다
perl -pi -e 's/1999/2000/g' newyear.txt
> perl -Mstrict -e ...
#!/usr/bin/perl -s
# nl3.plx
use warnings;
use strict;

my $lineno;
my $current = "";
our ($v,$h);   # strict 프라그마가 있으니 선언이 필요

if (defined $v) {     # "-v" 스위치가 있으면 참
   print "$0 - line numberer, version 3\n";
   exit;
}
...
> ./nl3.plx -v
perl -an '...'는 다음과 동치
LINE: while (defined ($_ = <ARGV>)) {
    @F = split;
    '...';
}
텍스트 파일의 각 줄의 첫 단어만 출력
> perl -ane 'print $F[0],"\n"' chapter09.txt
perl -F: -ane 'print $F[5],"\n"' /etc/passwd
"\n"을 명시할 필요가 없어진다 -_-;
> perl -le 'print "hello"'
$tainted =~ /([\w.]+)/;
$untainted = $1;

6. die와 warn의 동작 변경

%SIG 해쉬 변수에 "__WARN__", "__DIE__" 키를 사용하여 die나 warn을 수행할 때의 동작을 지정할 수 있다.6
$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!";          # 결과적으로 croak이 불리게 된다.

참고: [Perl에서 경고메시지를 가로채어 저장하기]

7. Carp 모듈

Perldoc:Carp

8. 실행 흐름 추적

서브루틴마다 안에 메시지 출력을 시킬 수도 있지만 그건 너무 큰 작업이고... 소스 수정을 최소한으로 하거나 아예 하지 않으면서도 실행되는 라인을 추적하려면:

그런데 윈도우에서 스트로베리 펄5.12를 가지고 테스트할 때와 리눅스에서 펄5.8로 할 때와 좀 다른게, 리눅스에서는 두 방법 다 동일하게 출력이 되는데, 윈도우에서는 2)처럼 하면 각 실행라인의 코드가 보이지 않는다. 라인 넘버까지만 나오는데, 그나마 라인넘버도 실제보다 1증가된 값으로 나온다.

그러면 뭐가 문제냐 하면, 코드를 전혀 건드리지 않고 트레이스하고 싶으면 1)을 하면 되지만, 가끔은 코드를 실행하는 방법이 고정되어 있고(다른 프로그램에서 호출하거나 하는 식으로) 코드 자체를 수정해서 트레이스시키고 싶을 때도 있을텐데 윈도우에서는 그게 안 된다는 얘기. 뭐 그럴 일이 얼마나 흔하겠냐만.

그 외에 소스에 메시지출력을 시키는 걸로는, 구글링에 잡힌 것들:

9. 기타

10. Comments

이름:  
Homepage:
내용:
 


컴퓨터분류
각주:
1. 3. 4. Beginning Perl, Chapter09
2. Perldoc:strict
5. /Getopt-Long
6. Mastering perl, Chapter 04

마지막 편집일: 2013-7-18 2:00 am (변경사항 [d])
3785 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기