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

Perl tutorial - 3. Count lines 2

by Thdnice 2020. 12. 31.
반응형

 

 전의 튜토리얼을 통해서 파일을 읽고, 행의 갯수를 새 보았는데 겨우 행의 갯수를 세기 위해서 모든 text 파일을 읽어서 저장하는 것은 사실 비효율적인 일이다. 즉 파일의 contents 는 필요없고 단순히 몇 line 으로 이루어져 있는 지를 확인하는 보다 직관적인 튜토리얼은 다음과 같다.

 


 

#!/usr/bin/perl

use 5.18.0;
use warnings;
use IO::File; ##library for io control

my $filename = "file.txt"; #declear var
my $fh = IO::File->new($filename, "r");
if( ! $fh ){
	print("Cannot open $filename ($!)\n");
	exit
}
my $count = 0;
while ( $fh->getline ) {
	$count++;
}
$fh->close;

print("There are $count lines in $filename\n");

 

 

use 를 사용한 프래그마에 IO::File 이라는 새로운 내용이 포함되었다. 이는 IO 라는 모듈의 File 을 사용한다는 것으로 이는 io 에 관한 라이브러리라고 이해하면 된다.

 

filename 이라는 변수에 파일 이름을 저장하였다. 대부분의 경우 입력값을 직접 사용하는 것보다 변수에 할당하여 사용하는 것이 유리하며, 본 코드에서도 파일이름을 출력단에서 재사용하였다.  

IO:File 라이브러리는 파일을 열고 닫는데, 사실 new 생성자(Constructor)로 생성하면 open 으로 전달되므로 사실 전의 open 으로 파일을 읽는것과 크게 다르지 않다. 다만 파일 핸들러 자체가 하나의 변수에 할당이 되었으므로, 이를 통해서 if 등을 통해 Error 체크가 가능하다.

if 문은 다른 언어의 if문과 다를게 없다. 물론 Postfix 문법(명령어가 앞에 나오고 조건문이 뒤에나오는) 등을 응용할 수 있으나 자세한 내용은 나중에 따로 다루도록 하겠다.  위 튜토리얼에서는 getline 을 실행하고 에러가 발생하지 않으면 (실행 후 Status가 true라면) count 를 1씩 증가한다. (초기 0으로 init 되어 있으므로 getline 이 에러없이 불린 횟수가 곧 파일의 줄 숫자와 같다.)

마지막으로 파일을 모두 사용했으면 핸들러를 닫아준다. ($fh -> close;) 

위 튜토리얼은 과거 튜토리얼에 비해서 메모리 사용과 속도가 빠르다.  파일을 모두 읽어서 저장하지 않기 때문이다.

 

 

반응형