2 votes

Comment enlever le saut de ligne de ce code?

J'ai le code suivant dans un script ancien :

while ()  # Tant qu'il y a encore des lignes d'entrée dans le fichier...
{
  if($_ =~ /\x1b&d@
/)
  {
    $aa=$_;
    $aa =~ s/\x1b&d@
/
\x1b&d@/;
    print STDOUT $aa;
  }
...
}

Pouvez-vous s'il vous plaît expliquer - que fait ce code et comment le remplacer par du code correct ? Je n'aime pas qu'il y ait un saut de ligne dans "if" et "=~". Est-il possible de changer ce code ?

3voto

toolic Points 23449

En supposant que le INPUT_RECORD_SEPARATOR n'ait pas été redéfini, le saut de ligne peut probablement être remplacé par $. Ensuite, vous devriez pouvoir chomp la copie de la ligne d'entrée pour supprimer le saut de ligne. Ensuite, ajoutez \n au début de la sortie.

while ()  # Tant qu'il y a encore des lignes d'entrée dans le fichier... 
{ 
  if (/\x1b&d@$/) { 
    $aa = $_; 
    chomp $aa;
    print STDOUT "\n" . $aa;
  } 
... 
} 

Cela simplifierait le code en éliminant plusieurs copies de votre regex.

1voto

eugene y Points 37378

Vous pouvez remplacer les sauts de ligne par \n. Voir la section sur les séquences d'échappement dans 'Opérateurs de citation et de type de citation' dans perldoc perlop.

Le métacaractère $ peut également être utilisé. De perldoc perlre:

  $ Correspond à la fin de la ligne (ou avant le retour à la ligne à la fin)

0voto

rsp Points 14367

Ce code semble rechercher une séquence de bytes suivie d'un saut de ligne et échanger le saut de ligne devant le motif. Vous pouvez utiliser \n pour le saut de ligne (ou \r\n si le script est au format DOS), ce qui suit est équivalent je pense :

while ()  # Tant qu'il y a des lignes d'entrée dans le fichier...
{
  if($_ =~ m/\x1b&d@\n/)
  {
    $aa=$_;
    $aa =~ s/\x1b&d@\n/\n\x1b&d@/;
    print STDOUT $aa;
  }
...
}

0voto

ghostdog74 Points 86060

Essayez d'abord de faire un chomp() avant de traiter

while () {
  chomp;
  ....
}

0voto

Sinan Ünür Points 76179

C'est un peu tricky :

/\x1b&d@
/

C'est le caractère escape suivi de '&d@' à la fin de la ligne. Par conséquent, je pourrais effectivement utiliser :

while (my $line = ) {
    if ( $line =~ /x1b&d@$/ ) {
        chomp $line;
        print $line;
    }
}

Je ne vois pas pourquoi il est nécessaire de faire une copie de $_ dans $aa, mais si c'est vraiment nécessaire, utilisez

if ( (my $copy = $line) =~ /x1b&d@$/ ) {
        chomp $copy;
        print $copy;
    }
}

Vous avez seulement besoin de spécifier STDOUT comme filehandle si un autre filehandle a été sélectionné comme le default.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X