Tips in Action‎ > ‎문자열‎ > ‎

문자열 안에 실행문 넣기

전종필

문자열 내에 실행문을 직접 삽입할 수 있습니다.
보통의 print 문에서는

print "수익대 비용 차액 : " . ($income - $outcome) . "\n";
와 같은 식입니다.
만일 print문 안에 이런 계산식이 많이 들어가야 한다면, 조금 귀찮을 수도 있습니다. 이런 경우 문자열 내에 계산식을 직접 삽입하는 것이 간편하겠다고 생각되면 다음과 같은 형식을 사용합니다.

print "수익대 비용 차액 : ${ \($income - $outcome) }\n";
문자열 내에서 ${스칼라변수리퍼런스}는 그 리퍼런스가 가리키는 변수의 값을 나타냅니다. 예를 들면 다음과 같은 경우입니다.

$var = 365;
$rvar = \$var;
print "var = ${$rvar}\n"; # 이 경우라면 "var = $$rvar\n"도 같은 결과이지만, 설명을 위해...
${ \($income - $outcome) }는 ${ }의 안에 \($income - $outcome)을 가지고 있습니다. 목록(list)을 나타내는 괄호앞에 \(백슬래쉬)를 두면 목록의 각 요소에 대해 리퍼런스를 만드는 것과 같습니다. 그래서

$what = \( $a, $b, $c )

$what = ( \$a, \$b, \$c ); # $what은 \$c와 같다.
와 같게 되고, 스칼라 문맥에서 목록이 사용되면 맨 뒤의 것만 사용되게 되어 맨 마지막 요소인 $income - $outcome의 결과 값에 대한 리퍼런스가 ${ }와 함께 사용되어 계산값이 출력 되는 것입니다. 맨 마지막 값이 사용되는 것을 직접 확인하려면 괄호의 앞부분에 다른 값을 넣고 컴마로 구분해 보면 됩니다.

print "수익대 비용 비율과 차액 : ${ \($outcome / $income, $income - $outcome) }\n"; # 뜨아!
이 경우 $outcome / $income 부분은 사라져 알 수 없습니다.
배열 역시 문자열 안에 넣을 수 있습니다. 문자열 내에서 배열리퍼런스의 사용은 @{배열의리퍼런스}의 형식입니다. 물론 "@$array_ref"와 같은 맥락입니다.

print "수익대 비용 비율과 차액 : @{ [ $outcome / $income, $income - $outcome ] }\n";
이 경우에는 \() 대신 []를 사용합니다. []는 이름없는 배열(anonymous array)의 리퍼런스를 나타냅니다. 활용은 여러분의 생각에 달렸지만, 조심해야 할 것은, 여러분의 프로그램 사용자가 입력한 내용을 그 대로 적용하려고 하지는 마십시오. 다음 예제를 보세요.

print "Cmd : @{ [ system($usercmd) ] }\n";
만일 $usercmd에 "rm -Rf /" 같은 내용이 들어 있다면 큰일이죠 !!!!  
Comments