'print if (1..100)'에서 '..'는 스칼라 문맥(scalar context)에서 쓰였기 때문에 범위연산자(range operator)입니다. 범위 연산자의 경우 1번째 줄에서 100번째 줄인지를 확인해 불리언 값을 반환하는 플립플롭 역할을 합니다. 말 그대로 1~100번째 줄일때만 출력을 하겠죠.
print에 인자가 없얼 경우(if는 수정자(modifier)입니다) $_를 출력합니다. 이미 -n 옵션을 사용했기 때문에 각각의 줄은 $_에 저장되어 있습니다.
비슷한 건데, 좀 더 길게 써봤습니다. 좀 더 길게 쓰면 성의있어보일까봐...
저는 컴맹이예요. 코드가 좋지는 않아요.
아래 코드는 1to100.pl으로 저장해주세요.
꼭 1번 줄부터 100줄만 잘라주지는 않습니다만.
이렇게 답변 쓰면 조금 더 많은 사람이 perl을 쓰지 않을까 하는 꿈을 꿉니다.
혹시 이해 안 되면 메일(imyaman@netscape.net), 댓글 주세요.
공부하는 목적이라면, 두번째 인자와 세번째 인자가 숫자인지 확인하고, 숫자가 아니면 안내문구를 출력하는 코드를 추가해BoA요.
#!/usr/bin/perl
# program name : 1to100.pl
use strict;
# 명령행 인자를 3개 받습니다. 3개가 아니면 사용방법을 출력합니다.
# 첫번째 인자는 파일이름, 두번째 인자는 출력할 첫행 번호, 세번째 인자는 마지막 행 번호
if(@ARGV < 3 ){
print "usage : 1to100.pl FILENAME STARTLINE ENDLINE\n";
exit 1;
}
# 변수를 정해보았어요. 필요한 변수를 머리 속에 정리해 두면 좀 더 똑똑해질 지도 몰라요.
my ($filename,$start, $end);
my ($i);
my $line;
# 명령행 인자로 받은 내용을 읽기 쉬운 이름의 변수에 옮겨 넣었습니다. 귀찮지만 해야할 일이예요.
$filename = $ARGV[0];
$start = $ARGV[1];
$end = $ARGV[2];
# 처리할 파일을 엽니다. 못 열면 죽어요.
open FN, "<$filename" or die "1to100.pl : can't open the file $filename\n";
# 파일의 내용을 한 줄씩 읽습니다. start에서 end 사이의 내용만 출력해요. start 이전의 행은 그냥 넘어가요. 카운터($i)가 end보다 커지면 끝나요.
# goto를 썼는데, goto가 반드시 모든 상황에서 나쁜 것은 아니예요.
$i=0;
while($line=){ #혹시코드가 안 보이면 $line=<FN>
if($i>$start){
if($i<$end){
print($line);
}else{
goto ENDPROGRAM;
}
}
$i++;
}
원라이너로 하면
다른 분께서 답변을 달아주신 코드에 대해 간단하게
다른 분께서 답변을 달아주신 코드에 대해 간단하게 설명을 드리면 이렇습니다.
-n 옵션을 썼기 때문에 인자로 받는 파일 old.txt를 줄 단위로 읽습니다. while문을 쓴것과 동일한 효과입니다.
-e 옵션은 'print if (1..100)' 구문을 실행하는 것이구요.
'print ...' 구문은 -n 덕분에 'while (한줄씩 처리) { print ... }' 구문과 동일합니다.
'print if (1..100)'에서 '..'는 스칼라 문맥(scalar context)에서 쓰였기 때문에 범위연산자(range operator)입니다. 범위 연산자의 경우 1번째 줄에서 100번째 줄인지를 확인해 불리언 값을 반환하는 플립플롭 역할을 합니다. 말 그대로 1~100번째 줄일때만 출력을 하겠죠.
print에 인자가 없얼 경우(if는 수정자(modifier)입니다) $_를 출력합니다. 이미 -n 옵션을 사용했기 때문에 각각의 줄은 $_에 저장되어 있습니다.
Enjoy Perl! :-)
----
use perl;
Keedi Kim
감사합니다~!
감사합니다~!
비슷한 건데, 좀 더 길게 써봤습니다. 좀 더 길게
비슷한 건데, 좀 더 길게 써봤습니다. 좀 더 길게 쓰면 성의있어보일까봐...
저는 컴맹이예요. 코드가 좋지는 않아요.
아래 코드는 1to100.pl으로 저장해주세요.
꼭 1번 줄부터 100줄만 잘라주지는 않습니다만.
이렇게 답변 쓰면 조금 더 많은 사람이 perl을 쓰지 않을까 하는 꿈을 꿉니다.
혹시 이해 안 되면 메일(imyaman@netscape.net), 댓글 주세요.
공부하는 목적이라면, 두번째 인자와 세번째 인자가 숫자인지 확인하고, 숫자가 아니면 안내문구를 출력하는 코드를 추가해BoA요.
#!/usr/bin/perl
# program name : 1to100.pl
use strict;
# 명령행 인자를 3개 받습니다. 3개가 아니면 사용방법을 출력합니다.
# 첫번째 인자는 파일이름, 두번째 인자는 출력할 첫행 번호, 세번째 인자는 마지막 행 번호
if(@ARGV < 3 ){
print "usage : 1to100.pl FILENAME STARTLINE ENDLINE\n";
exit 1;
}
# 변수를 정해보았어요. 필요한 변수를 머리 속에 정리해 두면 좀 더 똑똑해질 지도 몰라요.
my ($filename,$start, $end);
my ($i);
my $line;
# 명령행 인자로 받은 내용을 읽기 쉬운 이름의 변수에 옮겨 넣었습니다. 귀찮지만 해야할 일이예요.
$filename = $ARGV[0];
$start = $ARGV[1];
$end = $ARGV[2];
# 처리할 파일을 엽니다. 못 열면 죽어요.
open FN, "<$filename" or die "1to100.pl : can't open the file $filename\n";
# 파일의 내용을 한 줄씩 읽습니다. start에서 end 사이의 내용만 출력해요. start 이전의 행은 그냥 넘어가요. 카운터($i)가 end보다 커지면 끝나요.
# goto를 썼는데, goto가 반드시 모든 상황에서 나쁜 것은 아니예요.
$i=0;
while($line=){ #혹시코드가 안 보이면 $line=<FN>
if($i>$start){
if($i<$end){
print($line);
}else{
goto ENDPROGRAM;
}
}
$i++;
}
ENDPROGRAM:
close FN;
exit 0;
댓글 달기