2015-07-13 5 views
15

documentazione del Perl dice che $/ è:

Il separatore di record in ingresso, a capo per impostazione predefinita. Ciò influenza l'idea di Perl di cosa sia una "linea".

Quindi, è fondamentalmente sbagliato:

print STDERR $var, $/; 

invece di:

print STDERR "$var\n"; 

?

Cosa potrebbe andare storto se faccio il primo?

+1

È il separatore * input * che può essere modificato se è necessario leggere file codificati CRLF o CR. – tadman

+0

'$ /' è il carattere eol di sistema, che va bene se il file che stai generando è solo per uso "Locale". Se stai generando un file per alcuni sistemi operativi OTHER, ad es. sei su Linux per costruire un file Windows, quindi '$ /' è inutile. –

+3

Dovresti davvero usare il separatore di record * output * '$ \' ', ma non riesco a vedere nulla di sbagliato nel farlo. Infatti, la funzione ['say'] (http://perldoc.perl.org/functions/say.html) fa proprio questo:" 'say LIST' è semplicemente un'abbreviazione di' {local $ \ = "\ n "; print LIST}" "(Se sei su 5.10+, userei invece' say' invece.) – ThisSuitIsBlackNot

risposta

9

Forse stai cercando il separatore dei record di output?

perldoc perlvar:

 IO::Handle->output_record_separator(EXPR) 
    $OUTPUT_RECORD_SEPARATOR 
    $ORS 
    $\

Il separatore di record di uscita per l'operatore di stampa. Se definito, questo valore viene stampato dopo gli ultimi argomenti della stampa. L'impostazione predefinita è "undef".

Non è possibile chiamare "output_record_separator()" su un handle, solo come metodo statico. Vedi IO::Handle.

Mnemonico: si imposta "$\" invece di aggiungere "\n" alla fine della stampa. Inoltre, è proprio come $/, ma è ciò che si ottiene "indietro" da Perl.

Per esempio,

$\ = $/; 
print STDERR $var; 
+5

Penso che questa sia una pessima idea. Non molti moduli si proteggono da "$ \" cambiandoli, quindi cambiando globalmente '$ \' li romperà. Puoi limitare l'ambito della modifica usando '{local $ \ = $ /; stampa STDERR $ var; } ', ma questo è un casino completo rispetto a' print STDERR "$ var \ n"; 'o' say STDERR $ var; '. – ikegami

+2

@ikegami E penso che se i moduli non riescono a gestire '$ \' cambiando, questo è un bug nei moduli, specialmente considerando che c'è un'opzione di riga di comando comunemente usata che imposta '$ \' ('-l'). – hvd

+2

@hvd, comunemente usato in one-liners, forse, ma sospetto che molto pochi moduli eseguano 'local $ /;' prima di ogni 'print' perché sarebbe sciocco farlo anche se lo consideri un bug. – ikegami

1

È necessario registrare l'uscita di separazione $ \ come xxfelixxx ha risposto.

$/ come si legge è input record separator. La manipolazione può influenzare il modo in cui Perl legge i dati del file che hai fornito. Per esempio:

open my $fh, "<", $filename or die $!; 
local $/; # enable localized slurp mode 
my $content = <$fh>; 
close $fh; 

Le suddette cause intero contenuto del file da trangugiare in scalare $ contenuti perché avevamo azzerato $/.

Si consideri il codice qui sotto:

#!/usr/bin/perl 
use strict; 
use warnings; 
my $content; 
{local $/; $content = <DATA>} 
print "Content is $content"; 
__DATA__ 
line 1 
line 2 
line 3 

uscita:

Content is line 1 
line 2 
line 3 

Ma se non si azzera $ /, come nel codice qui sotto:

#!/usr/bin/perl 
use strict; 
use warnings; 
my $content = <DATA>; 
print "Content is $content"; 
__DATA__ 
line 1 
line 2 
line 3 

uscita sarà Content is line 1 .

Questo perché il separatore del record di input è stato impostato su newline e restituito dopo la prima riga.

7

$/ è LF (U + 000A) per impostazione predefinita. Questo è lo stesso carattere prodotto da "\n"[1]. Quindi, a meno che tu non abbia cambiato $/, $/ e "\n" sono equivalenti. Se hai cambiato $/, solo tu sai perché, e quindi solo tu sai se $/ o "\n" è più appropriato.


  1. Su antiche scatole di MacOS, default $/ s' era CR (U + 000D), ma questo è anche ciò che "\n" prodotte lì.