abstracts File :: Slurp via la roba IO file e solo restituisce una stringa per voi.
Esempi
while(my $line = <$foo>){
$line =~ $regex;
}
Data la notazione di cui sopra, un sistema operativo che non comprende i delimitatori dei file \ n 'o' \ r ', nello scenario predefinito con il delimitatore predefinito del sistema operativo impostato per $/
provocherà la lettura dell'intero file come una stringa contigua (a meno che la stringa ha delimitatori del $ OS in esso, dove sarà delimitare con questo)
Quindi, in questo caso, tutte queste espressioni regolari sono inutili:
/\R*$//
: servirà solo a cancellare l'ultima sequenza di \R
nel file
/\R*//
: Solo e rase la prima sequenza di \R
nel file
/\012?\015?//
: Quando si cancella solo la prima 012\015
, \012
, o sequenza \015
, \015\012
si traduca in \012
o \015
emessa.
/\R*$//
: Se vi capita di essere non sequenze di byte di '\ 015 $ OSDELIMITER' nel file, quindi poi NO interruzione di linea saranno rimossi se non per quelle proprie della OS.
Sembrerebbe nessuno ottiene ciò di cui sto parlando, ecco esempio di codice, cioè testati-NON linea di rimuovere feed. Eseguilo, vedrai che lascia i linefeed dentro.
#!/usr/bin/perl
use strict;
use warnings;
my $fn = 'TestFile.txt';
my $LF = "\012";
my $CR = "\015";
my $UnixNL = $LF;
my $DOSNL = $CR . $LF;
my $MacNL = $CR;
sub generate {
my $filename = shift;
my $lineDelimiter = shift;
open my $fh, '>', $filename;
for (0 .. 10)
{
print $fh "{0}";
print $fh join "", map { chr(int(rand(26) + 60)) } 0 .. 20;
print $fh "{1}";
print $fh $lineDelimiter->();
print $fh "{2}";
}
close $fh;
}
sub parse {
my $filename = shift;
my $osDelimiter = shift;
my $message = shift;
print "Parsing $message File $filename : \n";
local $/ = $osDelimiter;
open my $fh, '<', $filename;
while (my $line = <$fh>)
{
$line =~ s/\R*$//;
print ">|" . $line . "|<";
}
print "Done.\n\n";
}
my @all = ($DOSNL,$MacNL,$UnixNL);
generate 'Windows.txt' , sub { $DOSNL };
generate 'Mac.txt' , sub { $MacNL };
generate 'Unix.txt', sub { $UnixNL };
generate 'Mixed.txt', sub {
return @all[ int(rand(2)) ];
};
for my $os (["$MacNL", "On Mac"], ["$DOSNL", "On Windows"], ["$UnixNL", "On Unix"]){
for (qw(Windows Mac Unix Mixed)){
parse $_ . ".txt", @{ $os };
}
}
Per l'uscita Lordo CHIARAMENTE, vedere qui: http://pastebin.com/f2c063d74
Nota ci sono alcune combinazioni che di lavoro del corso, ma sono probabilmente quelli che da soli ingenuamente alla prova.
Si noti che in questa uscita, tutti i risultati devono essere del modulo >|$string|<>|$string|<
con NO LINE FEED da considerare uscita valida.
e $string
è la forma generale {0}$data{1}$delimiter{2}
dove in tutte le fonti di uscita, ci dovrebbe essere:
- nulla tra
{1}
e {2}
- solo
|<>|
tra {1}
e {2}
Se l'operatore <> riconosce le nuove linee, non morde? – outis
Ma l'operatore <> non riconosce correttamente le newline e oltre all'utilizzo di <> è un caso speciale, l'input non viene sempre da un file. – Christoffer
o esegue il codice che ho appena incollato o letto l'output allegato che genera. Spero che vedrai il punto che sto cercando di fare. La condizione "mista" è di gran lunga la peggiore. –