Question

Quand j'écris

#!/usr/bin/perl -w
use strict;

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;
}

après chaque " return " Je reçois une ligne.

Pourquoi ne pas utiliser le script suivant après chaque " return " un paragraphe?

#!/usr/bin/perl -w
use strict;

local $/ = "";

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;
}

__DATA__
line one
line two
line three
line four
line five

line six
line seven
line eigth
line nine

line ten
line eleven
line twelve
Était-ce utile?

La solution

Dans votre premier script, avec la variable $ / définie sur la valeur par défaut " \ n " ;, le < DATA > ne renverra qu'une ligne à la fois.

Je crois que le second script fait ce que vous voulez, c'est juste que < > ne terminera pas la lecture sur un 'retour' mais plutôt sur un < ctrl-d > en raison de votre paramètre $ / (comme quelqu'un l'a souligné < > lit à partir de STDIN mais je pense que vous le savez déjà et que vous l'utilisez pour réguler la sortie).

Si vous voulez vraiment réguler la sortie avec 'return', vous devez faire plus avec $ / dans la boucle.

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    $/ = "\n"; # default so that the following terminates the read on 'return'
    <>;
    $/ = ""; 
}   

Autres conseils

Je suppose que vous attendez cette ligne

local $/ = "";

pour changer le comportement de

<DATA>

pour continuer à lire jusqu'à la fin des données.

Mais en fait, il faut quelque chose comme ça

{
    local $/;  # $/ becomes undef in this block
    ...
}

pour activer le mode slurp (et sur contenir ce mode dans le champ {curlys}).

En fait, cela signifie & "oubliez de penser aux nouvelles lignes en tant que marqueur de fin d'enregistrement &",

.

En outre, il existe un cravate dans votre code!

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;    # <-- Feel the power of the DARK SIDE!!!
}

Ce petit gars lira sur STDIN, pas sur DATA - est-ce vraiment ce que vous voulez?

Utilisation de < > de cette façon (interactivement) en mode paragraphe va être déroutant. Il ne reviendra pas lorsque vous cliquerez sur & "Return &" ;; au lieu de cela, il lira jusqu'à obtenir une ligne non vide (le début d'un paragraphe), puis jusqu'à ce qu'il obtienne une ligne vide (la fin de ce paragraphe), puis poursuivra la lecture jusqu'à ce qu'il obtienne une ligne non vide (le début du paragraphe suivant - qui sera mis en mémoire tampon, pas renvoyé) afin qu'il sache qu'il a supprimé toutes les lignes vides supplémentaires.

Peut-être devriez-vous utiliser:

local $/ = "\n"; <>

à la fin de votre boucle à la place. Ou peut-être POSIX :: getchar ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top