Perl for, foreach와 $_ 글로벌 특수 변수 사용 방법 예제

for문

펄에서 반복문을 사용하는 대표적인 방법으로 for와 foreach가 있습니다.

for문은 다른 언어와 사용 방법이 똑같습니다.

Java나 PHP 등을 먼저 사용해본 경험이 있으시면 Perl에서도 어려움 없이 사용할 수 있습니다.

 

for문 사용 방법

for (my $i = 0; $i < 10; $i++) {
	print "$i "; 
}

 

실행 결과

0 1 2 3 4 5 6 7 8 9

 

foreach문

반복문으로 배열이나 해시에 있는 값을 다룰때 많이 사용되는 것이 foreach문 입니다.

for는 반복할 횟수를 지정해야 한다면 foreach의 경우에는 반복 횟수를 지정하지 않아도 배열이나 해시에 들어있는 값만큼 반복해주기 때문에 배열이나 해시와 같이 많이 사용됩니다.

배열에 있는 모든 값을 출력해야 하는 경우 다음과 같이 작성할 수 있습니다.

my @fruit = ('banana', 'strawberry', 'grape');

foreach my $name (@fruit) {
	print "$name ";
}

 

실행 결과

banana strawberry grape

 

배열에 값이 몇 개가 들어 있는지 count를 하지 않아도 배열의 길이를 알아서 확인해주고 반복해줍니다.

foreach를 사용하면 for문을 간단하게 작성할 수 있습니다.

예를 들어 위에서 사용한 for문 예제를 foreach문으로 변경해보겠습니다.

foreach(0..9) {
	print "$_ "; 
}

 

실행 결과

0 1 2 3 4 5 6 7 8 9

 

foreach문에서 (0..9) 0부터 9번 반복하겠다고 지정하였습니다.

print에서 사용한 $_는 특수 변수로 Perl의 어디에서도 사용 가능한 변수입니다.

$_ Perl 내부 어디에서 사용할 수 있는 이유로는 $_ 는 글로벌 변수 이기 때문입니다.

foreach나 while문처럼 반복문에서 주로 사용됩니다.

forech문 예제를 특수 변수 $_ 를 사용하면 다음처럼 작성할 수 있습니다.

my @fruit = ('banana', 'strawberry', 'grape');

foreach (@fruit) {
	print "$_ ";
}

 

실행 결과

banana strawberry grape

 

$_를 사용하면 편리한 점도 있지만 많이 사용하게 되면 소스 코드의 가독성이 떨어진다는 이유로 사용하지 않는 경우도 있습니다.

for문이나 foreach안에서 사용할 변수를 따로 선언하지 않기 때문에 배열에 있는 내용이 어떤 건지 변수명으로 확인을 할 수 없어 소스 읽기가 힘들다고 하네요.

또는 초보자가 Perl 소스를 볼 때에 $_가 무엇인지 찾아봐야 하기 때문에 소스를 파악하는데 시간이 걸리는 경우도 있습니다.

 

 

하지만 $_ 특수 변수는 잘 사용하면 편리합니다.

특히 정규식 표현과 같이 사용하는 경우에 편하게 사용할 수 있습니다.

배열에 strawberry라는 값이 1개만 존재하는지 확인하고 싶습니다.

foreach를 사용하여 작성해보겠습니다.

my @fruit = ('banana', 'strawberry', 'grape', 'banana', 'grape');
my $cnt = 0;

foreach my $name (@fruit) {
	if ($name eq 'strawberry') {
		$cnt++;
	}
}

if ($cnt == 1) {
	print "OK";
} else {
	print "NG";
}

 

배열에 strawberry가 1개 있기 때문에 결과는 OK가 출력됩니다.

위 예제를 정규식 표현과 글로벌 특수 변수인 $_ 를 사용하여 작성해보겠습니다.

my @fruit = ('banana', 'strawberry', 'grape', 'banana', 'grape');

if (scalar(map {
	$_ =~ /strawberry/
} @fruit) == 1 ){
	print "OK";
} else {
	print "NG";
}

 

글로벌 변수 $_와 정규식 표현 =~ /strawberry/을 사용하여 배열에 strawberry가 1개인 경우 “OK”를 그 외의 경우에는 “NG”를 출력하도록 하고 있습니다.

소스도 if문을 하나만을 사용하여 간결해지고 수정하기에도 편해졌습니다.

 

정리

반복문인 for와 foreach 그리고 글로벌 특수 변수인 $_를 살펴보았습니다.

for문은 foreach를 사용하여 조금 더 간결하게 for문과 foreach문은 특수 변수 $_를 사용해 더욱 간결하게 사용할 수 있습니다.

특히 정규식과 특수 변수 $_를 사용하는 것으로 배열에 원하는 값이 있는지 판정하는 문도 간결하게 작성할 수 있습니다.

댓글