Perl은 큰따옴표("")와 특정 템플릿(예: heredoc) 내에서 변수의 인터폴레이션(대입)을 지원합니다. 스칼라는 간단하게 인터폴레이션됩니다:
my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!
배열은 큰따옴표 내에서 대입 후 문자열로 변환되며, 요소는 기호 $"로 구분됩니다(기본값은 공백):
my @items = ('a','b','c'); print "List: @items "; # List: a b c
해시는 키=>값 형식의 문자열로 대입되며, 기호 $;로 구분됩니다:
my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (다를 수 있음)
작은따옴표(' ') 내에서는 아무것도 인터폴레이션되지 않습니다 — 문자열은 문자 그대로 출력됩니다.
또한 중괄호를 사용하여 복잡한 표현식을 인터폴레이션하는 것도 가능합니다:
print "${name}_test "; # Bob_test
위험성 — 특수 기호의 우연한 인터폴레이션과 배열, 해시 및 스칼라의 동작 차이.
왜 문자열 "Total: $total$val"가 가끔 잘못 작동하나요?
일반적인 대답: "모든 것이 그대로 대입된다!"
정답:
문자열 "Total: $total$val"는 변수 $total을 정확하게 대입할 수 있지만, 변수 $val은 인식되지 않거나 Perl이 잘못된 범위를 인터폴레이션할 수 있습니다. 이름이 비슷한 경우 모호성을 피하기 위해 중괄호를 사용하는 것이 좋습니다:
print "Total: ${total}${val} ";
역사
역사 1
보고서에서 합계 문자열은 "이총: $sum руб."로 표시되었습니다. 변수 $rub이 코드에 추가된 후 문자열은 "이총: $sum$rub"이 되어 결과적으로 인터폴레이션은
$sum에 대해서만 작동하고,$rub은 넘어가며 경고가 발생했습니다. 아무도 이해하지 못하다가 빈 문자열 출력이 나타나고 나서야 알게 되었습니다.
역사 2
SQL 쿼리 형성에서 배열을 통한 @values의 인터폴레이션이 join 없이 사용되었습니다:
"IN (@values)". 이로 인해 예상한 쉼표로 구분된 목록 대신 공백 구분 문자열이 생성되었습니다. 결과 — SQL 오류 및 잘못된 선택.
역사 3
해시의 키 목록 출력을 위해 %h를 문자열 "Keys: %h" 내에서 사용했습니다. 이로 인해 키-값 쌍이 혼합된 문자열이 생성되어 좋은 키 목록 대신 출력되었습니다. 해야 할 것은:
join ", ", keys %h였습니다.