if you use seek you still go in direction of complexity while will be better to semplify your program flow filling a @results array.
As general rule when you can avoid to read or to write to a file do it: filesystem is the sloooowest part of your PC and expose you to more errors.
If I understand your needs you just need one file to read from: use it and close it as soon as possible.
I propose below an example program very similar to what already showed: I need to guess about your data and so the regex part is surely to be reviewed (but see my comment about your regexes!).
I also added a bit of debug to the screen and the mail composition using CDO.sys windows component: usig OLE object is not so funny but is better than piping a mail into an external program, imho.
I wish you to learn something from my code and go to perldoc for everything you possibly do not understand like $0 $. $1 $2 ...
have fun!
# never forget the following!!! use strict; use warnings; # use diagnostics; # this can be skipped but is useful when starting # if you want to send the mail using the win32 component CDO.sys you n +eed: use Win32::OLE; # grab user input.. # ask for a file to read unless it was specified in the commandline my $filetoread; unless ($filetoread = $ARGV[0]){ print "Enter a filename to read from:\n"; $filetoread = <STDIN>; chomp $filetoread; # check if the file exists die "File [$filetoread] does not exists or cant be accessed" unless +-e $filetoread; } # use an array to accomulate the results my @results; open my $readhandle, '<', $filetoread or die "Unable to read [$filetor +ead]!"; while (<$readhandle>){ # your first regex is unuseful: # $_ =~ /^\s\s(\S+)*delay\s+(\S+)\s+(\S+)\ .... # you use () which are capturing groups in regexes and populate +$1,$2.. # you never use them in your program! # # In your following regex you use: # -->my ( $name,$value ) = m/-name (\S+) (\S+)/; #get the name +and value # this does NOT get name nor values # I try to guess your data and then i push in @results array #set goes in $1 $2 $3 $4 if ($_ =~ /\s+(\S+).*-name\s+(\S+)\s(\S+).*mode\s==\s(\S+)/){ # print to console some useful info ($. is the current line +number) print "$filetoread:$. match the pattern given\n"; # push into result array a composed string push @results, "$1 $2 $3 $4\n"; } # print to console skipped lines else{ print "skipping line $.\n"; } } # always explicitally close filehandle: Perl will normally does the ri +ght thing # but it is safer to close them anyway (good habit) close $readhandle; # again someting useful to check: exit the program if nothing was foun +d unless (@results){ print "Nothing found in file [$filetoread]\nexiting..\n"; exit; } # if here, so there is someting to work with print "Found ", @results, " useful lines\n"; # use the CDO.sys object via Win32::OLE to compose and create the mail # something like (modified/untested) the following: my $mail = Win32::OLE->new("CDO.Message"); $mail->{From}="$0\@yourloaclsystem.org"; $mail->{To}='destination@domain.org'; $mail->{Subject}="results from $0 ".scalar localtime(time); # fill the body foreach my $entry (@results){ $mail->{TextBody}.=$entry; } my $conf = Win32::OLE->new ("CDO.Configuration") ; my $fields = $conf->{Fields}; $fields->{"http://schemas.microsoft.com/cdo/configuration/sendusing"}= +2; $fields->{"http://schemas.microsoft.com/cdo/configuration/smtpserver"} +="your.usable.smtp.server.or.relayserver.org"; $fields->{"http://schemas.microsoft.com/cdo/configuration/smtpserverpo +rt"}=25; $fields->Update(); $mail->{Configuration} = $conf; $mail->Send()|| warn Win32::OLE->LastError();
L*
In reply to Re^7: How to ask user for file name and save the output to a new text file -- code sample
by Discipulus
in thread How to ask user for file name and save the output to a new text file
by mmazlan67
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |