IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

expressions régulières pour corriger la typographie d'un texte


Sujet :

Langage Perl

  1. #61
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,

    j'ajoute :

    Ceci n'est pas correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $fh_sortie = "$fh.new";
    Ça pourrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $sortie = $fh."new";
    Là c'est l'inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open ( my $sortie, '>', $fh_sortie) 
       or die ( "Imposible d'ouvrir le fichier $fh_sortie $!" );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open ( my $fh_sortie, '>', $sortie) 
       or die ( "Imposible d'ouvrir le fichier $sortie $!" );
    et tu n'écris jamais dans le fichier de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    }
        print $nouveau_num_endroit, "\n";                     # j'imprime mon nouveau numéro
     
     
     
        print $sortie
    }
    A remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $fh_sortie $ligne;

    enfin :

  2. #62
    Candidat au Club
    Femme Profil pro
    Bibliothécaire
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bibliothécaire

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 3
    Points
    3
    Par défaut
    Merci, je comprends mieux.
    Donc il faut toujours déclarer une variable avant de l'utiliser dans une boucle.
    Je pensais qu'il fallait lui donner une valeur ($nb = 123) pas seulement la citer ($elem
    J'ai donc recorrigé.
    J'avance d'un pas, il m'imprime un nouveau fichier texte mais celui-ci est vide :/
    J'ai un énorme message d'erreur qui semble se répéter.
    On dirait que mes print $... ne sont pas aux bons endroits.
    Il faudrait tout mettre à la fin ?
    ex.: print $sortie $ligne $minuscule ...

    Merci
    Fichiers attachés Fichiers attachés

  3. #63
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Je continue sur ma petite lancée...

    Pour l'écriture dans le fichier voir le post précédent

    [EDIT 16:38] Erreur de Copier/Coller de ma part c'est OK pour les apostrophes...
    Sinon tu supprimes les apostrophes :
    DE L'AMITIÉ

    1. Considérant la conduite de la besogne d'un peintre, que j'ai, il m'a pris envie de l'ensuivre. Il choisit le plus bel endroit et milieu de chaque paroi, pour y loger un tableau élaboré de toute sa suffisance : Et le vide tout autour, il le remplit de crotesques, qui sont peintures fantasques, n'ayant grâce qu'en la variété et étrangeté. Que sont-ce ici aussi à la vérité que crotesques et corps monstrueux, rapiécés de divers membres, sans certaine figure, n'ayant ordre, suite, ni proportion que fortuite ?

    «Une femme belle de buste s'achève en poisson».

    2. Je vais bien jusques à ce second point, avec mon peintre : mais je demeure court en l'autre, et meilleure partie : Car ma suffisance ne va pas si avant, que d'oser entreprendre un tableau riche, poli et formé selon l'art. Je me suis avisé d'en emprunter un d'Estienne de la Boétie, qui honorera tout le reste de cette besogne. C'est un discours auquel il donna nom. La Servitude volontaire : Mais ceux qui l'ont ignoré, l'ont bien proprement depuis rebaptisé, Le Contre un. Il l'écrivit par manière d'essai, en sa première jeunesse, à l'honneur de la liberté contre les tyrans. Il court piéça ès mains des gens d'entendement, non sans bien grande et méritée recommandation : car il est gentil, et plein ce qu'il est possible. Si y a-il bien à dire, que ce ne soit le mieux qu'il pût faire : et si en l'âge que je l'ai connu plus avancé, il eût pris un tel dessein que le mien, de mettre par écrit ses fantaisies, nous verrions plusieurs choses rares, et qui nous approcheraient bien près de l'honneur de l'antiquité : Car notamment en cette partie des dons de nature, je n'en connais point qui lui soit comparable.

    3. Mais il n'est demeuré de lui que ce discours, encore par rencontre, et crois qu'il ne le vit onques depuis qu'il lui échappa : et quelques mémoires sur cet édit de Janvier fameux par nos guerres civiles, qui trouveront encore ailleurs peut-être leur place. C'est tout ce que j'ai pu recouvrer de ses reliques, Moi, qu'il laissa d'une si amoureuse recommandation, la mort entre les dents, par son testament héritier de sa bibliothèque et de ses papiers : outre le livret de ses œuvres que j'ai fait mettre en lumière. Et si suis obligé particulièrement à cette pièce, d'autant qu'elle a servi de moyen à notre première accointance. Car elle me fut montrée longue pièce avant que je l'eusse vu, et me donna la première connaissance de son nom, acheminant ainsi cette amitié, que nous avons nourrie, tant que Dieu a voulu, entre nous, si entière et si parfaite, que certainement il ne s'en lit guère de pareilles, et entre nos hommes il ne s'en voit aucune trace en usage. Il faut tant de rencontres à la bâtir, que c'est beaucoup si la fortune y arrive une fois en trois siècles.

    4. Il n'est rien à quoi il semble que nature nous ait plus acheminé qu'à la société : et dit Aristote que les bons législateurs ont eu plus de soin de l'amitié que de la justice. Or le dernier point de sa perfection est cetui-ci. Car en général toutes celles que la volupté ou le profit : le besoin public ou privé forge et nourrit : en sont d'autant moins belles et généreuses, et d'autant moins amitiés, qu'elles mêlent autre cause et but et fruit en l'amitié qu'elle-même. Ni ces quatre espèces anciennes : naturelle, sociale, hospitalière, vénérienne, particulièrement n'y conviennent, ni conjointement.
    DE L’AMITIÉ
    1. Considérant la conduite de la besogne d’un peintre, que j’ai, il m’a pris envie de l’ensuivre. Il choisit le plus bel endroit et milieu de chaque paroi, pour y loger un tableau élaboré de toute sa suffisance : Et le vide tout autour, il le remplit de crotesques, qui sont peintures fantasques, n’ayant grâce qu’en la variété et étrangeté. Que sont-ce ici aussi à la vérité que crotesques et corps monstrueux, rapiécés de divers membres, sans certaine figure, n’ayant ordre, suite, ni proportion que fortuite ? «Une femme belle de buste s’achève en poisson».
    2. Je vais bien jusques à ce second point, avec mon peintre : mais je demeure court en l’autre, et meilleure partie : Car ma suffisance ne va pas si avant, que d’oser entreprendre un tableau riche, poli et formé selon l’art. Je me suis avisé d’en emprunter un d’Estienne de la Boétie, qui honorera tout le reste de cette besogne. C’est un discours auquel il donna nom. La Servitude volontaire : Mais ceux qui l’ont ignoré, l’ont bien proprement depuis rebaptisé, Le Contre un. Il l’écrivit par manière d’essai, en sa première jeunesse, à l’honneur de la liberté contre les tyrans. Il court piéça ès mains des gens d’entendement, non sans bien grande et méritée recommandation : car il est gentil, et plein ce qu’il est possible. Si y a-il bien à dire, que ce ne soit le mieux qu’il pût faire : et si en l’âge que je l’ai connu plus avancé, il eût pris un tel dessein que le mien, de mettre par écrit ses fantaisies, nous verrions plusieurs choses rares, et qui nous approcheraient bien près de l’honneur de l’antiquité : Car notamment en cette partie des dons de nature, je n’en connais point qui lui soit comparable.
    3. Mais il n’est demeuré de lui que ce discours, encore par rencontre, et crois qu’il ne le vit onques depuis qu’il lui échappa : et quelques mémoires sur cet édit de Janvier fameux par nos guerres civiles, qui trouveront encore ailleurs peut-être leur place. C’est tout ce que j’ai pu recouvrer de ses reliques, Moi, qu’il laissa d’une si amoureuse recommandation, la mort entre les dents, par son testament héritier de sa bibliothèque et de ses papiers : outre le livret de ses œuvres que j’ai fait mettre en lumière. Et si suis obligé particulièrement à cette pièce, d’autant qu’elle a servi de moyen à notre première accointance. Car elle me fut montrée longue pièce avant que je l’eusse vu, et me donna la première connaissance de son nom, acheminant ainsi cette amitié, que nous avons nourrie, tant que Dieu a voulu, entre nous, si entière et si parfaite, que certainement il ne s’en lit guère de pareilles, et entre nos hommes il ne s’en voit aucune trace en usage. Il faut tant de rencontres à la bâtir, que c’est beaucoup si la fortune y arrive une fois en trois siècles.
    4. Il n’est rien à quoi il semble que nature nous ait plus acheminé qu’à la société : et dit Aristote que les bons législateurs ont eu plus de soin de l’amitié que de la justice. Or le dernier point de sa perfection est cetui-ci. Car en général toutes celles que la volupté ou le profit : le besoin public ou privé forge et nourrit : en sont d’autant moins belles et généreuses, et d’autant moins amitiés, qu’elles mêlent autre cause et but et fruit en l’amitié qu’elle-même. Ni ces quatre espèces anciennes : naturelle, sociale, hospitalière, vénérienne, particulièrement n’y conviennent, ni conjointement.
    Et il y a une erreur sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Use of uninitialized value $string in pattern match (m//) at typographie2.pl line 95, <$do
    nnees> line 112.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( my $string =~ /[.?!] ([a-zàéèùâêîôûç])/ ) {      # si une minuscule (normale et accentuée) suit
    Mais là je donne ma langue au chat je ne suis pas bon en regex

  4. #64
    Candidat au Club
    Femme Profil pro
    Bibliothécaire
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bibliothécaire

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 3
    Points
    3
    Par défaut
    Merci dmganges ,
    Je ne suis pas sûre de vraiment saisir la différence entre $fh_sortie et $sortie ?
    Malheureusement, le résultat reste le même.
    Mon fichier texte reste vide et j'ai un message d'erreur qui se répète pour presque chaque ligne :/

  5. #65
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    $sortie c'est le nom de ton fichier, celui que tu vois lorsque tu fais dir ou ls
    $fh_sortie c'est le file handle (Poignée) ce qui permet de le manipuler (en le secouant avec la poignée)

    Il te faut bien faire les modifs partout pour que ce soit cohérent... çà ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    #======================================================================
    #  AUTEUR: Muriel Lesuisse
    #    DATE: 29/08/2016
    #  SCRIPT: typographie2.pl
    #======================================================================
     
    use strict;
    use warnings;
     
    # l'argument prend en compte un fichier texte
     
    my $fh = $ARGV[0];
    my $sortie = $fh."new"; 
     
    # j'ouvre le fichier en lecture pour lire ligne par ligne
     
    open ( my $donnees, '<:utf8', $fh )
       or die ( "Imposible d'ouvrir le fichier $fh $!" );
     
    # j'ouvre le fichier en écriture pour écrire le nouveau texte corrigé
     
    open ( my $fh_sortie, '>:utf8', $sortie) 
       or die ( "Imposible d'ouvrir le fichier $sortie $!" );
     
    # tant qu'il y a des lignes, je lis le texte
     
    while ( my $ligne = <$donnees> ) {
    # s/ = susbstitution: on substitue la partie gauche par la partie droite
    # s/ ne fonctionne qu'une fois, pour que ça fonctionne plusieurs fois : /g
     
        $ligne =~ s/ +$//g;              # supprimer l'espace en fin de ligne
        $ligne =~ s/^ +//g;              # supprimer l'espace en début de ligne
        next if $ligne =~ /^\s+$/g;      # sauter la ligne si elle ne contient que des espaces
        $ligne =~ s/\( +/\(/g;           # supprimer les espaces après la parenthèse ouvrante
        $ligne =~ s/ +\)/\)/g;           # supprimer les espaces avant la parenthèse fermante
        $ligne =~ s/\[ +/\[/g;           # supprimer les espaces après le crochet ouvrant
        $ligne =~ s/ +\]/\]/g;           # supprimer les espaces avant le crochet fermant
        $ligne =~ s/ +/ /g;              # supprimer plusieurs espaces consécutifs
        $ligne =~ s/ +\././g;            # supprimer les espaces avant le point
        $ligne =~ s/ +\,/,/g;            # supprimer les espaces avant la virgule
        $ligne =~ s/ ;/\x{A0};/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point-virgule
        $ligne =~ s/ \?/\x{A0}\?/g;      # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'interrogation
        $ligne =~ s/ !/\x{A0}!/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'exclamation
        $ligne =~ s/ :/\x{A0}:/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant deux points
        $ligne =~ s/("[^+]")/«[^+]»/g;   # transformer les guillemets
        $ligne =~ s/(')/’/g;             # transformer l'apostrophe
        $ligne =~ s/\. - \./\. — \./g;   # transformer le tiret en tiret cadratin
        $ligne =~ s/\.([^ ])/. $1/g;     # mettre une espace après le point s'il n'est pas déjà
                                         # suivi par un espace
                                         # pour éviter qu'une ligne soit "mangée", il faut mémoriser 
                                         # la lettre qu'on mange et la recopier ensuite
        $ligne =~ s/\,[^ ]/\, /g;        # mettre une espace après la virgule si elle n'est pas 
                                         # déjà suivie par un espace
        $ligne =~ s/;[^ ]/; /g;          # mettre une espace après le point-virgule s'il n'est 
                                         # pas déjà suivi par un espace
        $ligne =~ s/\?[^ ]/\? /g;        # mettre une espace après le point d'interrogation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/![^ ]/! /g;          # mettre une espace après le point d'exclamation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/:[^ ]/: /g;          # mettre une espace après les deux points s'il ne sont 
                                         # pas déjà suivis par un espace
        $ligne =~ s/[^ ];/ ;/g;          # mettre une espace avant le point-virgule s'il n'est 
                                         # pas déjà précédé par un espace
        $ligne =~ s/[^ ]\?/ \?/g;        # mettre une espace avant le point d'interrogation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]!/ !/g;          # mettre une espace avant le point d'exclamation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]:/ :/g;          # mettre une espace avant les deux points s'il ne sont 
                                         # pas déjà précédés par un espace
        $ligne =~ s/^A\$/^À\$/g;         # remplacer le A par un À avec accent
     
        #print $ligne;
     
        # mettre des locutions latines en italique
        # tableau contenant les locutions latines
        my @loc_lat = ( "ad hoc", "ad libitum", "a foritori", "a posteriori", "a priori", "bis",
                        "grosso modo", "ididem", "idem in extenso", "in extremis", "in fine",
                        "infra", "loc. cit.", "modus vivendi", "op. cit.", "passim", "quater",
                        "sic", "statu quo", "supra", "ter", "via", "vice versa"); 
     
        # boucle spécialisée dans le parcours de tableaux
        my $elem;
        foreach my $elem ( @loc_lat ) {                       # tant qu'il y a des éléments dans mon tableau
          $elem =~ s/@loc_lat/<i>@loc_lat<\/i>/g;          # je les mets en italique
        }                                                    
             # print $elem; 
     
     
        # indiquer à l'auteur qu'il faut une majuscule 
        my $minuscule;
        if ( my $string =~ /[.?!] ([a-zàéèùâêîôûç])/ ) {      # si une minuscule (normale et accentuée) suit 
                                                              # un point, un point d'interrogration ou un point
                                                              # d'exclamation
           $minuscule   = $1;                                 # $1 récupère la minuscule suivant l'espace 
                                                              # après le point, point d'interrogration ou point d'exclamation
           say ('<check type="majuscule">$minuscule</check>');# indiquer à l'auteur de vérifier 
                                                              # la majuscule
        }
        # print $minuscule;
     
        # espacer un nombre 3 par 3
        my $num           = "12345678";                       # mon numéro = 12345678
        my @tab           = split //, $num;                   # je splite mon numéro dans un tableau
        my @tab_invers    = reverse @tab;                     # j'inverse mon tableau
        my $compteur      = 0;                                # mon compteur est égal à 0
        my $nouveau_num   = "";                               # je crée une chaine de caractère vide dans laquelle je vais mettre mes chiffres
        my $nouveau_num_endroit;
        for my $chiffre (@tab_invers) {                       # tant qu'il y a des chiffres dans mon tableau inversé
            $compteur++;                                      # j'incrémente mon compteur
            $nouveau_num .= $chiffre;                         # je concatène chaque chiffre à ma chaine de caractère vide
            $nouveau_num .= "\x{A0}" if $compteur % 3 == 0;   # je concatène une espace insécable tous les 3 chiffres
            $nouveau_num_endroit = reverse $nouveau_num;      # je remets mon numéro à l'endroit
     
        }
        # print $nouveau_num_endroit, "\n";                     # j'imprime mon nouveau numéro
        print $fh_sortie $ligne;
    }
     
    # je ferme les fichiers lecture et écriture
     
    close $donnees; 
    close $fh_sortie;
    ATTENTION je lis et écris le fichier en utf8 (c'est ma marotte) Mon texte en entrée est codé utf8...

    l'erreur qui défile c'est celle de la ligne 95, la regex que je laisse aux pros...

  6. #66
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    J'ai relu le fil pour comprendre tes besoins...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        # indiquer à l'auteur qu'il faut une majuscule 
        if ( my $string =~ /[.?!] ([a-zàéèùâêîôûç])/ ) {      # si une minuscule (normale et accentuée) suit 
                                                              # un point, un point d'interrogration ou un point
                                                              # d'exclamation
           my $minuscule   = $1;                              # $1 récupère la minuscule suivant l'espace 
                                                              # après le point, point d'interrogration ou point d'exclamation
           say ("<check type="majuscule">$minuscule</check>");# indiquer à l'auteur de vérifier 
                                                              # la majuscule
        }
        print $minuscule;
    Ne fait RIEN car tu ne travailles pas sur $ligne mais sur $string que tu n'utilises pas ailleurs...
    A remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        # indiquer à l'auteur qu'il faut une majuscule 
        my $minuscule;
        #$minuscule = $1 if $string =~ /\. ([a-zàéèùâêîôûç])/;
        if ( $ligne =~ /[.?!] ([a-zàéèùâêîôûç])/ ) {          # si une minuscule (normale et accentuée) suit 
                                                              # un point, un point d'interrogration ou un point
                                                              # d'exclamation
           $minuscule   = $1;                                 # $1 récupère la minuscule suivant l'espace 
                                                              # après le point, point d'interrogration ou point d'exclamation
                                                              # indiquer à l'auteur de vérifier  la majuscule :
           print "A contrôler : $minuscule qui suit un caractère de ponctuation dans :\n$ligne\n";
     
        }

    De même que ne font RIEN pour la même raison :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        # mettre des locutions latines en italique
        # tableau contenant les locutions latines
        my @loc_lat = ( "ad hoc", "ad libitum", "a foritori", "a posteriori", "a priori", "bis",
                        "grosso modo", "ididem", "idem in extenso", "in extremis", "in fine",
                        "infra", "loc. cit.", "modus vivendi", "op. cit.", "passim", "quater",
                        "sic", "statu quo", "supra", "ter", "via", "vice versa"); 
     
        # boucle spécialisée dans le parcours de tableaux
        my $elem;
        foreach my $elem ( @loc_lat ) {                       # tant qu'il y a des éléments dans mon tableau
          $elem =~ s/@loc_lat/<i>@loc_lat<\/i>/g;          # je les mets en italique
        }                                                    
             # print $elem;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
        # espacer un nombre 3 par 3
        my $num           = "12345678";                       # mon numéro = 12345678
        my @tab           = split //, $num;                   # je splite mon numéro dans un tableau
        my @tab_invers    = reverse @tab;                     # j'inverse mon tableau
        my $compteur      = 0;                                # mon compteur est égal à 0
        my $nouveau_num   = "";                               # je crée une chaine de caractère vide dans laquelle je vais mettre mes chiffres
        my $nouveau_num_endroit;
        for my $chiffre (@tab_invers) {                       # tant qu'il y a des chiffres dans mon tableau inversé
            $compteur++;                                      # j'incrémente mon compteur
            $nouveau_num .= $chiffre;                         # je concatène chaque chiffre à ma chaine de caractère vide
            $nouveau_num .= "\x{A0}" if $compteur % 3 == 0;   # je concatène une espace insécable tous les 3 chiffres
            $nouveau_num_endroit = reverse $nouveau_num;      # je remets mon numéro à l'endroit
     
        }
        # print $nouveau_num_endroit, "\n";                     # j'imprime mon nouveau numéro
    Je n'ai pas touché à ces fonctions.

    J'ai fait qq modifs pour avoir un résultat cohérent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    #======================================================================
    #  AUTEUR: Muriel Lesuisse
    #    DATE: 29/08/2016
    #  SCRIPT: typographie2.pl
    #======================================================================
     
    use strict;
    use warnings;
    use utf8;
     
    # Pour avoir les accents dans l'invite de commande (Console/Terminal)
    ActiverAccents();
     
    # l'argument prend en compte un fichier texte
     
    my $entree = $ARGV[0];
    my $sortie = $entree."new";
    my ($fh_entree, $fh_sortie ) = ();
     
    # j'ouvre le fichier en lecture pour lire ligne par ligne
     
    open ( $fh_entree, '<:utf8', $entree )
       or die ( "Imposible d'ouvrir le fichier $entree $!" );
     
    # j'ouvre le fichier en écriture pour écrire le nouveau texte corrigé
     
    open ( $fh_sortie, '>:utf8', $sortie ) 
       or die ( "Imposible d'ouvrir le fichier $sortie $!" );
     
    # tant qu'il y a des lignes, je lis le texte
     
    while ( my $ligne = <$fh_entree> ) {
    # s/ = susbstitution: on substitue la partie gauche par la partie droite
    # s/ ne fonctionne qu'une fois, pour que ça fonctionne plusieurs fois : /g
     
        next if $ligne =~ /^\s+$/g;      # sauter la ligne si elle ne contient que des espaces
        $ligne =~ s/ +$//g;              # supprimer l'espace en fin de ligne
        $ligne =~ s/^ +//g;              # supprimer l'espace en début de ligne
        $ligne =~ s/\( +/\(/g;           # supprimer les espaces après la parenthèse ouvrante
        $ligne =~ s/ +\)/\)/g;           # supprimer les espaces avant la parenthèse fermante
        $ligne =~ s/\[ +/\[/g;           # supprimer les espaces après le crochet ouvrant
        $ligne =~ s/ +\]/\]/g;           # supprimer les espaces avant le crochet fermant
        $ligne =~ s/ +/ /g;              # supprimer plusieurs espaces consécutifs
        $ligne =~ s/ +\././g;            # supprimer les espaces avant le point
        $ligne =~ s/ +\,/,/g;            # supprimer les espaces avant la virgule
        $ligne =~ s/ ;/\x{A0};/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point-virgule
        $ligne =~ s/ \?/\x{A0}\?/g;      # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'interrogation
        $ligne =~ s/ !/\x{A0}!/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'exclamation
        $ligne =~ s/ :/\x{A0}:/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant deux points
        $ligne =~ s/("[^+]")/«[^+]»/g;   # transformer les guillemets
    #    $ligne =~ s/(')/’/g;             # transformer l'apostrophe
        $ligne =~ s/\. - \./\. — \./g;   # transformer le tiret en tiret cadratin
        $ligne =~ s/\.([^ ])/. $1/g;     # mettre une espace après le point s'il n'est pas déjà
                                         # suivi par un espace
                                         # pour éviter qu'une ligne soit "mangée", il faut mémoriser 
                                         # la lettre qu'on mange et la recopier ensuite
        $ligne =~ s/\,[^ ]/\, /g;        # mettre une espace après la virgule si elle n'est pas 
                                         # déjà suivie par un espace
        $ligne =~ s/;[^ ]/; /g;          # mettre une espace après le point-virgule s'il n'est 
                                         # pas déjà suivi par un espace
        $ligne =~ s/\?[^ ]/\? /g;        # mettre une espace après le point d'interrogation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/![^ ]/! /g;          # mettre une espace après le point d'exclamation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/:[^ ]/: /g;          # mettre une espace après les deux points s'il ne sont 
                                         # pas déjà suivis par un espace
        $ligne =~ s/[^ ];/ ;/g;          # mettre une espace avant le point-virgule s'il n'est 
                                         # pas déjà précédé par un espace
        $ligne =~ s/[^ ]\?/ \?/g;        # mettre une espace avant le point d'interrogation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]!/ !/g;          # mettre une espace avant le point d'exclamation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]:/ :/g;          # mettre une espace avant les deux points s'il ne sont 
                                         # pas déjà précédés par un espace
        $ligne =~ s/^A\$/^À\$/g;         # remplacer le A par un À avec accent
     
        #print $ligne;
     
        # mettre des locutions latines en italique
        # tableau contenant les locutions latines
        my @loc_lat = ( "ad hoc", "ad libitum", "a foritori", "a posteriori", "a priori", "bis",
                        "grosso modo", "ididem", "idem in extenso", "in extremis", "in fine",
                        "infra", "loc. cit.", "modus vivendi", "op. cit.", "passim", "quater",
                        "sic", "statu quo", "supra", "ter", "via", "vice versa"); 
     
        # boucle spécialisée dans le parcours de tableaux
        my $elem;
        foreach my $elem ( @loc_lat ) {                       # tant qu'il y a des éléments dans mon tableau
          $elem =~ s/@loc_lat/<i>@loc_lat<\/i>/g;          # je les mets en italique
        }                                                    
             # print $elem; 
     
     
        # indiquer à l'auteur qu'il faut une majuscule 
        my $minuscule;
        #$minuscule = $1 if $string =~ /\. ([a-zàéèùâêîôûç])/;
        if ( $ligne =~ /[.?!] ([a-zàéèùâêîôûç])/ ) {          # si une minuscule (normale et accentuée) suit 
                                                              # un point, un point d'interrogration ou un point
                                                              # d'exclamation
           $minuscule   = $1;                                 # $1 récupère la minuscule suivant l'espace 
                                                              # après le point, point d'interrogration ou point d'exclamation
                                                              # indiquer à l'auteur de vérifier  la majuscule :
           print "A contrôler : $minuscule qui suit un caractère de ponctuation dans :\n$ligne\n";
     
        }
     
     
        # espacer un nombre 3 par 3
        my $num           = "12345678";                       # mon numéro = 12345678
        my @tab           = split //, $num;                   # je splite mon numéro dans un tableau
        my @tab_invers    = reverse @tab;                     # j'inverse mon tableau
        my $compteur      = 0;                                # mon compteur est égal à 0
        my $nouveau_num   = "";                               # je crée une chaine de caractère vide dans laquelle je vais mettre mes chiffres
        my $nouveau_num_endroit;
        for my $chiffre (@tab_invers) {                       # tant qu'il y a des chiffres dans mon tableau inversé
            $compteur++;                                      # j'incrémente mon compteur
            $nouveau_num .= $chiffre;                         # je concatène chaque chiffre à ma chaine de caractère vide
            $nouveau_num .= "\x{A0}" if $compteur % 3 == 0;   # je concatène une espace insécable tous les 3 chiffres
            $nouveau_num_endroit = reverse $nouveau_num;      # je remets mon numéro à l'endroit
     
        }
        # print $nouveau_num_endroit, "\n";                     # j'imprime mon nouveau numéro
        print $fh_sortie $ligne;
    }
     
    # je ferme les fichiers lecture et écriture
     
    close $fh_entree;
    close $fh_sortie;
     
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccents {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89

    qq explications :

    C'est pour que les modifs effectuées à l'intérieur du code soient réalisées en utf8
    Ainsi l'entrée, la sortie et les modifs sont toutes en utf8, histoire d'être cohérent...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # Pour avoir les accents dans l'invite de commande (Console/Terminal)
    ActiverAccents();
    Ça dit ce que ça fait, la fonction est dans la FAQ Perl de Developpez


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    my $entree = $ARGV[0];
    my $sortie = $entree."new";
    my ($fh_entree, $fh_sortie ) = ();
     
    # j'ouvre le fichier en lecture pour lire ligne par ligne
     
    open ( $fh_entree, '<:utf8', $entree )
       or die ( "Imposible d'ouvrir le fichier $entree $!" );
     
    # j'ouvre le fichier en écriture pour écrire le nouveau texte corrigé
     
    open ( $fh_sortie, '>:utf8', $sortie ) 
       or die ( "Imposible d'ouvrir le fichier $sortie $!" );
     
    # tant qu'il y a des lignes, je lis le texte
     
    while ( my $ligne = <$fh_entree> ) {
    Pour que ça soit plus clair !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #    $ligne =~ s/(')/’/g;             # transformer l'apostrophe
    J'ai mis en commentaire, car l'invite de commande DOS ne connaît pas l'apostrophe mais seulement la simple quote ce qui génère un Warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "\x{2019}" does not map to cp437 at typographie2.pl line 107, <$fh_entree> line 95.
    Mais c'est juste un warning...

    A l'exécution c'est cohérent sur mon petit texte :
    E:\_DEV\Developpez\Emycherie02>
    E:\_DEV\Developpez\Emycherie02>perl typographie2.pl Amitie.txt
    A contrôler : e qui suit un caractère de ponctuation dans :
    «Quel est en effet cet amour de l'amitié ? et pourquoi n'y a-t-il personne pour aimer un a
    dolescent hideux, ou un beau vieillard ? .

    A contrôler : a qui suit un caractère de ponctuation dans :
    18. Quand Lælius en présence des Consuls Romains, lesquels après la condamnation de Tiberi
    us Grac-chus, poursuivaient tous ceux, qui avaient été de son intelligence, vint à s'enqué
    rir de Caius Blosius (qui était le principal de ses amis) combien il eût voulu faire pour
    lui : et qu'il eut répondu, toutes choses. Comment toutes choses, suivit-il, et quoi s'il
    t'eût commandé de mettre le feu en nos temples ? Il ne me l'eût jamais commandé, répliqua
    Blosius. Mais s'il l'eût fait ? ajouta Lælius : J'y eusse obéi, répondit-il. S'il était si
    parfaitement ami de Gracchus, comme disent les histoires, il n'avait que faire d'offenser
    les consuls par cette dernière et hardie confession, Et ne se devait départir de l'assura
    nce qu'il avait de la volonté de Gracchus.

    A contrôler : j qui suit un caractère de ponctuation dans :
    34. je ne fais que traîner languissant : Et les plaisirs même qui s'offrent à moi, au lieu
    de me consoler me redoublent le regret de sa perte. Nous étions à moitié de tout : il me
    semble que je lui dérobe sa part,
    l'amitié ? et pourquoi
    EN 18 :
    Mais s'il l'eût fait ? ajouta Lælius
    EN 34 :
    34. je ne fais
    Je te laisse continuer...

  7. #67
    Candidat au Club
    Femme Profil pro
    Bibliothécaire
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bibliothécaire

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 3
    Points
    3
    Par défaut
    Merci pour toutes ces explications.
    Je me replonge dedans...

  8. #68
    Candidat au Club
    Femme Profil pro
    Bibliothécaire
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bibliothécaire

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 3
    Points
    3
    Par défaut
    dmganges
    print "A contrôler : $minuscule qui suit un caractère de ponctuation dans :\n$ligne\n";

    serait-il possible que ça s'affiche dans le texte et pas dans l'invite de commande ?

  9. #69
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    oui bien sûr mais comme tu n'as pas spécifié ce qu'il t'es demandé...

    j'avais l'intention de te suggérer d'ouvrir un autre fichier en sortie dans lequel on écrirait les demandes à faire à l'auteur...

    A mon avis il n'est pas pertinent d'à la fois faire :
    - des modifs de façon impératives dans son texte, même minimes pour des raisons typographiques
    - et des propositions de correction...
    Car dans son texte il peut citer un auteur qui n'a résolument pas mis de majuscule après un point, par exemple... (Cas de Montaigne qui cite un auteur ancien...)

    Mais c'est toi qui pilote !

    donc lorsque tu fais :
    sans spécifier de handle de fichier, Perl écrit par défaut dans l'invite de commande

    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $fh_sortie $ligne;
    là il écrit dans le fichier correspondant ouvert en écriture...

    Généralement on fait des print dans l'invite de commande à l'attention de la personne qui lance le programme, pour l'informer d'une anomalie sur l'ouverture d'un fichier par exemple... afin qu'elle puisse corriger dessuite...

    Pour le reste on l'écrit dans un fichier, correctement formaté...


    A ce sujet j'ai eu l'impression qu'on te demandait de formater le document de sortie comme s'il devait être visionné dans un navigateur... avec des balises html :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    say ("<check type="majuscule">$minuscule</check>");
    Non seulement la syntaxe du say n'est pas correcte (erreur de compilation), mais là on écrit dans l'invite de commande !!!

    perso je préfère de loin formater correctement et utiliser print...

    Donne-nous le maximum d'info sur ce que tu dois faire !
    Perso je suis un très mauvais devin, la lecture dans les entrailles de canard ce n'est pas mon fort !
    Hors mis si c'est dans un foie gras

  10. #70
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Tu le sauvegardes sous un autre nom et tu vois si ça correspond mieux à ce que tu désires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    #======================================================================
    #  AUTEUR: Muriel Lesuisse
    #    DATE: 29/08/2016
    #  SCRIPT: typographie2.pl
    #======================================================================
     
    use strict;
    use warnings;
    use utf8;
     
    # Pour avoir les accents dans l'invite de commande (Console/Terminal)
    ActiverAccents();
     
    # l'argument prend en compte un fichier texte
     
    my $entree = $ARGV[0];
    my $sortie = $entree."new";
    my $avertissements = 'avertissements.txt';
     
    my ($fh_entree, $fh_sortie, $fh_avert ) = ();
     
    # j'ouvre le fichier en lecture pour lire ligne par ligne
     
    open ( $fh_entree, '<:utf8', $entree )
       or die ( "Imposible d'ouvrir le fichier $entree $!" );
     
    # j'ouvre le fichier en écriture pour écrire le nouveau texte corrigé
     
    open ( $fh_sortie, '>:utf8', $sortie ) 
       or die ( "Imposible d'ouvrir le fichier $sortie $!" );
     
    open ( $fh_avert, '>:utf8', $avertissements ) 
       or die ( "Imposible d'ouvrir le fichier $avertissements $!" );
     
     
     
    # tant qu'il y a des lignes, je lis le texte
     
    while ( my $ligne = <$fh_entree> ) {
    # s/ = susbstitution: on substitue la partie gauche par la partie droite
    # s/ ne fonctionne qu'une fois, pour que ça fonctionne plusieurs fois : /g
     
        next if $ligne =~ /^\s+$/g;      # sauter la ligne si elle ne contient que des espaces
        $ligne =~ s/ +$//g;              # supprimer l'espace en fin de ligne
        $ligne =~ s/^ +//g;              # supprimer l'espace en début de ligne
        $ligne =~ s/\( +/\(/g;           # supprimer les espaces après la parenthèse ouvrante
        $ligne =~ s/ +\)/\)/g;           # supprimer les espaces avant la parenthèse fermante
        $ligne =~ s/\[ +/\[/g;           # supprimer les espaces après le crochet ouvrant
        $ligne =~ s/ +\]/\]/g;           # supprimer les espaces avant le crochet fermant
        $ligne =~ s/ +/ /g;              # supprimer plusieurs espaces consécutifs
        $ligne =~ s/ +\././g;            # supprimer les espaces avant le point
        $ligne =~ s/ +\,/,/g;            # supprimer les espaces avant la virgule
        $ligne =~ s/ ;/\x{A0};/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point-virgule
        $ligne =~ s/ \?/\x{A0}\?/g;      # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'interrogation
        $ligne =~ s/ !/\x{A0}!/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'exclamation
        $ligne =~ s/ :/\x{A0}:/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant deux points
        $ligne =~ s/("[^+]")/«[^+]»/g;   # transformer les guillemets
        $ligne =~ s/(')/’/g;             # transformer l'apostrophe
        $ligne =~ s/\. - \./\. — \./g;   # transformer le tiret en tiret cadratin
        $ligne =~ s/\.([^ ])/. $1/g;     # mettre une espace après le point s'il n'est pas déjà
                                         # suivi par un espace
                                         # pour éviter qu'une ligne soit "mangée", il faut mémoriser 
                                         # la lettre qu'on mange et la recopier ensuite
        $ligne =~ s/\,[^ ]/\, /g;        # mettre une espace après la virgule si elle n'est pas 
                                         # déjà suivie par un espace
        $ligne =~ s/;[^ ]/; /g;          # mettre une espace après le point-virgule s'il n'est 
                                         # pas déjà suivi par un espace
        $ligne =~ s/\?[^ ]/\? /g;        # mettre une espace après le point d'interrogation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/![^ ]/! /g;          # mettre une espace après le point d'exclamation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/:[^ ]/: /g;          # mettre une espace après les deux points s'il ne sont 
                                         # pas déjà suivis par un espace
        $ligne =~ s/[^ ];/ ;/g;          # mettre une espace avant le point-virgule s'il n'est 
                                         # pas déjà précédé par un espace
        $ligne =~ s/[^ ]\?/ \?/g;        # mettre une espace avant le point d'interrogation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]!/ !/g;          # mettre une espace avant le point d'exclamation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]:/ :/g;          # mettre une espace avant les deux points s'il ne sont 
                                         # pas déjà précédés par un espace
        $ligne =~ s/^A\$/^À\$/g;         # remplacer le A par un À avec accent
     
        #print $ligne;
     
        # mettre des locutions latines en italique
        # tableau contenant les locutions latines
        my @loc_lat = ( "ad hoc", "ad libitum", "a foritori", "a posteriori", "a priori", "bis",
                        "grosso modo", "ididem", "idem in extenso", "in extremis", "in fine",
                        "infra", "loc. cit.", "modus vivendi", "op. cit.", "passim", "quater",
                        "sic", "statu quo", "supra", "ter", "via", "vice versa"); 
     
        # boucle spécialisée dans le parcours de tableaux
        my $elem;
        foreach my $elem ( @loc_lat ) {                       # tant qu'il y a des éléments dans mon tableau
          $elem =~ s/@loc_lat/<i>@loc_lat<\/i>/g;          # je les mets en italique
        }                                                    
             # print $elem; 
     
     
        # indiquer à l'auteur qu'il faut une majuscule 
        my $minuscule;
        #$minuscule = $1 if $string =~ /\. ([a-zàéèùâêîôûç])/;
     
        my $Pattern = '[.?!] ([a-zàéèùâêîôûç])';
        $Pattern =~ s/ /\\ /go;
        my @Array = ($ligne =~ m/(\b.{0,10}$Pattern.{0,10}\b)/gx);
        if (@Array) {
        	print $fh_sortie "$ligne";
        	foreach my $Minuscule (@Array) {
        		print $fh_sortie "\n$Minuscule ==> MAJUSCULE ?";
        	}
        	print $fh_sortie "\n\n";
        }
     
    =pod    
        if ( $ligne =~ /[.?!] ([a-zàéèùâêîôûç])/ ) {          # si une minuscule (normale et accentuée) suit 
                                                              # un point, un point d'interrogration ou un point
                                                              # d'exclamation
           $minuscule   = $1;                                 # $1 récupère la minuscule suivant l'espace 
                                                              # après le point, point d'interrogration ou point d'exclamation
                                                              # indiquer à l'auteur de vérifier  la majuscule :
         #  print $fh_avert "A contrôler : $minuscule qui suit un caractère de ponctuation dans :\n$ligne\n";
           print $fh_avert '<check type="majuscule">'. $minuscule ."</check>\n\n";
                                                              
        }
    =cut
     
        # espacer un nombre 3 par 3
        my $num           = "12345678";                       # mon numéro = 12345678
        my @tab           = split //, $num;                   # je splite mon numéro dans un tableau
        my @tab_invers    = reverse @tab;                     # j'inverse mon tableau
        my $compteur      = 0;                                # mon compteur est égal à 0
        my $nouveau_num   = "";                               # je crée une chaine de caractère vide dans laquelle je vais mettre mes chiffres
        my $nouveau_num_endroit;
        for my $chiffre (@tab_invers) {                       # tant qu'il y a des chiffres dans mon tableau inversé
            $compteur++;                                      # j'incrémente mon compteur
            $nouveau_num .= $chiffre;                         # je concatène chaque chiffre à ma chaine de caractère vide
            $nouveau_num .= "\x{A0}" if $compteur % 3 == 0;   # je concatène une espace insécable tous les 3 chiffres
            $nouveau_num_endroit = reverse $nouveau_num;      # je remets mon numéro à l'endroit
     
        }
        # print $nouveau_num_endroit, "\n";                     # j'imprime mon nouveau numéro
        print $fh_sortie $ligne;
    }
     
    # je ferme les fichiers lecture et écriture
     
    close $fh_entree;
    close $fh_sortie;
    close $fh_avert;
     
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccents {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89
    Du coup je n'ai rien écrit dans le fichier avertissements
    Tout va dans le fichier de sortie

    explication de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $Pattern = '[.?!] ([a-zàéèùâêîôûç])';
        $Pattern =~ s/ /\\ /go;
        my @Array = ($ligne =~ m/(\b.{0,10}$Pattern.{0,10}\b)/gx);
        if (@Array) {
        	print $fh_sortie "$ligne";
        	foreach my $Minuscule (@Array) {
        		print $fh_sortie "\n$Minuscule ==> MAJUSCULE ?";
        	}
        	print $fh_sortie "\n\n";
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @Array = ($ligne =~ m/(\b.{0,10}$Pattern.{0,10}\b)/gx);
    permet de sélectionner quelques caractères (ici entre 0 et 10 et si possible couper à la frontière d'un mot \b
    afin de cerner plus facilement les texte en question qui donne :
    DE L’AMITIÉ
    1. Considérant la conduite de la besogne d’un peintre, que j’ai, il m’a pris envie de l’ensuivre. Il choisit le plus bel endroit et milieu de chaque paroi, pour y loger un tableau élaboré de toute sa suffisance : Et le vide tout autour, il le remplit de crotesques, qui sont peintures fantasques, n’ayant grâce qu’en la variété et étrangeté. Que sont-ce ici aussi à la vérité que crotesques et corps monstrueux, rapiécés de divers membres, sans certaine figure, n’ayant ordre, suite, ni proportion que fortuite ? «Une femme belle de buste s’achève en poisson».
    2. Je vais bien jusques à ce second point, avec mon peintre : mais je demeure court en l’autre, et meilleure partie : Car ma suffisance ne va pas si avant, que d’oser entreprendre un tableau riche, poli et formé selon l’art. Je me suis avisé d’en emprunter un d’Estienne de la Boétie, qui honorera tout le reste de cette besogne. C’est un discours auquel il donna nom. La Servitude volontaire : Mais ceux qui l’ont ignoré, l’ont bien proprement depuis rebaptisé, Le Contre un. Il l’écrivit par manière d’essai, en sa première jeunesse, à l’honneur de la liberté contre les tyrans. Il court piéça ès mains des gens d’entendement, non sans bien grande et méritée recommandation : car il est gentil, et plein ce qu’il est possible. Si y a-il bien à dire, que ce ne soit le mieux qu’il pût faire : et si en l’âge que je l’ai connu plus avancé, il eût pris un tel dessein que le mien, de mettre par écrit ses fantaisies, nous verrions plusieurs choses rares, et qui nous approcheraient bien près de l’honneur de l’antiquité : Car notamment en cette partie des dons de nature, je n’en connais point qui lui soit comparable.
    3. Mais il n’est demeuré de lui que ce discours, encore par rencontre, et crois qu’il ne le vit onques depuis qu’il lui échappa : et quelques mémoires sur cet édit de Janvier fameux par nos guerres civiles, qui trouveront encore ailleurs peut-être leur place. C’est tout ce que j’ai pu recouvrer de ses reliques, Moi, qu’il laissa d’une si amoureuse recommandation, la mort entre les dents, par son testament héritier de sa bibliothèque et de ses papiers : outre le livret de ses œuvres que j’ai fait mettre en lumière. Et si suis obligé particulièrement à cette pièce, d’autant qu’elle a servi de moyen à notre première accointance. Car elle me fut montrée longue pièce avant que je l’eusse vu, et me donna la première connaissance de son nom, acheminant ainsi cette amitié, que nous avons nourrie, tant que Dieu a voulu, entre nous, si entière et si parfaite, que certainement il ne s’en lit guère de pareilles, et entre nos hommes il ne s’en voit aucune trace en usage. Il faut tant de rencontres à la bâtir, que c’est beaucoup si la fortune y arrive une fois en trois siècles.
    4. Il n’est rien à quoi il semble que nature nous ait plus acheminé qu’à la société : et dit Aristote que les bons législateurs ont eu plus de soin de l’amitié que de la justice. Or le dernier point de sa perfection est cetui-ci. Car en général toutes celles que la volupté ou le profit : le besoin public ou privé forge et nourrit : en sont d’autant moins belles et généreuses, et d’autant moins amitiés, qu’elles mêlent autre cause et but et fruit en l’amitié qu’elle-même. Ni ces quatre espèces anciennes : naturelle, sociale, hospitalière, vénérienne, particulièrement n’y conviennent, ni conjointement.
    5. Des enfants aux pères, c’est plutôt respect. L’amitié se nourrit de communication, qui ne peut se trouver entre eux, pour la trop grande disparité, et offenserait à l’aventure les devoirs de nature : Car ni toutes les secrètes pensées des pères ne se peuvent communiquer aux enfants, pour n’y engendrer une messéante privauté : ni les avertissements et corrections, qui est un des premiers offices d’amitié, ne se pourraient exercer des enfants aux pères. Il s’est trouvé des nations, où par usage les enfants tuaient leurs pères : et d’autres, où les pères tuaient leurs enfants, pour éviter l’empêchement qu’ils se peuvent quelquefois entreporter, et naturellement l’un dépend de la ruine de l’autre : Il s’est trouvé des philosophes dédaignant cette couture naturelle : témoin Aristippus : quand on le pressait de l’affection qu’il devait à ses enfants pour être sortis de lui, il se mit à cracher : disant que cela en était aussi bien sorti : que nous engendrions bien des poux et des vers. Et cet autre que Plutarque voulait induire à s’accorder avec son frère. Je n’en fais pas, dit-il, plus grand état, pour être sorti de même trou.
    6. C’est à la vérité un beau nom, et plein de dilection que le nom de frère, et à cette cause en fîmes-nous lui et moi notre alliance : Mais ce mélange de biens, ces partages, et que la richesse de l’un soit la pauvreté de l’autre, cela détrempe merveilleusement et relâche cette soudure fraternelle : Les frères ayant à conduire le progrès de leur avancement, en même sentier et même train, il est force qu’ils se heurtent et choquent souvent. Davantage, la correspondance et relation qui engendre ces vraies et parfaites amitiés, pourquoi se trouvera-t-elle en ceux-ci ? Le père et le fils peuvent être de complexion entièrement éloignée, et les frères aussi : C’est mon fils, c’est mon parent : mais c’est un homme farouche, un méchant, ou un sot.
    7. Et puis, à mesure que ce sont amitiés que la loi et l’obligation naturelle nous commande, il y a d’autant moins de notre choix et liberté volontaire : Et notre liberté volontaire n’a point de production qui soit plus proprement sienne, que celle de l’affection et amitié. Ce n’est pas que je n’aie essayé de ce côté-là, tout ce qui en peut être, Ayant eu le meilleur père qui fut onques, et le plus indulgent, jusques à son extrême vieillesse, et étant d’une famille fameuse de père en fils, et exemplaire en cette partie de la concorde fraternelle, «et étant moi-même connu pour l’affection paternelle que j’éprouve à l’égard de mes frères».
    8. D’y comparer l’affection envers les femmes, quoiqu’elle naisse de notre choix, on ne peut, ni la loger en ce rôle. Son feu, je le confesse, «et en effet elle ne nous est pas inconnue, la déesse qui aux soucis mélange une douce amertume», est plus actif, plus cuisant, et plus âpre. Mais c’est un feu téméraire et volage, ondoyant et divers, feu de fièvre, sujet à accès et remises, et qui ne nous tient qu’à un coin. En l’amitié, c’est une chaleur générale et universelle, tempérée au demeurant et égale, une chaleur constante et rassise, toute douceur et polissure, qui n’a rien d’âpre et de poignant.
    9. Qui plus est en l’amour ce n’est qu’un désir forcené après ce qui nous fuit, «Comme le chasseur suit le lièvre dans le froid, dans la chaleur, sur la montagne, sur le rivage, mais n’en fait plus cas dès qu’il est pris, et ne presse le pas qu’à la poursuite de ce qui s’enfuit. ».
    10. Aussitôt qu’il entre aux termes de l’amitié, c’est-à-dire en la convenance des volontés, il s’évanouit et s’alanguit : La jouissance le perd, comme ayant la fin corporelle et sujette à satiété. L’amitié au rebours, est jouie à mesure qu’elle est désirée, ne s’élève, se nourrit, ni ne prend accroissance qu’en la jouissance, comme étant spirituelle, et l’âme s’affinant par l’usage. Sous cette parfaite amitié, ces affections volages ont autrefois trouvé place chez moi, afin que je ne parle de lui, qui n’en confesse que trop par ces vers. Ainsi ces deux passions sont entrées chez moi en connaissance l’une de l’autre, mais en comparaison jamais : La première maintenant sa route d’un vol hautain et superbe, et regardant dédaigneusement cette-ci passer ses pointes bien loin au-dessous d’elle.
    11. Quant aux mariages, outre ce que c’est un marché qui n’a que l’entrée libre, sa durée étant contrainte et forcée, dépendant d’ailleurs que de notre vouloir : Et marché, qui ordinairement se fait à autres fins : il y survient mille fusées étrangères à démêler parmi, suffisantes à rompre le fil et troubler le cours d’une vive affection : Là où en l’amitié, il n’y a affaire ni commerce que d’elle-même. Joint qu’à dire vrai la suffisance ordinaire des femmes, n’est pas pour répondre à cette conférence et communication, nourrice de cette sainte couture : Ni leur âme ne semble assez ferme pour soutenir l’étreinte d’un nœud si pressé, et si durable. Et certes sans cela, s’il se pouvait dresser une telle accointance libre et volontaire, où non seulement les âmes eussent cette entière jouissance, mais encore où les corps eussent part à l’alliance, où l’homme fût engagé tout entier : il est certain que l’amitié en serait plus pleine et plus comble. Mais ce sexe par nul exemple n’y est encore pu arriver, et par le commun consentement des écoles anciennes en est rejeté.
    12. Et cette autre licence Grecque est justement abhorrée par nos mœurs. Laquelle pourtant, pour avoir selon leur usage une si nécessaire disparité d’âges et différences d’offices entre les amants, ne répondait non plus assez à la parfaite union et convenance qu’ici nous demandons.
    «Quel est en effet cet amour de l’amitié ? et pourquoi n’y a-t-il personne pour aimer un adolescent hideux, ou un beau vieillard ? .

    l’amitié ? et pourquoi ==> MAJUSCULE ?
    e ==> MAJUSCULE ?

    «Quel est en effet cet amour de l’amitié ? et pourquoi n’y a-t-il personne pour aimer un adolescent hideux, ou un beau vieillard ? .
    Car la peinture même qu’en fait l’Académie ne me désavouera pas, comme je pense, de dire ainsi de sa part. Que cette première fureur inspirée par le fils de Vénus au cœur de l’amant sur l’objet de la fleur d’une tendre jeunesse, à laquelle ils permettent tous les insolents et passionnés efforts que peut produire une ardeur immodérée : était simplement fondée en une beauté externe : fausse image de la génération corporelle. Car en l’esprit elle ne pouvait. Duquel la montre était encore cachée : qui n’était qu’en sa naissance et avant l’âge de germer.
    13. Que si cette fureur saisissait un bas courage : les moyens de sa poursuite c’étaient richesses, présents, faveur à l’avancement des dignités, et telle autre basse marchandise qu’ils réprouvent. Si elle tombait en un courage plus généreux : les entremises étaient généreuses de même. Instructions philosophiques, Enseignements à révérer la religion, obéir aux lois, mourir pour le bien de son pays, Exemples de vaillance, prudence, justice. S’étudiant l’amant de se rendre acceptable par la bonne grâce et beauté de son âme : celle de son corps étant piéça fanée. Et espérant par cette société mentale établir un marché plus ferme et durable. Quand cette poursuite arrivait à l’effet, en sa saison : car ce qu’ils ne requièrent point en l’amant, qu’il apportât loisir et discrétion en son entreprise, ils le requièrent exactement en l’aimé : d’autant qu’il lui fallait juger d’une beauté interne : de difficile connaissance et abstruse découverte. Lors naissait en l’aimé le désir d’une conception spirituelle par l’entremise d’une spirituelle beauté. Cette-ci était ici principale : la corporelle accidentelle et seconde. Tout le rebours de l’amant.
    14. À cette cause préfèrent-ils l’aimé : et vérifient que les dieux aussi le préfèrent. Et tancent grandement le poète Æschilus d’avoir, en l’amour d’Achilles et de Patroclus donné la part de l’amant à Achilles : qui était en la première et imberbe verdeur de son adolescence : et le plus beau des Grecs. Après cette communauté générale : la maîtresse et plus digne partie d’icelle exerçant ses offices et prédominant : ils disent qu’il en provenait des fruits très utiles au privé et au public. Que c’était la force des pays qui en recevaient l’usage : et la principale défense de l’équité et de la liberté. Témoin les salutaires amours de Hermodius et d’Aristogiton. Pourtant la nomment-ils sacrée et divine. Et n’est à leur compte que la violence des tyrans et lâcheté des peuples qui lui soit adversaire. Enfin tout ce qu’on peut donner à la faveur de l’Académie, c’est dire que c’était un amour se terminant en amitié. Chose qui ne se rapporte pas mal à la définition Stoïque de l’amour.
    «L’amour est un effort pour fonder une amitié à partir de la vue de la beauté».
    15. Je reviens à ma description de façon plus équitable et plus équable.
    «Pour tout dire, on doit juger des amitiés une fois que les caractères et les âges sont parvenus à maturité et se sont affermis».
    Au demeurant, ce que nous appelons ordinairement amis et amitiés, ce ne sont qu’accointances et familiarités nouées par quelque occasion ou commodité, par le moyen de laquelle nos âmes s’entretiennent. En l’amitié, de quoi je parle, elles se mêlent et confondent l’une en l’autre, d’un mélange si universel, qu’elles effacent, et ne retrouvent plus la couture qui les a jointes. Si on me presse de dire pourquoi je l’aimais, je sens que cela ne se peut exprimer qu’en répondant : Parce que c’était lu : parce que c’était moi.
    16. Il y a au-delà de tout mon discours, et de ce que j’en puis dire particulièrement, ne sais quelle force inexplicable et fatale médiatrice de cette union. Nous nous cherchions avant que de nous être vus, et par des rapports que nous oyions l’un de l’autr : qui faisaient en notre affection plus d’effort que ne porte la raison des rapports : je crois par quelque ordonnance du ciel : nous nous embrassions par nos noms. Et à notre première rencontre qui fut par hasard en une grande fête et compagnie de ville, nous nous trouvâmes si pris, si connus, si obligés entre nous, que rien dès lors ne nous fut si proche que l’un à l’autre.
    17. Il écrivit une Satire Latine excellente qui est publiée, par laquelle il excuse et explique la précipitation de notre intelligence si promptement parvenue à sa perfection. Ayant si peu à durer : et ayant si tard commencé : car nous étions tous deux hommes faits, et lui plus de quelque année : elle n’avait point à perdre temps. Et n’avait à se régler au patron des amitiés molles et régulières, auxquelles il faut tant de précautions de longue et préalable conversation. Cette-ci n’a point d’autre idée que d’elle-même et ne se peut rapporter qu’à soi. Ce n’est pas une spéciale considération, ni deux, ni trois, ni quatre, ni mille : c’est je ne sais quelle quintessence de tout ce mélange, qui ayant saisi toute ma volonté, l’amena se plonger et se perdre dans la sienne, qui ayant saisi toute sa volonté, l’amena se plonger et se perdre en la mienne : d’une faim, d’une concurrence pareille. Je dis perdre à la vérité, ne nous réservant rien qui nous fût propre, ni qui fût ou sien ou mien.
    18. Quand Lælius en présence des Consuls Romains, lesquels après la condamnation de Tiberius Grac-chus, poursuivaient tous ceux, qui avaient été de son intelligence, vint à s’enquérir de Caius Blosius (qui était le principal de ses amis) combien il eût voulu faire pour lui : et qu’il eut répondu, toutes choses. Comment toutes choses, suivit-il, et quoi s’il t’eût commandé de mettre le feu en nos temples ? Il ne me l’eût jamais commandé, répliqua Blosius. Mais s’il l’eût fait ? ajouta Lælius : J’y eusse obéi, répondit-il. S’il était si parfaitement ami de Gracchus, comme disent les histoires, il n’avait que faire d’offenser les consuls par cette dernière et hardie confession, Et ne se devait départir de l’assurance qu’il avait de la volonté de Gracchus.

    ’eût fait ? ajouta ==> MAJUSCULE ?
    a ==> MAJUSCULE ?
    ... ...

  11. #71
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Ça y est, je pense avoir deviné
    Et pas dans un foie de canard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    #======================================================================
    #  AUTEUR: Muriel Lesuisse
    #    DATE: 29/08/2016
    #  SCRIPT: typographie2.pl
    #======================================================================
     
    use strict;
    use warnings;
    use utf8;
     
    # Pour avoir les accents dans l'invite de commande (Console/Terminal)
    ActiverAccents();
     
    # l'argument prend en compte un fichier texte
     
    my $entree = $ARGV[0];
    my $sortie = $entree."new";
    my $avertissements = 'avertissements.txt';
     
    my ($fh_entree, $fh_sortie, $fh_avert ) = ();
     
    # j'ouvre le fichier en lecture pour lire ligne par ligne
     
    open ( $fh_entree, '<:utf8', $entree )
       or die ( "Imposible d'ouvrir le fichier $entree $!" );
     
    # j'ouvre le fichier en écriture pour écrire le nouveau texte corrigé
     
    open ( $fh_sortie, '>:utf8', $sortie ) 
       or die ( "Imposible d'ouvrir le fichier $sortie $!" );
     
    # tant qu'il y a des lignes, je lis le texte
     
    while ( my $ligne = <$fh_entree> ) {
    # s/ = susbstitution: on substitue la partie gauche par la partie droite
    # s/ ne fonctionne qu'une fois, pour que ça fonctionne plusieurs fois : /g
     
        next if $ligne =~ /^\s+$/g;      # sauter la ligne si elle ne contient que des espaces
        $ligne =~ s/ +$//g;              # supprimer l'espace en fin de ligne
        $ligne =~ s/^ +//g;              # supprimer l'espace en début de ligne
        $ligne =~ s/\( +/\(/g;           # supprimer les espaces après la parenthèse ouvrante
        $ligne =~ s/ +\)/\)/g;           # supprimer les espaces avant la parenthèse fermante
        $ligne =~ s/\[ +/\[/g;           # supprimer les espaces après le crochet ouvrant
        $ligne =~ s/ +\]/\]/g;           # supprimer les espaces avant le crochet fermant
        $ligne =~ s/ +/ /g;              # supprimer plusieurs espaces consécutifs
        $ligne =~ s/ +\././g;            # supprimer les espaces avant le point
        $ligne =~ s/ +\,/,/g;            # supprimer les espaces avant la virgule
        $ligne =~ s/ ;/\x{A0};/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point-virgule
        $ligne =~ s/ \?/\x{A0}\?/g;      # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'interrogation
        $ligne =~ s/ !/\x{A0}!/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'exclamation
        $ligne =~ s/ :/\x{A0}:/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant deux points
        $ligne =~ s/("[^+]")/«[^+]»/g;   # transformer les guillemets
        $ligne =~ s/(')/’/g;             # transformer l'apostrophe
        $ligne =~ s/\. - \./\. — \./g;   # transformer le tiret en tiret cadratin
        $ligne =~ s/\.([^ ])/. $1/g;     # mettre une espace après le point s'il n'est pas déjà
                                         # suivi par un espace
                                         # pour éviter qu'une ligne soit "mangée", il faut mémoriser 
                                         # la lettre qu'on mange et la recopier ensuite
        $ligne =~ s/\,[^ ]/\, /g;        # mettre une espace après la virgule si elle n'est pas 
                                         # déjà suivie par un espace
        $ligne =~ s/;[^ ]/; /g;          # mettre une espace après le point-virgule s'il n'est 
                                         # pas déjà suivi par un espace
        $ligne =~ s/\?[^ ]/\? /g;        # mettre une espace après le point d'interrogation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/![^ ]/! /g;          # mettre une espace après le point d'exclamation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/:[^ ]/: /g;          # mettre une espace après les deux points s'il ne sont 
                                         # pas déjà suivis par un espace
        $ligne =~ s/[^ ];/ ;/g;          # mettre une espace avant le point-virgule s'il n'est 
                                         # pas déjà précédé par un espace
        $ligne =~ s/[^ ]\?/ \?/g;        # mettre une espace avant le point d'interrogation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]!/ !/g;          # mettre une espace avant le point d'exclamation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]:/ :/g;          # mettre une espace avant les deux points s'il ne sont 
                                         # pas déjà précédés par un espace
        $ligne =~ s/^A\$/^À\$/g;         # remplacer le A par un À avec accent
     
     
        # indiquer à l'auteur qu'il faut une majuscule 
        my $minuscule;
        #$minuscule = $1 if $string =~ /\. ([a-zàéèùâêîôûç])/;
     
        my $Pattern = '[.?!] ([a-zàéèùâêîôûç])';
        $Pattern =~ s/ /\\ /go;
        my @Array = ($ligne =~ m/(\b.{0,10}$Pattern.{0,10}\b)/gx);
        if (@Array) {
        	print $fh_sortie "\nContrôler dans la phrase suivante :";
        	foreach my $Minuscule (@Array) {
        		print $fh_sortie "\n$Minuscule ==> MAJUSCULE ?";
        	}
        	print $fh_sortie "\n\n";
        }
        print $fh_sortie $ligne;
     
    }
     
    print $fh_sortie "\n\n";
    print $fh_sortie "##########################################\n";
    print $fh_sortie "# TEST INDEPENDANTS du fichier en entrée !";
    print $fh_sortie "\n\n";
     
    # mettre des locutions latines en italique
    # tableau contenant les locutions latines
    my @loc_lat = ( "ad hoc", "ad libitum", "a foritori", "a posteriori", "a priori", "bis",
                    "grosso modo", "ididem", "idem in extenso", "in extremis", "in fine",
                    "infra", "loc. cit.", "modus vivendi", "op. cit.", "passim", "quater",
                    "sic", "statu quo", "supra", "ter", "via", "vice versa"); 
     
    # boucle spécialisée dans le parcours de tableaux
    my $elem;
    foreach my $elem ( @loc_lat ) {                       # tant qu'il y a des éléments dans mon tableau
        #$elem =~ s/@loc_lat/<i>@loc_lat<\/i>/g;           # je les mets en italique
        $elem = "<i>". $elem ."</i>\n";
        print $fh_sortie $elem;
    }
    print $fh_sortie "\n\n";                                             
     
     
     
    # espacer un nombre 3 par 3
    my $num           = "12345678";                       # mon numéro = 12345678
    my @tab           = split //, $num;                   # je splite mon numéro dans un tableau
    my @tab_invers    = reverse @tab;                     # j'inverse mon tableau
    my $compteur      = 0;                                # mon compteur est égal à 0
    my $nouveau_num   = "";                               # je crée une chaine de caractère vide dans laquelle je vais mettre mes chiffres
    my $nouveau_num_endroit;
    for my $chiffre (@tab_invers) {                       # tant qu'il y a des chiffres dans mon tableau inversé
        $compteur++;                                      # j'incrémente mon compteur
        $nouveau_num .= $chiffre;                         # je concatène chaque chiffre à ma chaine de caractère vide
        $nouveau_num .= "\x{A0}" if $compteur % 3 == 0;   # je concatène une espace insécable tous les 3 chiffres
        $nouveau_num_endroit = reverse $nouveau_num;      # je remets mon numéro à l'endroit
     
    }
    print $fh_sortie "$nouveau_num_endroit\n";            # j'imprime mon nouveau numéro
     
    print $fh_sortie "\n\n";
     
    # je ferme les fichiers lecture et écriture
    close $fh_entree;
    close $fh_sortie;
     
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccents {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89
    DE L’AMITIÉ
    1. Considérant la conduite de la besogne d’un peintre, que j’ai, il m’a pris envie de l’ensuivre. Il choisit le plus bel endroit et milieu de chaque paroi, pour y loger un tableau élaboré de toute sa suffisance : Et le vide tout autour, il le remplit de crotesques, qui sont peintures fantasques, n’ayant grâce qu’en la variété et étrangeté. Que sont-ce ici aussi à la vérité que crotesques et corps monstrueux, rapiécés de divers membres, sans certaine figure, n’ayant ordre, suite, ni proportion que fortuite ? «Une femme belle de buste s’achève en poisson».
    12. Et cette autre licence Grecque est justement abhorrée par nos mœurs. Laquelle pourtant, pour avoir selon leur usage une si nécessaire disparité d’âges et différences d’offices entre les amants, ne répondait non plus assez à la parfaite union et convenance qu’ici nous demandons.

    Contrôler dans la phrase suivante :
    l’amitié ? et pourquoi ==> MAJUSCULE ?
    e ==> MAJUSCULE ?
    hideux ! ou un beau ==> MAJUSCULE ?
    o ==> MAJUSCULE ?

    «Quel est en effet cet amour de l’amitié ? et pourquoi n’y a-t-il personne pour aimer un adolescent hideux ! ou un beau vieillard ? .
    Car la peinture même qu’en fait l’Académie ne me désavouera pas, comme je pense, de dire ainsi de sa part. Que cette première fureur inspirée par le fils de Vénus au cœur de l’amant sur l’objet de la fleur d’une tendre jeunesse, à laquelle ils permettent tous les insolents et passionnés efforts que peut produire une ardeur immodérée : était simplement fondée en une beauté externe : fausse image de la génération corporelle. Car en l’esprit elle ne pouvait. Duquel la montre était encore cachée : qui n’était qu’en sa naissance et avant l’âge de germer.

    Contrôler dans la phrase suivante :
    ’eût fait ? ajouta ==> MAJUSCULE ?
    a ==> MAJUSCULE ?

    18. Quand Lælius en présence des Consuls Romains, lesquels après la condamnation de Tiberius Grac-chus, poursuivaient tous ceux, qui avaient été de son intelligence, vint à s’enquérir de Caius Blosius (qui était le principal de ses amis) combien il eût voulu faire pour lui : et qu’il eut répondu, toutes choses. Comment toutes choses, suivit-il, et quoi s’il t’eût commandé de mettre le feu en nos temples ? Il ne me l’eût jamais commandé, répliqua Blosius. Mais s’il l’eût fait ? ajouta Lælius : J’y eusse obéi, répondit-il. S’il était si parfaitement ami de Gracchus, comme disent les histoires, il n’avait que faire d’offenser les consuls par cette dernière et hardie confession, Et ne se devait départir de l’assurance qu’il avait de la volonté de Gracchus.
    33. L’ancien Menander disait celui-là heureux, qui avait pu rencontrer seulement l’ombre d’un ami. Il avait certes raison de le dire, même s’il en avait tâté : Car à la vérité si je compare tout le reste de ma vie, quoiqu’avec la grâce de Dieu je l’ai passée douce, aisée, et sauf la perte d’un tel ami, exempte d’affliction pesante, pleine de tranquillité d’esprit, Ayant pris en paiement mes commodités naturelles et originelles sans en rechercher d’autres : Si je la compare, dis-je, toute, aux quatre années, qu’il m’a été donné de jouir de la douce compagnie et société de ce personnage, ce n’est que fumée, ce n’est qu’une nuit obscure et ennuyeuse. Depuis le jour que je le perdis, «jour que je considérerai toujours comme cruel, mais toujours comme sacré (ainsi. Dieux, l’avez-vous voulu)».

    Contrôler dans la phrase suivante :
    34. je ne fais ==> MAJUSCULE ?
    j ==> MAJUSCULE ?
    sa perte. nous étions ==> MAJUSCULE ?
    n ==> MAJUSCULE ?

    34. je ne fais que traîner languissant : Et les plaisirs même qui s’offrent à moi, au lieu de me consoler me redoublent le regret de sa perte. nous étions à moitié de tout : il me semble que je lui dérobe sa part, «Et j’ai décidé qu’il ne m’était plus permis de jouir du moindre plaisir, aussi longtemps que serait absent celui qui participait à ma vie. ».
    Or en échange de cet ouvrage sérieux j’en substituerai un autre, produit en cette même saison de son âge, plus gaillard et plus enjoué.


    ##########################################
    # TEST INDEPENDANTS du fichier en entrée !

    <i>ad hoc</i>
    <i>ad libitum</i>
    <i>a foritori</i>
    <i>a posteriori</i>
    <i>a priori</i>
    <i>bis</i>
    <i>grosso modo</i>
    <i>ididem</i>
    <i>idem in extenso</i>
    <i>in extremis</i>
    <i>in fine</i>
    <i>infra</i>
    <i>loc. cit.</i>
    <i>modus vivendi</i>
    <i>op. cit.</i>
    <i>passim</i>
    <i>quater</i>
    <i>sic</i>
    <i>statu quo</i>
    <i>supra</i>
    <i>ter</i>
    <i>via</i>
    <i>vice versa</i>


    12 345 678
    Bye

  12. #72
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dmganges Voir le message

    A ce sujet j'ai eu l'impression qu'on te demandait de formater le document de sortie comme s'il devait être visionné dans un navigateur... avec des balises html :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    say ("<check type="majuscule">$minuscule</check>");
    Non seulement la syntaxe du say n'est pas correcte (erreur de compilation), mais là on écrit dans l'invite de commande !!!
    Ce n'est pas la syntaxe du say qui est incorrecte, mais le fait que le guillemet après le "=" ferme la chaîne de caractère, si bien que "majuscule" ne fait plus partie de la chaîne.

    Ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ perl -E 'say ("<check type=\"majuscule\">$minuscule</check>");'
    <check type="majuscule"></check>

  13. #73
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Oui MERCI Lolo78,

    J'avais bien vu ta précédente correction, là je reprenais juste sa ligne m'interrogeant sur le travail demandé à Emycherie02, compte tenu de ses connaissances en Perl...

    Je trouve que son 'prof' procède curieusement en lui demandant des modifications de texte déjà avancées,
    sans lui avoir expliqué la différence entre écrire dans une invite de commande et écrire dans un fichier !

    Il est vrai que perso je n'emploie pas say naturellement... je n'ai jamais perçu une grande supériorité à print

  14. #74
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dmganges Voir le message
    Il est vrai que perso je n'emploie pas say naturellement... je n'ai jamais perçu une grande supériorité à print
    Je l'utilise aussi assez peu, ne serait-ce que parce qu'au bureau, la version de Perl sur nos serveur (5.8) ne permet pas l'utilisation de say.

    Cela dit, en Perl 6, j'utilise say 98% du temps et print seulement dans les très rares cas où je ne veux pas aller à la ligne.

    Pour le reste, j'avais bien compris que tu pensais à écrire dans un fichier plutôt que sur la sortie standard, cela paraît effectivement plus logique, mais ce n'est peut-être pas si important pour un devoir de type scolaire. Cela dit, au moins sous Unix/Linux, il est aussi très facile de rediriger la sortie standard.

  15. #75
    Candidat au Club
    Femme Profil pro
    Bibliothécaire
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bibliothécaire

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 3
    Points
    3
    Par défaut
    Merci pour ces réponses.
    Je n'ai pas de consignes précises à part pouvoir corriger un texte au niveau de la typographie.
    C'est moi qui décide des règles à appliquer et comment je veux le faire.
    J'ai emprunté un livre qui m'a aidée à définir différentes règles. J'ai retenu celles-ci que je trouvais intéressantes (et pour lesquelles j'avais une vague idée de la façon de les appliquer)
    Il y en a bien d'autres.
    Nous avons eu un cours que j'ai eu beaucoup de mal à suivre.
    La programmation n'est vraiment pas mon truc !
    Je voudrais donc :
    - corriger la ponctuation (ça ça fonctionne)
    - mettre mes locutions latines en italique
    - prévenir l'auteur qu'il faudrait peut être une majuscule
    - faire apparaître mes nombres avec un espace tous les 3 chiffres

    Merci pour votre aide très précieuse !

  16. #76
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Je l'utilise aussi assez peu, ne serait-ce que parce qu'au bureau, la version de Perl sur nos serveur (5.8) ne permet pas l'utilisation de say.

    Cela dit, en Perl 6, j'utilise say 98% du temps et print seulement dans les très rares cas où je ne veux pas aller à la ligne.

    Pour le reste, j'avais bien compris que tu pensais à écrire dans un fichier plutôt que sur la sortie standard, cela paraît effectivement plus logique, mais ce n'est peut-être pas si important pour un devoir de type scolaire. Cela dit, au moins sous Unix/Linux, il est aussi très facile de rediriger la sortie standard.
    Pour info en V5.24 Strawberry pour utiliser say je dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use feature 'say';
    say ('<check type="majuscule">$minuscule</check>');
    Ayant téléchargé le programme de Emycherie02 (par curiosité comme d'hab) il était plus facile pour moi, surtout avec l’interpréteur, de trouver les anomalies...
    Par habitude aussi, je joue plus avec les simples et doubles quottes qu'avec les \

    Ceci étant, j'évite d'intervenir, sauf pendant les vacances où les pros peuvent être absents... car ce qui reste de mes connaissance se fait archaïque...

    Citation Envoyé par Emycherie02
    Merci pour ces réponses.
    Je n'ai pas de consignes précises à part pouvoir corriger un texte au niveau de la typographie.
    C'est moi qui décide des règles à appliquer et comment je veux le faire.
    J'ai emprunté un livre qui m'a aidée à définir différentes règles. J'ai retenu celles-ci que je trouvais intéressantes (et pour lesquelles j'avais une vague idée de la façon de les appliquer)
    Il y en a bien d'autres.
    Nous avons eu un cours que j'ai eu beaucoup de mal à suivre.
    La programmation n'est vraiment pas mon truc !
    Je voudrais donc :
    - corriger la ponctuation (ça ça fonctionne)
    - mettre mes locutions latines en italique
    - prévenir l'auteur qu'il faudrait peut être une majuscule
    - faire apparaître mes nombres avec un espace tous les 3 chiffres

    Merci pour votre aide très précieuse !
    Merci c'est plus clair pour moi

    Donc :
    - OK pour la ponctuation
    - Prévenir l'auteur ma dernière mouture devrait t'aider... dis-nous si ça convient ou s'il y a qqc à changer...

    Pour les 2 autres j'ai mal deviné

    Une piste pour le moment, sinon ce n'est pas du jeu et on va se faire étriper, à juste titre, par ton prof...

    Pour les locutions comme pour les nombres :
    - Pour chaque ligne (donc dans le while) :
    a) Pour les locutions, prendre chaque élément du tableau (donc un à un dans une boucle) que tu mets dans une variable $modif)
    b) Pour les nombres, faire une regex pour les sélectionner (mais précédemment on t'as fait remarquer les difficultés avec les décimales...)

    - faire une regex pour a) et b) qui récupère la vraie valeur dans la ligne et ce dans $1 (comme tu as déjà fait)
    - dans la ligne faire une substitution de $1 ou $modif par le résultat que tu souhaites :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ligne =~ s/$1/Ce_Que_tu_veux/;
    $ligne =~ s/$modif/Ce_Que_tu_veux/;
    Bon j'espère que ça ne sèmera pas le trouble dans ton esprit

    En pratique :
    1- Le vendredi pour moi c'est : intendance ==> ménage, courses... donc je ne serai pas à l'écoute en permanence !
    2- Je ne suis pas un pro de Perl, et comme précisé plus haut je n'ai que des vieilleries à proposer, mais si ça peut te mettre un pied à l’étrier en attendant mieux...

  17. #77
    Candidat au Club
    Femme Profil pro
    Bibliothécaire
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bibliothécaire

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 3
    Points
    3
    Par défaut
    dmganges
    La majuscule ça fonctionne super
    Par contre pourrais-tu m'expliquer ligne par ligne ce que le code fait ?
    Je dois pouvoir tout comprendre...

    Je m’attelle au reste.
    Merci pour tes pistes !

  18. #78
    Candidat au Club
    Femme Profil pro
    Bibliothécaire
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bibliothécaire

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 3
    Points
    3
    Par défaut
    dmganges
    Pour chaque ligne (donc dans le while) :
    a) Pour les locutions, prendre chaque élément du tableau (donc un à un dans une boucle) que tu mets dans une variable $modif)

    ça donne quelque chose comme ceci ?

    my $loc_lat = ( "ad hoc", "ad libitum", "a foritori", "a posteriori", "a priori", "bis",
    "grosso modo", "ididem", "idem in extenso", "in extremis", "in fine",
    "infra", "loc. cit.", "modus vivendi", "op. cit.", "passim", "quater",
    "sic", "statu quo", "supra", "ter", "via", "vice versa");

    my @tab = split (" " ,$loc_lat);
    foreach my $modif (@tab) {

    après :
    faire une regex pour a) et b) qui récupère la vraie valeur dans la ligne et ce dans $1 (comme tu as déjà fait)
    - dans la ligne faire une substitution de $1 ou $modif par le résultat que tu souhaites :

    je suis à nouveau perdue...

  19. #79
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    évite de commencer par dmganges
    tu laisses croire que tu souhaites de réponse que de ma part, pas bien sur un forum
    De plus tu risques, de perdre des avis plus pertinents que les miens ...

    Donc là juste l'explication :
    que les pros n'hésitent pas à intervenir ! MERCI d'avance !
    j'espère être clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    # indiquer à l'auteur qu'il faut une majuscule 
        my $minuscule;                                           # je réserve une variable QUI NE SERT à RIEN en fait la tienne que tu peux enlever
        #$minuscule = $1 if $string =~ /\. ([a-zàéèùâêîôûç])/;   # Celle-là aussi A ENLEVER je n'avais pas fait le ménage !!!
     
        my $Pattern = '[.?!] ([a-zàéèùâêîôûç])';                 # Ca commence ICI on définit une variable $Pattern qui va contenir la regex stricto sensu (TIEN tu peux l'ajouter celle-ci)
                                                                 # Je dis stricto sensu car c'est celle qui serait écrite DE CETTE FACON pour retrouver la chaîne en question
                                                                 # Tu remaques que dans cette regex il y a un espace. Cet espace il faut le protéger car on va faire exécuter une regex
                                                                 # qui se trouve dans une variable et dans ce cas le moteur de regex si l'espace n'est pas protégé, il ne l'interprète pas
                                                                 # comme nous on l'imagine...
        $Pattern =~ s/ /\\ /go;                                  # Donc ici on protège l'espace à l'intérieur de la regex ! (maintenant tu connais !)
        my @Array = ($ligne =~ m/(\b.{0,10}$Pattern.{0,10}\b)/gx); # on découpe la ligne $ligne avec la regex GLOBALE en plaçant le résultat dans un tableau @Array
                                                                   # dans le cas où il y aurait plusieurs cas sur un seule ligne...
                                                                   # Tu remarques qu'au pire on a un caractère de ponctuation suivi obligatoirement d'un espace puis d'un seul caractère
                                                                   # minuscule, lui-même suivi d'un espace - A VOIR avec tes précédentes modifs qui sont OK
                                                                   # Cette regex ne fait pas une substitution, =~ s
                                                                   # Cette regex fait simplement une recherche (match) et donc =~ m
                                                                   # on entoure $Pattern de quelques caractères :
                                                                   # d'abord un espace \b
                                                                   # suivi d'un caractère n'importe lequel .
                                                                   # ce n'importe quel caractère peut être présent de zéro à 10 fois
                                                                   # Puis immédiatement accolé notre PATTERN (en fait le premier morceau de la regex)
                                                                   # Après on fait l'inverse :
                                                                   # immédiatement après PATTERN n'importe quel caractère donc .
                                                                   # entre zéro et 10 fois
                                                                   # tu peux mettre 15 ou 20...
                                                                   # et enfin un espace \b
                                                                   # GLOBALEMENT on entoure la regex de départ PATTERN de quelques caractères en veillant à ne pas tronquer des mots
     
                                                                   # s'il y a quelque chose dans @Array (c'est que la regex à trouvé qqc)
        if (@Array) {
        	print $fh_sortie "\nContrôler dans la phrase suivante :"; # On imprime dans le fichier en sortie un petit laïus (Une autre latine à ajouter :)
        	foreach my $Minuscule (@Array) {                          # Pour chaque valeur du tableau on imprime une ligne en sortie
        		                                                        # Et tu remarques au passage que pour chaque $Pattern on a en fait 2 cases de remplies
        		                                                        # Franchement je ne me souvenais pas d'un tel comportement, pour ne pas me casser la tête, je m'en suis servi !!!
        		print $fh_sortie "\n$Minuscule ==> MAJUSCULE ?";        # Donc pour 1 match on tourne 2 fois dans la boucle, pour 2 match on tourne 4 fois...
        	}
        	print $fh_sortie "\n\n";
        }
     
        print $fh_sortie "\n\n";
    PS : j'ai pondu çà vite fait, désolé pour les fautes. N'hésite pas si ce n'est pas clair...

  20. #80
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Je vais m'absenter une bonne partie de l'après-midi
    Je colle une dernière mouture qui doit être à peu près correcte avec ce que j'ai compris des règles ...

    Ce n'est pas bien testé...
    Et pour des explications, pas avant lundi, ça te laisse un peu de temps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    #======================================================================
    #  AUTEUR: Muriel Lesuisse
    #    DATE: 29/08/2016
    #  SCRIPT: typographie2.pl
    #======================================================================
     
    use strict;
    use warnings;
    use utf8;
     
    # Pour avoir les accents dans l'invite de commande (Console/Terminal)
    ActiverAccents();
     
    # l'argument prend en compte un fichier texte
     
    my $entree = $ARGV[0];
    my $sortie = $entree."new";
    my $avertissements = 'avertissements.txt';
     
    my ($fh_entree, $fh_sortie, $fh_avert ) = ();
     
    # j'ouvre le fichier en lecture pour lire ligne par ligne
     
    open ( $fh_entree, '<:utf8', $entree )
       or die ( "Imposible d'ouvrir le fichier $entree $!" );
     
    # j'ouvre le fichier en écriture pour écrire le nouveau texte corrigé
     
    open ( $fh_sortie, '>:utf8', $sortie ) 
       or die ( "Imposible d'ouvrir le fichier $sortie $!" );
     
     
    # tableau contenant les locutions latines
    my @loc_lat = ( "ad hoc", "ad libitum", "a foritori", "a posteriori", "a priori", "bis",
                    "grosso modo", "ididem", "idem in extenso", "in extremis", "in fine",
                    "infra", "loc. cit.", "modus vivendi", "op. cit.", "passim", "quater",
                    "sic", "statu quo", "supra", "ter", "via", "vice versa");
     
    # tant qu'il y a des lignes, je lis le texte
     
    while ( my $ligne = <$fh_entree> ) {
    # s/ = susbstitution: on substitue la partie gauche par la partie droite
    # s/ ne fonctionne qu'une fois, pour que ça fonctionne plusieurs fois : /g
     
        next if $ligne =~ /^\s+$/g;      # sauter la ligne si elle ne contient que des espaces
        $ligne =~ s/ +$//g;              # supprimer l'espace en fin de ligne
        $ligne =~ s/^ +//g;              # supprimer l'espace en début de ligne
        $ligne =~ s/\( +/\(/g;           # supprimer les espaces après la parenthèse ouvrante
        $ligne =~ s/ +\)/\)/g;           # supprimer les espaces avant la parenthèse fermante
        $ligne =~ s/\[ +/\[/g;           # supprimer les espaces après le crochet ouvrant
        $ligne =~ s/ +\]/\]/g;           # supprimer les espaces avant le crochet fermant
        $ligne =~ s/ +/ /g;              # supprimer plusieurs espaces consécutifs
        $ligne =~ s/ +\././g;            # supprimer les espaces avant le point
        $ligne =~ s/ +\,/,/g;            # supprimer les espaces avant la virgule
        $ligne =~ s/ ;/\x{A0};/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point-virgule
        $ligne =~ s/ \?/\x{A0}\?/g;      # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'interrogation
        $ligne =~ s/ !/\x{A0}!/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant un point d'exclamation
        $ligne =~ s/ :/\x{A0}:/g;        # transformer l'espace justifiante en espace insécable 
                                         # avant deux points
        $ligne =~ s/("[^+]")/«[^+]»/g;   # transformer les guillemets
        $ligne =~ s/(')/’/g;             # transformer l'apostrophe
        $ligne =~ s/\. - \./\. — \./g;   # transformer le tiret en tiret cadratin
        $ligne =~ s/\.([^ ])/. $1/g;     # mettre une espace après le point s'il n'est pas déjà
                                         # suivi par un espace
                                         # pour éviter qu'une ligne soit "mangée", il faut mémoriser 
                                         # la lettre qu'on mange et la recopier ensuite
        $ligne =~ s/\,[^ ]/\, /g;        # mettre une espace après la virgule si elle n'est pas 
                                         # déjà suivie par un espace
        $ligne =~ s/;[^ ]/; /g;          # mettre une espace après le point-virgule s'il n'est 
                                         # pas déjà suivi par un espace
        $ligne =~ s/\?[^ ]/\? /g;        # mettre une espace après le point d'interrogation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/![^ ]/! /g;          # mettre une espace après le point d'exclamation s'il 
                                         # n'est pas déjà suivi par un espace
        $ligne =~ s/:[^ ]/: /g;          # mettre une espace après les deux points s'il ne sont 
                                         # pas déjà suivis par un espace
        $ligne =~ s/[^ ];/ ;/g;          # mettre une espace avant le point-virgule s'il n'est 
                                         # pas déjà précédé par un espace
        $ligne =~ s/[^ ]\?/ \?/g;        # mettre une espace avant le point d'interrogation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]!/ !/g;          # mettre une espace avant le point d'exclamation s'il 
                                         # n'est pas déjà précédé par un espace
        $ligne =~ s/[^ ]:/ :/g;          # mettre une espace avant les deux points s'il ne sont 
                                         # pas déjà précédés par un espace
        $ligne =~ s/^A\$/^À\$/g;         # remplacer le A par un À avec accent
     
     
        # indiquer à l'auteur qu'il faut une majuscule 
        my $minuscule;
        #$minuscule = $1 if $string =~ /\. ([a-zàéèùâêîôûç])/;
     
        my $Pattern = '[.?!] ([a-zàéèùâêîôûç])';
        $Pattern =~ s/ /\\ /go;
        my @Array = ($ligne =~ m/(\b.{0,10}$Pattern.{0,10}\b)/gx);
        if (@Array) {
        	print $fh_sortie "\nContrôler dans la phrase suivante :";
        	foreach my $Minuscule (@Array) {
        		print $fh_sortie "\n$Minuscule ==> MAJUSCULE ?";
        	}
        	print $fh_sortie "\n\n";
        }
     
        print $fh_sortie "\n\n";
     
        $ligne = latin ($ligne);
        $ligne = lineNumber ($ligne);
     
        print $fh_sortie $ligne;
     
    }
     
    print $fh_sortie "\n\n";
     
    #Exemple pour say
    use feature 'say';
    # dans l'invite e commande
    say '<check type="majuscule">$minuscule</check>';
    # dans le fichier
    say $fh_sortie "\n".'<check type="majuscule">$minuscule</check>'."\n";
     
    print $fh_sortie "\n\n";
     
    #######
    # FIN #
    #######
     
    #############
    # Fonctions #
     
    # fonction pour mettre des locutions latines en italique
    # boucle spécialisée dans le parcours de tableaux
    sub latin {
    	  my ( $newLine ) = @_;
        my $elem;
        foreach my $elem ( @loc_lat ) {                         # tant qu'il y a des éléments dans mon tableau
        	  my $newElem = "<i>". $elem ."</i>";
            $newLine =~ s/$elem/$newElem/g;                     # je les mets en italique
        }
        return ($newLine);
    }   
     
     
    print $fh_sortie "\n\n";                                             
     
     
     
    # fonction pour espacer un nombre 3 par 3
    sub lineNumber {
    	  my ( $newLine ) = @_;
    	  # print "LINE=$newLine\n";
    	  my $Pattern = ' [0-9]{1,} ';
        $Pattern =~ s/ //g;
        my @Array = ($newLine =~ m/$Pattern/g);
        #print "ARRAY=@Array\n";
        if (@Array) {
        	foreach my $number (@Array) {
        		#print "foreachNUMBER=$number=\n";
        		my $newNumber = nombres ($number);
        		$newLine =~ s/$number/$newNumber/g;
        	}
        }
        return ($newLine);
    }
     
    sub nombres {  
        my ( $num )          = @_;                            # mon nombre à modifier
        # print "NUM=$num\n";
        my @tab           = split //, $num;                   # je splite mon numéro dans un tableau
        my @tab_invers    = reverse @tab;                     # j'inverse mon tableau
        my $compteur      = 0;                                # mon compteur est égal à 0
        my $nouveau_num   = "";                               # je crée une chaine de caractère vide dans laquelle je vais mettre mes chiffres
        my $nouveau_num_endroit;
        for my $chiffre (@tab_invers) {                       # tant qu'il y a des chiffres dans mon tableau inversé
            $compteur++;                                      # j'incrémente mon compteur
            $nouveau_num .= $chiffre;                         # je concatène chaque chiffre à ma chaine de caractère vide
            $nouveau_num .= "\x{A0}" if $compteur % 3 == 0;   # je concatène une espace insécable tous les 3 chiffres
            $nouveau_num_endroit = reverse $nouveau_num;      # je remets mon numéro à l'endroit
        }
        # print "$nouveau_num_endroit\n";
        return ($nouveau_num_endroit);
    }
     
     
     
    print $fh_sortie "\n\n";
     
    # je ferme les fichiers lecture et écriture
    close $fh_entree;
    close $fh_sortie;
     
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccents {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89
    J'ai laissé les print en commentaire
    en les dé-commentant tu pourras suivre le déroulement à la console
    après bien sûr tu fais le ménage...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Expression régulière pour supprimer des doublons
    Par cbroissa dans le forum Langage
    Réponses: 5
    Dernier message: 20/05/2017, 02h59
  2. [RegEx] Expression régulière pour trouver des mots
    Par cbroissa dans le forum Langage
    Réponses: 7
    Dernier message: 27/05/2006, 00h39
  3. [RegEx] Simple expression régulière pour ereg_replace
    Par aurapp dans le forum Langage
    Réponses: 6
    Dernier message: 12/03/2006, 13h34
  4. Expression régulière pour récupérer le nom d'un fichier
    Par calimero2611 dans le forum Langage
    Réponses: 5
    Dernier message: 24/02/2006, 20h00
  5. Expression Régulière pour float
    Par zebiloute dans le forum Langage
    Réponses: 5
    Dernier message: 26/09/2005, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo