#!/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에 할당함) 명시적으로 나타낸 것일 뿐, 생략하여도 무방하다.
'Perl-공부하기' 카테고리의 다른 글
Perl Tutorial - 4. Count Lines 3 (0) | 2020.12.31 |
---|---|
Perl tutorial - 3. Count lines 2 (0) | 2020.12.31 |
Perl Tutorial 01 - Hello world (0) | 2020.12.20 |
[perl] perl을 이용해 특정 프로세스 종료하는 alias만들기 (ssh -f옵션등) (0) | 2013.02.25 |
perl 기초(2) - 문자열 (0) | 2012.04.05 |