2015-07-13 9 views
15

dokumentacji Perla mówi, że $/ jest:

Separator rekordów wejściowych, domyślnie znak nowej linii. Wpływa to na pomysł Perla na to, czym jest "linia".

Tak, jest to w zasadzie źle:

print STDERR $var, $/; 

zamiast:

print STDERR "$var\n"; 

?

Co może pójść źle, jeśli zrobię to pierwsze?

+1

Jest to separator * input *, który można modyfikować, jeśli konieczne jest odczytanie plików zakodowanych w CRLF lub CR. – tadman

+0

'$ /' jest znakiem systemu eol, co jest w porządku, jeśli generowany plik jest przeznaczony tylko do użytku "lokalnego". Jeśli generujesz plik dla INNYCH os, np. jesteś na Linuksie budując plik Windows, wtedy '$ /' jest bezużyteczne. –

+3

Powinieneś naprawdę użyć separatora rekordów * output * '' $ \ '', ale nie widzę w tym nic złego. W rzeczywistości funkcja ['say'] (http://perldoc.perl.org/functions/say.html) robi właśnie to:" 'say LIST' jest po prostu skrótem' {local $ \ = "\ n "; print LIST}' "(Jeśli jesteś na 5.10+, po prostu użyłbym' say' zamiast tego.) – ThisSuitIsBlackNot

Odpowiedz

9

Być może zamiast tego szukasz separatora rekordów wyjściowych?

perldoc perlvar:

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

Separator rekordów wyjściowych dla operatora druku. Jeśli jest zdefiniowana, ta wartość jest drukowana po ostatnich argumentach drukowania. Domyślna wartość to "undef".

Nie można wywołać "output_record_separator()" na uchwycie, tylko jako metodę statyczną. Zobacz IO::Handle.

Mnemonik: ustawiasz "$\" zamiast "\n" na końcu wydruku. Poza tym jest to podobne do $/, ale to właśnie dostajesz "z powrotem" od Perla.

Na przykład

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

Myślę, że to bardzo zły pomysł. Nie wiele modułów zabezpieczy się przed '$ \' przed zmianą, więc globalna zmiana '$ \' spowoduje ich złamanie. Możesz ograniczyć zakres zmiany za pomocą '{local $ \ = $ /; drukuj STDERR $ var; } ', ale to kompletny bałagan w porównaniu do' print STDERR "$ var \ n"; 'lub' say STDERR $ var; '. – ikegami

+2

@ikegami I myślę, że jeśli moduły nie radzą sobie z '$ \' zmianą, jest to błąd w modułach, szczególnie biorąc pod uwagę, że istnieje powszechnie używana opcja wiersza poleceń, która ustawia '$ \' ('-l'). – hvd

+2

@ hvd, Powszechnie używane w jedno-liniowcach, być może, ale podejrzewam, że bardzo niewiele modułów robi 'local $ /;' przed każdym 'print', ponieważ byłoby głupio to zrobić, nawet jeśli uważasz, że to błąd. – ikegami

1

Trzeba rekord wyjściowy separator $ \ jako xxfelixxx odpowiedział.

$/ podczas czytania jest input record separator. Manipulowanie nim może wpłynąć na sposób, w jaki Perl odczytuje dane pliku, które podałeś. Na przykład:

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

Powyższe przyczyny cała zawartość pliku do slurp w skalarnego $ content ponieważ mieliśmy zresetować $/.

Rozważmy poniższy kod:

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

wyjściowa:

Content is line 1 
line 2 
line 3 

Ale jeśli nie wyzerować $ /, jak w poniższym kodzie:

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

wyjście będzie Content is line 1 .

Wynika to z faktu, że separator rekordów wejściowych został ustawiony na znak nowej linii i powrócił po pierwszym wierszu.

7

$/ jest domyślnie LF (U + 000A). Jest to ta sama postać, którą wyprodukował "\n"[1]. Więc jeśli nie zmieniliście $/, $/ i "\n" są równoważne. Jeśli zmieniłeś numer $/, to tylko Ty wiesz, dlaczego, i dlatego tylko Ty wiesz, czy bardziej odpowiednie jest użycie $/ lub .


  1. Na dawnych polach MacOS, domyślnie $/ „s był CR (U + 000D), ale to też co "\n" tam produkowane.
Powiązane problemy