in reply to While loop not printing anything after using grep

Welcome to the monastery. :)

Please put <code> </code> tags around your code and data!

From what I can decipher

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^2: While loop not printing anything after using grep
by skjeiu (Novice) on Dec 29, 2020 at 16:25 UTC

    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.

      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.

      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.