2012-10-05 3 views
1

문자열의 변수가 정규식을 사용하여 "$ foo = 5"와 같은 간단한 스칼라 인 경우이를 수행하는 방법을 발견했습니다. 5.문자열에서 해시 변수를 확장하는 방법은 무엇입니까?

그래서 샘플 문자열과 동일> {줄}입니다 - $ foo는이 :

"이것은 $의 해시 값을 가진 문자열입니다 그러나 문제는 문자열에 변수가 있다면 무엇인가 foo -> {bar} "를 선택하십시오.

감사 "이것은 5의 해시 값을 가진 문자열입니다"내가 읽고 그 밖으로 확장 할 수 있습니다 어떻게

. 더 설명은

편집 : 문자열 리터럴이

이다 (? 나는 이것의 Vocab의에서가 아니라 최고입니다 믿는다) "로렘 입숨 $ foo는 -> {줄} 로렘 입숨"그 I 일부 텍스트 소스에서 수신되었습니다. 이 문자열을 가져 와서 모든 변수 이름을 내 코드에서 변수의 실제 값으로 바꾸고 싶습니다.

+0

내가 알고 있는지 확인하고 싶습니다. 가짜 보간의 목적을 검색해야하는 문자열 (보간 할 수없는 리터럴이 아닙니다)이 있습니까? – mkb

+0

일부 텍스트 소스에서받은 "Lorem Ipsum $ foo -> {bar} Lorem Ipsum"이라는 문자열 리터럴이 있습니다 (이 단어의 가장 좋은 단어가 아닙니다). 이 문자열을 가져 와서 모든 변수 이름을 내 코드에서 변수의 실제 값으로 바꾸고 싶습니다. –

+0

문자열이 소스 코드에 큰 따옴표로 표시되어 있습니까? 그러면'$ foo -> {bar}'가 문자열에 보간됩니다. 소스 코드에서 큰 따옴표로 묶이지 않으면 리터럴이 아닙니다. – mkb

답변

4

은 "템플릿"이라고 당신이 가지고있는 무엇. 따라서, 당신은 템플릿 시스템을 찾고 있습니다.

인용구가 실제로 문자열에 없다고 가정하면 템플릿 언어를 이해할 수있는 유일한 템플릿 시스템은 String::Interpolate입니다.

$ perl -E' 
    use String::Interpolate qw(interpolate); 
    my $template = q!This is a string with hash value of $foo->{bar}!; 
    local our $foo = { bar => 123 }; 
    say interpolate($template); 
' 
This is a string with hash value of 123 

따옴표가 문자열의 일부이면 Perl 코드가 있습니다. 따라서 문자열을 실행하여 원하는 것을 얻을 수 있습니다. 이는 eval EXPR을 사용하여 수행 할 수 있습니다.

$ perl -E' 
    my $template = q!"This is a string with hash value of $foo->{bar}"!; 
    my $foo = { bar => 123 }; 
    my $result = eval($template); 
    die [email protected] if [email protected]; 
    say $result; 
' 
This is a string with hash value of 123 

강력히 권장합니다. 특히 String :: Interpolate 중 하나는 발견되지 않았습니다. Template::Toolkit은 아마도 템플릿 시스템에 대한 대중적인 선택 일 것입니다.

$ perl -e' 
    use Template qw(); 
    my $template = q!This is a string with hash value of [% foo.bar %]!."\n"; 
    my %vars = (foo => { bar => 123 }); 
    Template->new()->process(\$template, \%vars); 
' 
This is a string with hash value of 123 
+0

이 모듈을 몰랐습니다. 단! – mkb

+0

@mkb, 꽤 이상한 인터페이스를 가지고 있지만, 여전히 완벽하게 사용할 수 있습니다. – ikegami

+0

위대한 작품! –

-2

이 작동합니다 :

$foo->{"bar"} = 5; 
printf "This is a string with hash value of $foo->{\"bar\"}]"; 
+0

포맷 될 변수를 전달하지 않을 경우 printf를 사용하지 말라. 또한, 이것은 OP 문제가 아닙니다. – harleypig

관련 문제