Hello again
mmazlan67,
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*
There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.