Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re^2: While loop not printing anything after using grep

by skjeiu (Novice)
on Dec 29, 2020 at 16:25 UTC ( [id://11125940]=note: print w/replies, xml ) Need Help??


in reply to Re: While loop not printing anything after using grep
in thread While loop not printing anything after using grep

First of all, I'd like to apologize for not using the HTML tags. I'm learning HTML together with Perl, so thanks for bearing with me during my learning curve and for the warm welcome.


With the feedback I've got so far I managed to get the while loop working the way I wanted! :)


Content of 'input.txt':
Monday
Saturday
Sunday

#!/bin/perl use strict; use warnings; my $input_file = 'input.txt'; my $output_file = 'output.txt'; open(my $in_file,'<', $input_file) or die "Can not open file $input_fi +le for writing: $!.\n"; open(my $out_file,'>', $output_file) or die "Can not open file $output +_file for writing: $!.\n"; if (grep{/Monday/} $in_file) { } else { seek $in_file, 0, 0; while (<$in_file>) { print $out_file $_; if ($. == 1) { print $out_file "Friday\n"; } } } close($in_file); close($out_file);


In the above code, I have two issues:
- Else clause is alwayse executed, why (should only be executed if 'Friday' is not found in 'input.txt')?
- Empty block in the if statement; how can I avoid this?


Output of 'output.txt':
Monday
Friday
Saturday
Sunday


My ultimate gall is to have input.txt populated with 'Friday' if it is missing. As far as I understand it, in Perl you first need to create a new file with the desired output then rename that file to the original name.
So in my case that would be with the rename function:

rename $output_file $input_file;


If there is a better way to get what I want, I'm open to suggestion.

Replies are listed 'Best First'.
Re^3: While loop not printing anything after using grep
by haukex (Archbishop) on Dec 29, 2020 at 16:36 UTC

    See my previous node again:

    Else clause is alwayse executed, why (should only be executed if 'Friday' is not found in 'input.txt')?

    You haven't used the <> operator, as in grep {/Monday/} <$in_file>.

    if ($. == 1) {

    If you use seek, you need to reset $. as I showed.

    Empty block in the if statement; how can I avoid this?

    You can invert the condition in the if, as in if ( !( ... ) ) or if ( not ... ) (just be aware of Operator Precedence and Associativity). Perl also offers the equivalent unless (...) {...}, but IMHO sometimes if (not ... is still more readable than unless (....

    As far as I understand it, in Perl you first need to create a new file with the desired output then rename that file to the original name. So in my case that would be with the rename function

    Yes, that is one way to do it - if you don't mind me plugging my own module, see File::Replace.

Re^3: While loop not printing anything after using grep
by eyepopslikeamosquito (Archbishop) on Dec 29, 2020 at 19:41 UTC

    As far as I understand it, in Perl you first need to create a new file with the desired output then rename that file to the original name. So in my case that would be with the rename function ... If there is a better way to get what I want, I'm open to suggestion.

    You are on the right track. For some history and solutions to this fascinating and tricky problem see this old node Re-runnably editing a file in place, especially its "See Also" section.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (3)
As of 2024-04-20 03:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found