Domanda

Questa è una domanda per principianti-best-practice in perl. Sono nuovo di questo linguaggio. La domanda è:

Se voglio elaborare le linee di uscita da un programma, come posso formattare LA PRIMA LINEA in modo particolare?

Penso a due possibilità:

1) Una variabile bandiera, una volta che il ciclo viene eseguito prima volta viene impostata. Ma sarà valutata per ogni ciclo. Soluzione BAD

2) Un ciclo di indice a base (come un "per"). Poi vorrei iniziare il ciclo di i = 1. Questa soluzione è di gran lunga migliore. Il problema è come posso farlo?

Ho appena trovato il codice per looping sopra con il costrutto while (<>).

Qui potete vedere meglio:

$command_string = "par-format 70j p0 s0 < " . $ARGV[0] . "|\n";                                                                                

open DATA, $command_string  or die "Couldn't execute program: $!";

print "\t    <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|-- <strong>Description</strong></div>\n";
while ( defined( my $line = <DATA> )  ) {
   chomp($line);
   # print "$line\n";
   print "\t    <div>&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;&‎nbsp;|&‎nbsp;&‎nbsp;&‎nbsp;-- " . $line  . "</div>\n";
}

close DATA;

Inoltre, non esitate a correggere qualsiasi codice qui, questa è la mia prima poesia perl.

Grazie!

È stato utile?

Soluzione

È sempre possibile utilizzare $. o il nome inglese $INPUT_LINE_NUMBER per controllare la logica nel vostro ciclo con:

while (my $line = <>) {
    if ($. == 1) {
        # do cool stuff here
    }
    # do normal stuff here
}

Altri suggerimenti

Per gestire la prima linea in modo diverso, si può solo mettere

$line = <DATA>;

sopra il ciclo.

Con una corretta verifica per problemi di lettura (file vuoto, ecc) questo dovrebbe essere

if ($line = <DATA>) {
    ...do special things...
}

while (my $line = <DATA>) {
    ...do regular things...
}

Non sono sicuro circa la chiamata defined(). Potrebbe non essere necessario, dal momento che una stringa vuota ha un valore di verità falso.

Dal punto di vista 'best practice' c'è molto di sbagliato in questo codice di esempio:

open DATA, $command_string  or die "Couldn't execute program: $!";
  • buco di sicurezza, vi prego di sfruttare.
  • dati è un valore magico che punta ad una sezione __DATA__ alla fine del file corrente.
  • Si dovrebbe usare

    open my $fh 
    

    che utilizza una variabile lessicale per un handle di file invece di un mondiale.

  • Si dovrebbe usare 3 arg aperto, vale a dire:

    open my $fh, '<'  , $filename
    open my $fh, '-|' , $command
    open my $fh, '-|' , $command, @args 
    

    purtroppo devo ancora capire come 3-arg funziona con due tubi. Theres' questa cosa IPC :: Open2, ma non ho trovato il modo utilizzare che effettivamente ancora. I suggerimenti sono benvenuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top