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.
Jest to separator * input *, który można modyfikować, jeśli konieczne jest odczytanie plików zakodowanych w CRLF lub CR. – tadman
'$ /' 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. –
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