본문 바로가기
Perl-공부하기

Perl Tutorial - 4. Count Lines 3

by Thdnice 2020. 12. 31.
반응형

 

앞의 예제를 좀 더 깔끔하게 모듈화 시켜본다.

 

#!/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