Perl에서 "$line = <FIN>"을 사용하여 파일을 읽어올 때의 단위는 하나의 line이다.

그런데 하나의 라인에 여러 개의 input이 있을 경우, 문제가 생기게 된다.


이런 경우에 쓸 수 있는 방법이 아래와 같은 방법이다.


while ($line = <FIN>) {

@inary = split(/\S+/, $line);

push (@inputs, @inary);

}


먼저, 여기서 각각의 variable에 대한 설명을 보자면,

$line  : Input으로 읽어온 하나의 line

@inary: Input 한 line을 split function으로 분리된 결과물의 list

@input: while문을 한번 돌면서 얻은 분리된 결과물을 push function을 써서 계속해서 축적하는 variable. 

           즉, 주어진 파일의 모든 line을 돌면서 얻은 input을 모두 저장하는 variable이다.


먼저 첫번째 줄은 input으로 주어진 파일의 모든 line을 돌라는 while 문이다.


두번째 줄에서는 split을 통해서 입력으로 받은 하나의 line을 분리하는데

split function에 대해서 알아보면 다음과 같다.

LIST = split(/PATTERN/, EXPR, LIMIT);


여기서 LIST는 결과물을 저장할 리스트로 @로 시작하는 variable이어야 한다.

/PATTERN/은 EXPR으로 받은 string을 분리할 기준을 regular expression으로 표현한 것이다.

EXPR은 분리할 string을 가리키며, LIMIT은 분리할 maximum number로 생략이 가능하다.


위의 예제에서는 입력으로 받은 한 라인($line)을 

"\S+"를 사용해서 space(\S)가 하나 이상(+)일 경우 분리하여 (maximum number는 없고)

@inary라는 list에 저장하라는 명령을 수행한다.


세번째 줄에서는 push를 통해서 한 line의 결과물을 계속 축적하게 되는데

push function에 대해서 알아보면 다음과 같다.

$TOTAL = push(@array1, @array2)


여기서 $TOTAL은 새로 얻은 list의 element의 총 개수이고 생략이 가능하다.

push 명령어는 여기서 @array1의 끝에 @array2를 이어 달아 @array1에 저장한다.


위의 예제에서는 한 line input을 받아 분리한 @inary를 while문을 돌면서 계속 @input에 축적하게 된다.



참고로 위의 예제를 끝낸 후 얻은 @inputs를 이용할 때 아래와 같은 것을 사용하면 편리하다.

$#inputs   : @input의 총 개수

$input[$i] : @input의 $i번째 element


Posted by sunshowers
,