2011-04-21 2 views
0

Je travaille sur l'ajout de nouvelles langues support pour ma plate-forme mobile.Je dois ajouter une entrée pour chaque langue dans plusieurs fichiers, donc je pensais le faire en utilisant perl.Pour automatiser ce processus, je me sens problème dans la façon de faire correspondre les modèles multi-lignes en Perl. Voici mon scénario:traitement multiligne en perl

const mmi_imeres_mode_details_struct g_ime_mode_array_int[] = 
{  
    { 
    INPUT_MODE_NONE, 
    0, 
    0, 
    0, 
    0, 
    0, 
    0 
    }, 
    { 
    INPUT_MODE_MULTITAP_LOWERCASE_ABC, 
    STR_INPUT_METHOD_MENU_MULTITAP_abc, 
    WGUI_IME_MULTITAP_LOWERCASE_ABC_IMG, 
    INPUT_MODE_DEFAULT_ALTERNATE_METHOD, 
    MMI_IME_ALL_EDITORS | MMI_IME_ENGLISH_ONLY_MODE | MMI_IME_ALPHABETIC | MMI_IME_LOWERCASE, 
    MMI_IMM_WRITING_LANGUAGE_ENGLISH, 
    "en-US" 
    }, 

}

Tout d'abord j'ai eu problème parce que dans le fichier perl est lu une ligne à time.so i d'abord converti mon flux de fichier dans seule variable.

my $newstr = ''; 
open (FH, "$filename") || die "Could not open file.\n"; 
while(<FH>) 
{ 
    $newstr = $newstr.$_; 

} 

Pas quelqu'un peut me aider comment rechercher du texte dans {}, si elle est un multi-ligne pattern.please réponse bientôt ... :)

Répondre

3

D'abord, il y a un meilleur langage pour siphonage un fichier:

my $newstr; 
{ 
    open my $fh, '<', $filename or die "Could not open file $filename.\n$!\n"; 
    local $/ = undef; 
    $newstr = <$fh>; 
} 

Ensuite, vous pouvez définir le modificateur/s sur votre regexp, qui traite la chaîne comme une seule ligne en permettant « » (point) pour correspondre à tout y compris newlines. Mais même ce n'est pas vraiment nécessaire puisque vous ne comptez pas utiliser « dot » dans votre regexp ..... de toute façon

while( 
    $newstr =~ m/ 
     {  # Match the opening bracket. 
     ([^}]*) # Capture any number of characters that exclude '}' 
     }  # Match the closing bracket. 
    /gx   # Use /g for multiple matches, and /x for readability. 
) { 
    print "$1\n"; 
} 

Une autre solution serait de définir votre séparateur d'enregistrement d'entrée,/$, à « } » . De cette façon, vous lisez le fichier en morceaux qui se terminent par un crochet de fermeture. Astuce astucieux.

+0

thnx beaucoup laissez-moi essayer .. –

+0

Vous savez, je ne suis pas vraiment heureux avec ma réponse précédente. Bien qu'il soit techniquement correct, il ne considère pas la plus grande tâche à accomplir. Vous analysez les tags imbriqués. Pour cela, utilisez un module d'analyse syntaxique; n'essayez pas de lancer votre propre solution d'expression rationnelle. Ça devient complexe très vite. Au lieu de cela, utilisez Parse :: RecDescent, ou Parse :: RecDescent :: Simple pour une meilleure précision, moins de maux de tête et un meilleur sommeil la nuit. – DavidO

+0

ouais vous avez raison, à long terme, il n'est pas bénéfique, mais cpan est assez vaste à utiliser.Mais j'essaierai de..thnx pour votre suggestion..réalement utile ... :) –

Questions connexes