perl에서 shift

illuza의 이미지

아래의 코드에서

for (1 .. shift || 1) {
# ...
}

for loop문 안의 조건문이 잘 이해가 되지 않습니다.

print (1 .. shift || 1) 하면 1이 출력되고
print (1 .. shift || 7) 하니까 1234567이 출력이 되는군요.

이 코드가 어떤 의미일까요?

hackexpert의 이미지

perl에서
$element = shift @array

식으로 하면 배열에서 값을 하나씩 꺼내옵니다.
그런데 shift 만쓰고 배열을 특별히 지정안해주면
아마 명령줄의 아규먼트를 가져올겁니다.

만약 pl이름이 test.pl 이고
프로그램이

for (1 .. shift || 1) {
  print $_;
}

이라면

test.pl 5
이렇게 하면 1,2,3,45를 찍을겁니다..

음.. 해보지는 못해서 확답은 못드리겠네요..
아마 맞을겁니다.. ^^
좀있다 한번 해봐야 겠네요.. ;;

최종호의 이미지

shift || 1

에서 shift 는 hackexport 님이 잘 설명해주셨고요

|| 1 은 명령행에 인자가 주어지지 않은 경우 shift 가 undef 를 리턴하고

undef || 1 에서 || 연산자의 왼쪽이 undef이기 때문에 오른쪽까지

evaluate하게 되어서 1이 shift || 1 식의 값이 됩니다.

기본값을 지정하는데 종종 사용되는 펄 숙어라고 해야할까요?

$output_file = shift || "output";

도 비슷한 구문이고, 이를 TIMTOWDI 해 보면,

if (@ARGV > 0) {
    $output_file = $ARGV[0];
    shift @ARGV;
} else {
    $output_file = "output";
}

정도가 되겠습니다.

간결하긴 하지만 익숙치 않은 사람들에게는 좀 혼란스러운 표현이지요.