2017-07-21 3 views
1

でエスケープを考えてみましょう:GET perlのバックスラッシュを処理するために、このコードを文字列

my $str = '"line 1\n\t line 2"'; # from some JSON, or something 
say $str; # print literal backslashes, not what I want 
say eval $str; # processes backslashes, but overkill 

は、最後の行の効果を得るために合理的に簡単な方法はありますが、本格的にevalを使用せずに?セキュリティの意味(私は主にこの文字列を信頼します)を脇に置いていても、これは必要としない変数やものを補間します。これは、私が手動でドル記号などをエスケープする余分な前処理ステップによって回避することができますが、これはまだ私の好みのために少しあまりにもハッキリと感じます。

+1

も参照[文字列エスケープ::](https://metacpan.org/pod/String::Escape) –

+0

これは除いて、私が望んでいたものに非常に近いです...なぜコアの中にはない素晴らしいものですか? (まあ、HTTP :: Tinyを除いて、コアにありますが、彼らはそれを認めたくないと思われます:http://perldoc.perl.org/index-modules-H.html) –

答えて

1

@mobが適切な推奨値です。一般的な問題の場合:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my %unescape = map +($_ => eval "qq{\\$_}"), qw(f n r t); # etc 
my $special = join '|', keys %unescape; 
my $str = '"line 1\n\t line 2"'; 

$str =~ s{ \\ ($special) }{$unescape{$1}}xg; 

print "'$str\n'"; 
+0

それはいくつかの密集したコードです! (まあ、そうではないかもしれませんが、私はPerlの新しいです。)これを解凍できるかどうか見てみましょう。マップが暗示しているループの最後の反復で、$ _は文字列 "t"なので、 '' qq {\\ $ _} ''は' 'qq {\ t}' 'と評価されます。 evalは、これをタブを含む1文字の文字列に変換します。したがって、文字tをタブ文字にマッピングするハッシュがあります。ここまでは順調ですね。次に、パイプ文字で特殊文字を結合します。それから私たちは物事を終わらせるために巧妙な正規表現の魔法をします。コメントを編集:私はあなたがコードを変更したことに気付かなかった。今より意味をなさないありがとう! –

+0

良いアイデア。完了:) –

1

JSONなら、それをJSONでデコードしてください。

use JSON; 
my $str = '"line 1\n\t line 2"'; # from some JSON, or something 
my $decoded = JSON::decode_json("[$str]"); 
say $decoded->[0]; 
+0

Meh、not aおそらく正解です。ありがとう! –

+0

しかし、JSON :: PPは中核です!誰もそれを見つけることができないところに埋もれたコアのすべてがなぜですか? –

関連する問題