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

Re: Grep en perl



El día 27 de octubre de 2008 15:54, Pablo Jiménez <pejimene@vtr.net> escribió:
> 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
>
>
> --
> To UNSUBSCRIBE, email to debian-user-spanish-REQUEST@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
>
>

Hola,

ya está solucionado. El gran fallo que estaba a tener es que tenía el
$body_str como un string y no como un vector. Al ver la idea del
split, lo conseguí poner en vector y el problema ya tuvo fácil
solución :)

Gracias por las aportaciones!

-- 
Power by Debian.

A greeting,
Javier.


Reply to: