Forum Programmation.perl Perl 5.14 split

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
0
11
nov.
2013

Bonjour,

J'utilise un script (Q4Mon pour ne pas le nommer) qui fonctionnait très bien sous Squeeze (perl 5.10) et également bien avant. Sous wheezy (perl 5.14) que neni.

Après débogage c'est ce petit bout de code qui pose problème

foreach (@query_results) {
    if ($_) {
        if (split(/,,/,$_) && $_[0] eq "Q4S") {
                # Server Info
                $temp_server_address=$_[1];
                $server_address=$_[1];

if(split est toujours faux
En transformant le code comme ceci, cela refonctionne.

foreach (@query_results) {
    if ($_) {
        my @val=split(/,,/,$_);
            if ($val[0] eq "Q4S") {
                # Server Info
                $temp_server_address=$val[1];

D'où mes questions :
Y-a-t-il eu des changements majeurs dans perl 5.14 qui expliquerai pourquoi un code vieux de 10 ans ne fonctionne plus ?
Y-a-t-il une manière plus propre de faire que mon patch ? (oui parce que là, il faut que je modifie à plein d'endroit dans le code, c'est utilisé partout :))

Merci

Edit, je viens de trouver ça, ça ne me donne pas la solution mais au moins ça m'explique le comportement :
split() and @_

split() no longer modifies @_ when called in scalar or void context. In void context it now produces a "Useless use of split" warning. This was also a perl 5.12.0 change that missed the perldelta.

Edit2 : Bon j'ai trouvé la solution la plus rapide. Cpan install Classic::Perl; et use Classic::Perl :)

  • # pas d'idée de titre...

    Posté par  (site web personnel) . Évalué à 2. Dernière modification le 11 novembre 2013 à 21:52.

    Perl est d'une incroyable stabilité avec les vieux codes et tu as trouvé tout seul la solution minimale. Enfin, une petite mise à jour du script ne ferait pas de mal parce que au bout d'un moment, les manières d'écrire ont bien changé…

        foreach my $res (@query_results) {
           next if not $res;
           my ($val1, $val2) = split /,,/, $res;
           if ($val1 eq 'Q4S') {
              # Server Info
              $temp_server_address = $val2;

    Mettre d'autres nom que res et val comme nom mais avec aussi peu d'information, j'ai pas trouvé mieux ;-)

  • # coloration syntaxique des deux posts

    Posté par  . Évalué à 2.

    j'ai modifié les posts pour qu'il y ait coloration syntaxique, ca se fait avec 3 ` suivit du langage

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.