2010-12-07 6 views
0

J'ai une chaîne $ incluant une barre de caractères spéciale comme "1234 \\ n567 \\ t";
Remarque "\\ n" et "\\ t" sont tous deux char, et non trois caractères. alors quand ils sont affichés, ils sont affichés comme "\ n" et "\ t".comment changer \ n en n en perl

Pour une raison quelconque, j'ai besoin de changer la chaîne comme: "1234 \ n567`efg \ t". Comment faire cela d'une manière simple?
Voici mon code, je pense que ce peut être amélioré:

  @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

Voulez-vous dire que vous voulez convertir $ string de "1234 \\ n567 \\ t" à "1234 \ n567 \ t"? – drummondj

+1

Il serait utile d'afficher une affectation précise de vos données d'entrée d'échantillon à '$ string'. Il pourrait être '$ string = q {1234 \\ n567 \\ t};' ou '$ string = qq {1234 \\ n567 \\ t};', par exemple, ce qui donne deux points de départ assez différents. Il serait également utile d'avoir une chaîne de sortie désirée précise: '$ result = qq {1234 \ n567 \ t};' ou tout ce qui est correct. –

+0

@Jonathan 'q {1234 \\ n567 \\ t}' et 'qq {1234 \\ n567 \\ t}' sont des chaînes identiques (et aucune ne contient deux barres obliques inverses à la suite :) – hobbs

Répondre

3

Pourquoi ne pas:

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

Ce serait bien d'utiliser tr///, mais qui ne peut pas transformer deux personnages à un.

+0

re: tr /// - oui, il peut transformer deux caractères en un, par ex. '$ x =" aa "; $ x = ~ tr/a/a/s; '- l'option 's' (squash) supprime les caractères traduits en double – plusplus

+0

@plusplus: Je vais clarifier - mais il ne peut pas convertir une paire de caractères en un seul caractère comme requis pour obtenir un mappage de 'q {\ n}' à 'qq {\ n}'. –

+0

Le faire en tant que substitutions séparées ne permet pas aux antislashs de s'échapper eux-mêmes. Ce n'était pas une exigence explicite, mais il semble probable que le PO le souhaite. Son code ferait cela, si '% slash_char' était correctement configuré. – cjm

3

Eh bien, la voie facile est d'utiliser String::Escape:

use String::Escape 'unbackslash'; 

my $string = "1234\\n567\\t"; 
my $new_string = unbackslash($string); 
Questions connexes