명령행 인수-@ARGV

파일 다루기와 디렉토리 다루기에서 한가지 불만이 있었을 줄로 압니다. 왜 파일 이름과 디렉토리 이름을 미리 정해놓고서 유용성을 축소 시키느냐고요... 조금 더 우아하게, type myfile.htm할 수 있을 텐데 말입니다.

물론이지요. 좋은 질문입니다. 역시 민주 컴퓨터쟁이는 다르군요.

명령행에 붙여지는 인자는 @ARGV라는 배열에 담겨져서 프로그램으로 넘겨집니다. 당연히 인자의 마지막 참조번호는 $#ARGV가 되겠지요. 인자가 하나도 없을 때에 $#ARGV의 값을 출력 시켜보면 -1을 프린트합니다. 의심나면 직접 해 보세요.

print "$#ARGV\n";
이 한줄이면 됩니다. 그리고 perl test.pl, perl test.pl hey, 등을 해 보세요.

파일 다루기에서 만들었던 프로그램을 다시 짜봅시다.

# mytype2.pl
# 도스의 type, 유닉스의 cat 명령을 흉내내어 봅시다.

if( $#ARGV < 0 )
  { die "Supply a file name, please.\n"; }
if( $#ARGV > 0 )
  { die "Too many parameter.\n"; }

$fileName = shift( @ARGV );

if( -d $fileName )
  { die "$fileName is a directory.\n"; }
  # 디렉토리를 type할 수는 없죠.
  # die 함수는 메세지를 출력하고 프로그램 실행을 중단시킵니다.

-e $fileName || die "$fileName is not exist.\n";

-T $fileName || die "$fileName is not a text file.\n";

open( fileHandle, $fileName ) || die "Cannot open $fileName.\n";
while( $aLine = <fileHandle> ) # 한번에 한줄씩 읽습니다.
{
  print $aLine;
}
close( fileHandle );  # 다 읽었으니 꼭 닫습니다. !!!!!
예제를 만들면서 가능한 실수가 없도록 test를 해 봅니다. 혹시 깜박 잊고 test를 하지 못한데서 실수가 나올 수도 있겠지요. 그 실수를 찾아내는 것은 여러분의 숙제입니다.^^
이전 | 목록 | 다음
Comments