Extraiga texto y escriba en un archivo nuevo en Perl

En pocas palabras, quiero extraer texto de un archivo y guardar ese texto en un archivo nuevo, usando Perl.

Aquí está mi código, hasta ahora:

#!/usr/local/bin/perl

use warnings;
use strict;
use File::Slurp;
use FileHandle;

use Fcntl qw(:DEFAULT :flock :seek); # Import LOCK_* constants

my $F_IN = FileHandle->new("<$ARGV[0]");
my $F_OUT = FileHandle->new(">PerlTest.txt");

while (my $line = $F_IN->getline) {
    $line =~ m|foobar|g;
    $F_OUT->print($line);
    # I want to only copy the text that matches, not the whole line.
    # I changed the example text to 'foobar' to avoid confusion.
}

$F_IN->close();
$F_OUT->close();

Obviamente, está copiando la línea. ¿Cómo puedo extraer e imprimir texto específico de un archivo, en lugar de la línea completa?

preguntado el 12 de junio de 12 a las 20:06

m//g en contexto vacío no tiene sentido. ¿Y qué texto específico quieres copiar? ¿"la gran almohada roja"? -

Bueno, es solo un ejemplo. Podría haberlo hecho foobar, supongo. Lo que me gustaría es buscar en el archivo una cadena, usando expresiones regulares. Si lo encuentra, copie dicha cadena en un archivo. ¿Por qué m//g no tiene sentido? Lo he usado antes para otros trabajos, simplemente no para buscar y extraer texto en un nuevo archivo. Gracias por tu ayuda. -

¿Qué crees que hace m//g en un contexto vacío? Ni siquiera puedo imaginar un significado sensato para ello. -

Bueno, lo he usado antes, similar al anterior, para una expresión regular sustituta, buscando y reemplazando a través de un archivo completo (no línea por línea). Pero yo divago. Cualquiera que sea la forma en que llegue a la solución a la pregunta anterior sería excelente. Gracias. -

Que algo diferente hiciera algo útil no tiene nada que ver con eso que se está discutiendo. No dije que "g" es inútil. -

3 Respuestas

Si solo puede ocurrir una vez por línea:

while (<>) {
   print "$1\n" if /(thebigredpillow)/;
}

Si puede suceder varias veces por línea:

while (<>) {
   while (/(thebigredpillow)/g) {
      print "$1\n";
   }
}

Uso:

script file.in >file.out

Respondido 04 Jul 16, 20:07

Podría usar paréntesis de captura para tomar la cadena coincidente:

while (my $line = $F_IN->getline) {
    if ($line =~ m|(thebigredpillow)|) {
        $F_OUT->print("$1\n");
    }
}

Vea perldoc perlre.

Respondido 04 Jul 16, 20:07

#!/usr/local/bin/perl

use warnings;
use strict;
use IO::All;

my @lines = io($ARGV[0])->slurp;

foreach(@lines) {
    if(/thebigredpillow/g) {
        $_ >> io('PerlTest.txt');
    }
}

Respondido el 12 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.