Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

How to ask user for file name and save the output to a new text file

by mmazlan67 (Novice)
on Jun 19, 2017 at 03:36 UTC ( #1193076=perlquestion: print w/replies, xml ) Need Help??
mmazlan67 has asked for the wisdom of the Perl Monks concerning the following question:

Hi, i am really new to Perl because before this i worked on Excel VBA. For now i have 3 different perl scripts in VNC that i plan to combine them into one.

The first script will ask user for file name (e.g summary.txt), find the matching string in the summary.txt and saved the output in inout.txt using command on console "perl step1.pl summary.txt > inout.txt". But error will occur Then, i run the second script just to take all the necessary data based on the requirement and saved the output in result.txt using command on console "perl step2.pl inout.txt > result.txt. The third script will send result.txt to an email which can be viewed in Windows. I know that it is possible but i have no idea on how to do it as i got stuck on thinking how to open summary.txt file to read and open inout.txt to write at the same time.

I add this code below in step1.pl but then i cannot run the script on console using "perl step1.pl summary.txt > inout.txt"

print "Enter the name of the file: "; my $base_dir = <>; chomp($base_dir);open( my $DATA, "<" , $base_dir) or die "Can't open f +ile '$base_dir': $!"; while ( <$DATA> )

step1.pl

#! /tools/perl/5.8.8/linux/bin/perl use strict; use warnings; while (<>) { 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 "$_"; } }

step2.pl

#! /tools/perl/5.8.8/linux/bin/perl use strict; use warnings; while ( <> ) { #if 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"; }

step3.pl

#! /tools/perl/5.8.8/linux/bin/perl use strict; use warnings; my $name='inoutdata'; system("uuencode /home/user/set/result.txt | mailx -s '$name' email");

Replies are listed 'Best First'.
Re: How to ask user for file name and save the output to a new text file
by Discipulus (Monsignor) on Jun 19, 2017 at 07:50 UTC
    Hello mmazlan67 and welcome to the monastery and to the wonderful world of Perl!

    > got stuck on thinking how to open summary.txt file to read and open inout.txt to write at the same time.

    This is very simple: you open a filehandle in read mode and another in write mode. You use the diamond operator <> too much: it is handy but also magic, infact instead of print "Enter the name of the file: "; my $base_dir = <>; you better my $base_dir = <STDIN>; ( $userinput is a better name than $base_dir anyway..) so start out with plain things:

    # never forget the following!!! use strict; use warnings; # use diagnostics; # this can be skipped but is useful when starting # grab user input.. # choose a file name for the out file.. ... open my $readhandle, '<', $filetoread or die "Unable to read [$filetor +ead]!"; open my $writehandle '>', $filetowrite or die ""Unable to write [$file +toread]!"; # not <> but a named lexical filehandle while (<$readhandle>){ if ($_ =~ /somethingtosearch/){ # print to the write file print $writehandle $_; } } # always explicitally close filehandle: Perl will normally does the ri +ght thing but it is safer to close them anyway (good habit) close $readhandle; close $writehandle; # take the file and attach to an email ...

    This is the basic. After you have a working skeleton code you can add some more feature as more error control or a more elegant way to parse command line arguments aka Getopt::Simple or Getopt::Long

    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, i get to understand the code more now, however i am a bit confused with this part:

      # grab user input.. print "Enter the name of the file: "; my $userinput = <STDIN>; chomp($userinput);
      # choose a file name for the out file..

      How do i choose the file name for outfile? Is it like asking user for two file name? Sorry as i am just a beginner for this language

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

    Hello mmazlan67,

    I see the fellow monk Discipulus provided you with an answer to your problem, so there is not much that I can add here. Though I wanted to ask you why you are running 3 scripts and not combining all of them in one?

    Give it a try, and if you encounter any problems post your code with the error output here and we will be more than happy to review it and assist you as much as possible.

    Hope this helps, BR

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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1193076]
Approved by Discipulus
Front-paged by Corion
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (10)
As of 2017-09-20 12:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    During the recent solar eclipse, I:









    Results (236 votes). Check out past polls.

    Notices?