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

Perl Tutorial - 2. Count Lines

by Thdnice 2020. 12. 28.
반응형

 

#!/usr/bin/perl

use 5.18.0;
use warnings;

my $filename = "linesfile.txt";  

open(FH, $filename);    # open the file
my @lines = <FH>;       # read the file
close(FH);              # close the file

my $count = scalar @lines;  # the number of lines in the file
say "There are $count lines in $filename";

 

지난번에 이어, 이번에는 파일 입출력과 관련된 튜토리얼이다. 먼저 Perl의 변수형은 int, float, string 등으로 데이터 타입에 따라 정의되는 다른 언어들과 달리 데이터의 형식 (단수, 복수 등)에 따라 scalar, array, hash 로 나뉘어진다. 

 1. Scalar 는 1개의 값을 가지는 변수며, 앞에 '$' 를 사용해서 표시한다.

2.  Array는 2개 이상의 값을 가지는 변수이며, 앞에 '@'(At) 을 사용해서 표시한다.

3. Hash는 Key-Value Pair를 가지는 변수이며, Key를 index로 사용하고 기호는 %를 사용한다. Key/Value에 따른 순서는 존재하지 않는다.  (키와 value 2가지 종류이므로 %기호의 앞뒤로 값이 2개씩 들어감을 상상하면 외우기 쉽다.)

 my 는 Scope 을 정의해주기 사용하는 Keyword 이며, 통상적으로 처음 변수를 선언할 때,  my 를 붙이지 않으면 

Global symbol "$filename" requires explicit package name at ..

과 같은 에러를 보게 된다. 선언시에 자주 빼먹게 되므로 꼭 기억해둬야 한다. 

 

file을 열고 닫기 위해서는 File Handler 를 설정해줘야한다. 통상 파일을 열고 닫을 때에는 open / close 명령어를 쓰며, 처음 파일을 읽기 위해서 파일이름이 저장된 변수($filename)를 읽고 파일 핸들러를 셋팅한다. 셋팅된 파일 핸들러는 FH 이며, 통상 파일을 open 할 때에 리다이렉션 기호 ( >, >>, < 등) 을 사용해서 읽기/쓰기 모드를 명시할 수 있으며, 일반적으로 리다이렉션 기호가 생략되어 있으면 읽기모드(<) 로 읽으며 자세한 사용법은 아래와 같다.

open( fileHandle, "<hello.pl" );  # hello.pl을 읽기 모드로 엽니다.
open( fileHandle, "hello.pl" );   # hello.pl을 읽기 모드로 엽니다.
open( fileHandle, ">hello.pl" );  # hello.pl을 쓰기 모드로 엽니다.
open( fileHandle, ">>hello.pl" ); # hello.pl를 추가모드로 엽니다.    
open( fileHandle, "+<hello.pl" ); # 읽기와 쓰기 모드로 엽니다.

 

그 다음 명령어인 lines 는 앞에 at (@) 기호가 붙어있으므로 여러값들이 들어갈 수 있는 Array이고, 파일핸들로부터 입력을 받는다.  ( <FH> ) 이 부분에 대해서는 보다 자세한 설명이 필요한데,

Perl 에서 < > 는 하나의 연산자로 1개 줄을 입력받는 다는 뜻이다. 다만 이 입력받는 소스가 키보드(표준입력)일 수도 있고, 또는 파일핸들러일수도 있다. 따라서 키보드로부터 입력을 받을 때에는  < STDIN >   이 되는것이며, 파일로부터 입력받을 때에는  < FileHandler > 가 되는 것이다.

 

파일을 모두 읽었으면, 더 이상 파일을 사용할 필요가 없으므로 Close를 해줘야 한다. 짧은 코드이기에 파일을 명시적으로 닫아주지 않아도, 프로그램이 종료되면 파일은 닫히겠지만, runtime 이 길어서 프로그램 실행 중 여러번 파일을 열고 닫는 기능이 필요하다면, 꼭 필요치 않은 파일은 close 해주는 습관이 중요하다.

마지막으로 파일의 길이를 읽기 위해서 $count = scalar @lines 라는 명령을 실행했다. 일반적으로 Array 에는 여러 값들이 들어있고, 이를 1개의 Scalar 에 할당하면 여러 값을 대표할 수 있는 Array의 갯수 (이 프로그램의 경우에는 text 파일의 line 수) 가 들어간다. (Scalar에 Array를 배정하면 Array의 첫번째 값이 배정될거라 생각하기 쉬운데, 사실 생각해보면 Array의 갯수야 말로 Array를 대표한다고 생각할 수 있으므로 더 그럴 듯 하다.) @lines 앞의 scalar 는 형이 다른 데이터 변환을(array를 scalar에 할당함) 명시적으로 나타낸 것일 뿐, 생략하여도 무방하다.

 

  

 

 

반응형