앞의 예제를 좀 더 깔끔하게 모듈화 시켜본다.
#!/usr/bin/perl
use 5.18.0;
use warnings;
use IO::File;
main(@ARGV);
sub main
{
my $filename = shift || "file.txt";
my $count = countlines( $filename );
say "there are $count lines in $filename";
}
sub countlines
{
my $filename = shift;
error("missing file") unless $filename;
my $fh = IO::File->new( $filename , "r") or
error("Cannot open $filename ($!)\n");
my $count = 0;
$count++ while( $fh->getline );
$fh->close;
return $count;
}
sub error
{
my $e = shift || 'unknown error';
say "$0 : $e";
exit 0
}
기본적인 내용은 2번째 튜토리얼과 다를게 없다. 다만 이번에는 함수화를 해서 보다 구조를 간결하게 만들었다.
먼저 주 스크립트는 단 한줄로 이루어져있다. main 함수를 실행시키는 것. Main 함수는 인자(Arguments)들을 받을 수 있는데, 인자는 여러개가 될 수 도 있으므로 스칼라(Scalar $) 가 아닌 배열(Array @) 로 받는다.
Perl 에서 함수는 sub-routine 의 앞을 딴 Sub 로 정의한다. Keyword sub 으로 시작하는 block 은 함수를 의미하며, 함수의 정의는 script 안 어디서라도 가능하다.
먼저 main 함수를 보면, 가장 첫 번째 명령어가 낮설 수 있는데 shift 는 Array 의 첫 번째 값을 빼서 추출하는 명령어다. 예를들어 다음과 같이
my @array = ("one", "two", "three");
say @array
my $element = shift @array
say @array
say $element
("one", "two", "three") 로 만들어진 Array에 shift를 한번 하면 Array 에는 ("two", "three") 만 남게 되고, 다시 한번 shift를 하면 Array는 ("three") 만 남게 된다. 이를 반복하면 결국 Array는 비게 되는데, 이를 이용해서 array 자체를 활용한 loop을 돌리기도 한다.
즉 $filename 이라는 변수에 인자로 받은 파일이름을 넘겨주는데, 그 뒤에 ' || ' operator 가 있다. 이는 논리연산자 or 로 두 condition(A, B) 가 모두 거짓일 때에만 거짓을 반환하고 그 외에는 모두 참을 반환한다. 이런 경우 컴퓨터는 효율성을 위해서 첫번째 조건 A가 참이면 두번째 B 조건은 (참/거짓)에 상관없이 결과는 참이기 때문에 다음 B 를 아예 실행조차 하지 않는다. 따라서 and / or 연산자는 때때로
A and B | A가 거짓이면 전체는 무조건 거짓 | A 가 참인 경우에만 B 를 실행 |
A or B | A가 참이면 전체는 무조건 참 | A 가 거짓인 경우에만 B 를 실행 |
과 같이 조건 명령문으로 사용되기도 한다.
따라서 main 함수의 첫번째 줄은 인자를 파일이름이라는 변수에 넣되, 만약 (파일이름등이 주어지지 않아) 넣을 수 없다면, 파일 이름은 "file.txt" 라는 기본값으로 한다. 라는 뜻이다. 두 분째 줄은 main 이라는 함수에서 다시 countlines 라는 함수를 호출하는 내용이다. 호출 결과(함수의 return 값)은 count 라는 변수에 저장된다.
countlines 라는 함수는 다시 error 를 채크하는 함수를 호출하는데, 여기서 unless 라는 조건문이 나온다. (unless 는 if 와 정확히 반대로 움직이는 데, if 문에 조건을 부정하는 것보다 사람이 읽기에 쉬워서 사용된다. 조건문에 관해서는 다른 튜토리얼에서 다루도록 하겠다.)
각 함수는 지난번 파일과 같이 작동하는데, while loop을 block 으로 사용하는 대신 명령문-조건문을 사용했다. 이는 길지 않은 코드에서 보다 사람이 읽기 편하게 하는 효과가 있어 종종 사용되는 테크닉이다.
'Perl-공부하기' 카테고리의 다른 글
정규표현식 (0) | 2022.03.03 |
---|---|
[perl] xargs 를 활용한 파일 이름 변경 예제 (0) | 2021.08.09 |
Perl tutorial - 3. Count lines 2 (0) | 2020.12.31 |
Perl Tutorial - 2. Count Lines (0) | 2020.12.28 |
Perl Tutorial 01 - Hello world (0) | 2020.12.20 |