2010-12-07 8 views
0

"1234 \\ n567 \\ t"のようなスラッシュに続く特殊文字を含む$文字列があります。
メモ "\\ n"と "\\ t"は2つのcharであり、3つのcharではありません。表示されたときには、 "\ n"と "\ t"と表示されます。perlの nを nに変更する方法

何らかの理由で、文字列を "1234 \ n567`efg \ t"と変更する必要があります。どのように簡単な方法でそれを行うには?
は、ここで私が思う私のコードは、向上させることが可能である。

  @src_array = split(//, $string); 
      @des_array =();  
      $size = $#src_array + 1; 
      $converting = 0; 
      for ($i = 0, $j = 0; $i< $size; $i++){ 
       if ($converting == 1) { 
          # convert and replace '\\n' with '\n' 
        $des_array[$j++] = $slash_char{$src_array[$i]}; 
        $converting = 0; 
       } 
       elsif ($src_array[$i] == '\\'){ 
        $converting = 1; 
       } 
       else { 
        $des_array[$j++] = $src_array[$i]; 
       } 
      } 

my %slash_char = ( 
     'a' => '\a', 
     'b' => '\b'  
... 
); 
+1

あなたは "1234の\ n567の\ tの" に "1234 \\ n567 \\ T" から$文字列を変換したいわけですか? – drummondj

+1

サンプル入力データを '$ string'に正確に代入すると便利です。たとえば、$ string = q {1234 \\ n567 \\ t};や '$ string = qq {1234 \\ n567 \\ t};'など、2つの全く異なる開始点を与えることができます。 '$ result = qq {1234 \ n567 \ t};やそれ以外の正しい出力文字列を持つこともまた役に立ちます。 –

+0

@Jonathan 'q {1234 \\ n567 \\ t}'と 'qq {1234 \\ n567 \\ t}'は同じ文字列です(いずれも1行に2つのバックスラッシュを含みません)。 – hobbs

答えて

3

はなぜ:

s/\\n/\n/g; 
s/\\t/\t/g; 

tr///を使用するとよいでしょうが、それは1つに2つの文字を変換することはできません。

+0

re:tr /// - はいそれは2つの文字を1に変換することができます。 '$ x =" aa "; $ x =〜tr/a/a/s; - 's'(スカッシュ)オプションは、重複した翻訳文字を削除します。 – plusplus

+0

@plusplus:明確にしますが、必要に応じて一対の文字を1文字に変換することはできません。 'q {\ n}'から 'qq {\ n}'へのマッピングを実現します。 –

+0

別の置換として実行すると、バックスラッシュがエスケープすることはできません。これは明白な要件ではありませんでしたが、OPはそれを望んでいるようです。 '%slash_char'が正しく設定されていれば、彼のコードがそれを行います。 – cjm

3

まあ、簡単な方法はString::Escapeを使用することです:

use String::Escape 'unbackslash'; 

my $string = "1234\\n567\\t"; 
my $new_string = unbackslash($string); 
関連する問題