Nota de 2017: File :: Slurp no se recomienda debido a errores de diseño y errores no mantenidos. Use File::Slurper o Path::Tiny en su lugar.
se extiende en su respuesta
use File::Slurp();
my $value = File::Slurp::slurp($filename);
$value =~ s/\R*//g;
resúmenes File :: Slurp distancia del archivo IO cosas y simplemente devuelve una cadena para usted.
NOTA
importante tener en cuenta la adición de /g
, sin que, dada una cadena de múltiples líneas, un viaje de solo reemplazar el carácter ofensivo primera.
Además, la eliminación de $
, que es redundante para este propósito, ya que queremos despojar todos los saltos de línea, no sólo los saltos de línea antes de lo que se entiende por $
en este sistema operativo.
En una cadena de múltiples líneas, $
coincide con el final de la cadena de y que sería problemático).
El punto 3 significa que el punto 2 se realiza suponiendo que también desea usar /m
; de lo contrario, '$' no tendría sentido para nada práctico en una cadena con> 1 línea, o haciendo un procesamiento de línea única , un sistema operativo que en realidad entiende $
y se las arregla para encontrar el \R*
que proceden del $
Ejemplos
while(my $line = <$foo>){
$line =~ $regex;
}
Dada la notación anterior, un sistema operativo que no comprende los delimitadores de sus archivos '\ n' o '\ r', en el escenario predeterminado con el delimitador predeterminado del sistema operativo establecido para $/
dará como resultado la lectura de todo el archivo como una cadena contigua (a menos que su cadena tiene delimitadores de los $ OS en el mismo, donde se delimitará por eso)
Así que en este caso todas estas expresiones regulares son inútiles:
/\R*$//
: sólo se borrará la última secuencia de \R
en el archivo
/\R*//
: Solo e rase la primera secuencia de \R
en el archivo
/\012?\015?//
: Cuando sólo se borrará el primero 012\015
, \012
, o \015
secuencia, \015\012
den lugar a \012
o \015
siendo emitida.
/\R*$//
: Si sucede que hay no hay secuencias de bytes de '\ 015 $ OSDELIMITER' en el archivo, a continuación, a continuación, se eliminarán NO saltos de línea a excepción de las propias del sistema operativo.
Al parecer, nadie se lo que estoy hablando, asi que aquí hay código de ejemplo, que es a prueba a NO alimenta la línea de eliminación. Ejecútalo, verás que deja los avances de línea.
#!/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 };
}
}
Para la salida sin procesar CLARAMENTE, ver aquí: http://pastebin.com/f2c063d74
Nota hay ciertas combinaciones que de trabajo del curso, pero probablemente son los que usted mismo ingenuamente a prueba.
Tenga en cuenta que en esta salida, todos los resultados deben tener el formato >|$string|<>|$string|<
con SIN ALIMENTACIÓN DE LÍNEA para que se considere salida válida.
y $string
es de la forma general {0}$data{1}$delimiter{2}
donde en todas las fuentes de salida, debe ser:
- nada entre
{1}
y {2}
- única
|<>|
entre {1}
y {2}
Si el operador <> reconoce las líneas nuevas, ¿no las matará? – outis
Pero el operador <> no reconoce líneas nuevas correctamente, y además del uso de <> es un caso especial, la entrada no siempre proviene de un archivo. – Christoffer
ya sea ejecute el código que acabo de pegar o lea la salida adjunta que genera. Esperemos ver el punto que estoy tratando de hacer. La condición "mixta" es de lejos la peor. –