regularny vyraz na prehladavanie viac riadkov.

Honza Pazdziora adelton na informatics.muni.cz
Pátek Listopad 30 12:49:31 MET 2001


On Fri, Nov 30, 2001 at 12:34:31PM +0100, Marian Cavojsky wrote:
> > 
> > Tecka v regularnim vyrazu defaultne nematchuje na \n, takze to .*?
> > nepreleze na dalsi radek, kde by to datum slo nalezt. Pouzijte /s.
> 
> Nefunguje ani /s ani /ms
> 
> posielam program:
> $date = '';
> $buffer = '';
> open FILEIN, "<".$ARGV[0] or die( "Error: '".$ARGV[0]."'");
> while( <FILEIN>){
>   if( /^From /){
>     if( $date ne ''){
>       $date = $2.$1 if( $buffer =~ /Received:.*?\d?\d\s(\w{3})\s(\d{4})/ms);
>       open FILE, ">>".$ARGV[0].".".$date or die( "Error: '".$ARGV[0]."'");
>       print "Append '".$ARGV[0].".".$date."'\n";
>       print FILE $buffer;
>       close FILE;
>       $buffer = '';
>     }
>   }
>   $buffer .= $_;
> }
> close FILEIN;

Neda se predpokladat, ze na radku, ktery je pokracovaci v Received:,
je na zacatku zaroven From_. Coz je presne to, do ceho Perl tim
if (/^From /) { nutite. Proc to proste nenastete jako jeden retezec (at
uz po radkach nebo pomoci $/ = undef) a pak na to jednou nepustite
Received? Dostal byste prvni rozumny match a bylo by po problemu.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
   .project: Perl, DBI, Oracle, MySQL, auth. WWW servers, DBD::XBase.
------------------------------------------------------------------------


Další informace o konferenci Perl