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

hello again,

this is up to you: you can ask again via STDIN as you have done for the first file or you can hardcode the name into the script or you can craft it using the program name or the first file name:

# option 1 print "Enter the name for the output file:\n"; my $outfile = <STDIN>; chomp $outfile; #parens not needed # option 2 my $outfile = 'output.txt'; # option 3a my $outfile = $firstfilename.'.out'; # option 3b - using $0 aka the current program filename use File::Basename qw(basename); my $outfile = (basename $0).'.out';

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^4: How to ask user for file name and save the output to a new text file
by mmazlan67 (Novice) on Jun 19, 2017 at 09:15 UTC

    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;

      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.

      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,

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