Domanda

Per impostazione predefinita, perl stampa \ r \ n in un ambiente win32. Come posso ignorarlo? Sto usando perl per apportare alcune modifiche ad alcuni codici sorgente in un repository e non voglio cambiare tutti i caratteri di nuova riga.

Ho provato a cambiare il separatore del record di output ma senza fortuna.

Grazie!

Modifica: Volevo includere un esempio di codice: sto facendo una ricerca e sostituisco alcuni file che seguono un modello relativamente semplice come questo:

#!/usr/bin/perl
# test.pl

use strict;
use warnings;

$/ = undef;
$\ = "\n"; 
$^I=".old~";

while (<>) {
  while (s/hello/world/) {

  }
  print;
}

Questo dovrebbe sostituire qualsiasi istanza di " ciao " con "mondo" per tutti i file passati sulla linea cmd.

Modifica 2: Ho provato il binmode come suggerito senza fortuna inizialmente . Ho approfondito un po 'di più e ho scoperto che $ ^ I (la variabile speciale di modifica inplace) stava sovrascrivendo binmode . Qualche soluzione per poter ancora utilizzare la modifica sul posto?

Modifica 3: Come sottolinea Sinan di seguito, dovevo usare binmode ARGVOUT con $ ^ I invece di binmode STDOUT nel mio esempio. Grazie.

È stato utile?

Soluzione

La stampa di " \ n " su un filehandle su Windows emette, per impostazione predefinita, un RITORNO DEL CARRELLO ( " \ 015 " ) seguito da un carattere LINE FEED ( " \ 012 " ) perché quella sequenza newline standard su Windows.

Questo accade in modo trasparente, quindi è necessario sovrascriverlo per lo speciale filehandle ARGVOUT (vedere perldoc perlvar ):

#!/usr/bin/perl -i.bak

use strict; use warnings;

local ($\, $/);

while (<>) {
    binmode ARGVOUT;
    print;
}

Output:

C:\Temp> xxd test.txt
0000000: 7465 7374 0d0a 0d0a                      test....

C:\Temp> h test.txt

C:\Temp> xxd test.txt
0000000: 7465 7374 0a0a                           test..

Vedi anche perldoc open , perldoc binmode e perldoc perliol (grazie daotoad ).

Altri suggerimenti

binmode (STDOUT) funziona?

Ri: la tua domanda sulla modalità bin si perde quando $ ^ I apre un nuovo handle di output, potresti risolverlo con open pragma:

use open OUT => ':raw';

che imporrà a tutti i filehandle aperti per la scrittura di applicare il livello PerlIO ': raw' (equivalente a binmode senza alcun argomento). Fai solo attenzione se stai aprendo qualcosa else per l'output che applichi : crlf o qualsiasi altro livello, se necessario.

Una newline unix è un carattere LINEFEED, che è il codice ASCII 10.

print " \ 012 " ;;

I dati che stai leggendo contengono i finali di riga, quindi li riavvierai di nuovo. Puoi toglierli da soli con chomp , quindi aggiungere il tuo finale, a condizione che tu ha impostato binmode come Sinan descrive ::

while (<>) {
    binmode;
    chomp;        # strip off \r\n
    while (s/search/replace/) {
        # ...
    }
    print;
    print "\n";   # add your own line ending back
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top