Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re^5: How to ask user for file name and save the output to a new text file

by Discipulus (Canon)
on Jun 19, 2017 at 09:22 UTC ( [id://1193090]=note: print w/replies, xml ) Need Help??


in reply to Re^4: How to ask user for file name and save the output to a new text file
in thread How to ask user for file name and save the output to a new text file

perl is human friendly; infact a comma is missing after the decalration of the lexical filehandle name:

open my $writehandle "+>", $filetowrite # must be open my $writehandle , "+>", $filetowrite

PS pay attention: while(<$writehandle>) will never work: the pointer is to the end of file when you try to reaad from that handle: You can use seek to rewind it but probalby it will be better another strategy: instead of writing to a file accumulate the output into an array.

Then you can foreach my $line (@out_array){ # do whatever you want...

PPS if you provide an example data you are grabbing and the expected output for sure some monk can suggest a better way to handle your data: I suspect you have a filehandle or two more than necessary..

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.

Replies are listed 'Best First'.
Re^6: How to ask user for file name and save the output to a new text file
by mmazlan67 (Novice) on Jun 20, 2017 at 03:15 UTC

    Hi, thanks, i'll search and understand more on how to use 'seek'. Btw, your solutions really helps me alot. I'll try improving my script using 'seek'. Once again, thanks!!

      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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1193090]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2024-03-29 01:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found