Come posso stampare solo una newline unix in Perl su Win32?
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.
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
}