[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Grep en perl



On Mon, Oct 27, 2008 at 01:15:58PM +0100, Javier wrote:
> Hola lista,
> 
> estoy escribiendo un programilla en perl muy simple. Coge desde STDIN
> la entrada, que es un correo electrónico y muestra los campos que este
> tiene. Luego, dentro del campo $body (siempre tiene un formato
> específico algo: valor) necesito quedarme sólo con un campo. ¿Cómo
> puedo lograrlo?
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> El programa:
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> my $mbox= \*STDIN;
> my $mb = Mail::MboxParser->new($mbox);
> for my $msg ($mb->get_messages)
> {
> 	my $to = $msg->header->{to};
> 	my $from = $msg->header->{from};
> 	my $subject = $msg->header->{subject} || '<No Subject:>',
> 	my $body = $msg->body($msg->find_body,0);
> 	my $body_str = $body->as_string || '<No message text>';
>  	print   "From: $from\n",
>                   "To: $to\n",
>                   "Subject: $subject\n",
>                   "Message Text: $body_str\n";
> }
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> El mail de entrada:
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Pages: 1
> Receiver:
> Quality: 196
> ...
> GroupID: 16
> CommID: c000000040
> 
> Processing time was 0:39.
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> La idea es leer con el programa esta entrada y luego conseguir
> quedarme en una variable con el valor "c000000040". Alguna idea de
> cómo realizar ese "grep" en perl. Lo intenté, pero en perl no consigo
> sacarlo.

Tal vez algo como lo que sigue te sirva:

sub get_value {
    my $body  = shift || return undef;
    my $re    = shift || return undef;
    my $value = undef;

    if ($body) {
        @$value = grep { /$re/ } split(qr{\n}, $body);
	for my $val (@$value) {
	    print "VALUE $val\n";
	}
    }
    return $value
}

Para tu caso, debieras invocar &get_value de la siguiente manera:

&get_value($body_str, "c000000040");

Saludos.

-- 
Pablo Jiménez


Reply to: