in reply to Re^3: 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

Hi again, i did tried combine but somehow this errors appear.Is it what i am doing is totally wrong?

String found where operator expected at step1_inpout.pl line 21, near "$writehandle "+>"" (#1) (S syntax) The Perl lexer knows whether to expect a term or an ope +rator. If it sees what it knows to be a term when it was expecting to see + an operator, it gives you this warning. Usually it indicates that an operator or delimiter was omitted, such as a semicolon. (Missing operator before "+>"?) String found where operator expected at step1_inpout.pl line 23, near "$outputhandle ">"" (#1) (Missing operator before ">"?) syntax error at step1_inpout.pl line 21, near "$writehandle "+>"" syntax error at step1_inpout.pl line 23, near "$outputhandle ">"" Execution of step1_inpout.pl aborted due to compilation errors (#2) (F) Probably means you had a syntax error. Common reasons include +: A keyword is misspelled. A semicolon is missing. A comma is missing. An opening or closing parenthesis is missing. An opening or closing brace is missing. A closing quote is missing. Often there will be another error message associated with the synt +ax error giving more information. (Sometimes it helps to turn on -w. +) The error message itself often tells you where it was in the line +when it decided to give up. Sometimes the actual error is several toke +ns before this, because Perl is good at understanding random input. Occasionally the line number may be misleading, and once in a blue + moon the only way to figure out what's triggering the error is to call perl -c repeatedly, chopping away half the program each time to se +e if the error went away. Sort of the cybernetic version of S<20 questions>. Uncaught exception from user code: syntax error at step1_inpout.pl line 21, near "$writehandle "+ +>"" syntax error at step1_inpout.pl line 23, near "$outputhandle ">"" Execution of step1_inpout.pl aborted due to compilation errors. at step1_inpout.pl line 46

This is my code

#! /tools/perl/5.8.8/linux/bin/perl use strict; use warnings; use diagnostics; # grab user input.. print "Enter the name of the file to read: "; my $filetoread = <STDIN>; chomp($filetoread); print "Enter the name of the file to write: "; my $filetowrite = <STDIN>; chomp($filetowrite); print "Enter the name of the output file: "; my $fileoutput = <STDIN>; chomp($fileoutput); open my $readhandle, "<", $filetoread or die "Unable to read '$filetor +ead'"; open my $writehandle "+>", $filetowrite or die "Unable to write '$file +towrite'"; open my $outputhandle ">", $fileoutput or die "Unable to write '$fileo +utput'"; while (<$readhandle>) { if ($_ =~ /^\s\s(\S+)*delay\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+ +(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+) +/) { print $writehandle $_; } } while(<$writehandle>) { my ( $set ) = m/^\s+(\S+)/; #get the first word my ( $name,$value ) = m/-name (\S+) (\S+)/; #get the name and + value my ( $mode ) = m/mode == (\S+)\"/; #get the mode print "$mode $name $set $value\n"; } close $readhandle; close $writehandle;

Replies are listed 'Best First'.
Re^5: How to ask user for file name and save the output to a new text file
by marto (Cardinal) on Jun 19, 2017 at 09:26 UTC

    Your use of open is inconsistent, consider:

    open (my $readhandle, "<", $filetoread) or die "Unable to read '$filetoread': $!"; open (my $writehandle,"+>", $filetowrite) or die "Unable to write '$filetowrite': $!"; open (my $outputhandle, ">", $fileoutput) or die "Unable to write '$fileoutput': $!";

    Note the use of brackets and the comma after the file handle.

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
    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.

      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.
Re^5: How to ask user for file name and save the output to a new text file
by thanos1983 (Parson) on Jun 19, 2017 at 09:36 UTC

    Hello again mmazlan67,

    You are getting that much error output because of use diagnostics;. For the moment comment out this module with # use diagnostics;

    The reason that you are getting this error is ,, notice the comma on your previous open call, also update the next one that is complaining. ;).

    Hope this helps, BR

    Seeking for Perl wisdom...on the process of learning...not there...yet!

      Hi, thanks!! After i deleted use diagnostics;, it works fine now. Just need to solve on the looping part. Thanks !!

        Hello again mmazlan67,

        Provide us the latest version of your script, also the input parameters that you are using, the current output/behavior that you are getting and finally describe with words the desired output/behavior.

        I am sure that in matter of a few minutes after providing all of these data you will get many different approaches possibly faster and better of your current implementation. :D

        Help us to help you. This is how all of us started to learn. :D

        Hope this helps, BR.

        Seeking for Perl wisdom...on the process of learning...not there...yet!