2012-10-05 36 views
1

如果字符串中的變量是簡單的標量,比如使用正則表達式的「$ foo = 5」,我已經找到了這樣做的方法。但問題是什麼,如果字符串中的變量是: $ FOO - > {}吧是等於5如何在字符串中擴展哈希變量?

所以樣本字符串爲:

「這是$的哈希值的字符串FOO - > {欄}」。

我怎樣才能展開了閱讀:

「這是5哈希值的字符串」

感謝。

編輯更多的解釋:

我有一個字符串(我相信我不是最擅長的這個詞彙?)那就是「Lorem存有$ FOO - > {條} Lorem存有」我從一些文本來源收到。我想取這個字符串,用我的代碼中的變量的實際值替換所有的變量名稱。

+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