in reply to Re^3: text matching
in thread text matching

I am running the code in cygwin and here is my complete code.

#!/bin/perl5.8.6 use warnings; use diagnostics; use File::Basename; @files = <../tryremove/*>; #This is the destination path where the comment removed files are crea +ted. $path1 = "C:/Projects/tryremove/c"; foreach my $file (@files) { my $filename =basename($file); open(file1,"$file") or die "The file cannot be opened the $file:$!\n +"; open(file2,">$path1/$filename") or die "The file cannot be opened:$! +\n"; while(!eof(file1)){ $/ = undef; $_ = <file1>; s# .* report [s]? .* ; .* ##sx; print file2 ($_); } close(file1); close(file2); }

Replies are listed 'Best First'.
Re^5: text matching
by frozenwithjoy (Priest) on Jun 16, 2012 at 07:09 UTC

    Thanks. Please delete the line:

    $/ = undef;

    and let me know if it works.

      it worked, can you help out what actually

      $/ = undef;

      would do. I am a newbie to perl try things to understand

        A few things to keep in mind as you write more code.

        • Always use strict;
        • use autodie;
        • When opening file handles, don't use a bare file handle. For example, use $file instead of file
        • When opening file handles, use three arguments: open my $fh, '>', $filename (see this for a brief explanation)
        • I strongly recommend explicitly naming your variables if you and/or your colleagues are learning perl. It can make the code much more readable; for example, compare your while loop to mine.

        I quickly cleaned up the code you posted according to my suggestions so you can see them side-by-side:

        #!/bin/perl5.8.6 use strict; use warnings; use diagnostics; use File::Basename; my @files = <../tryremove/*>; #This is the destination path where the comment removed files are crea +ted. my $path1 = "C:/Projects/tryremove/c"; foreach my $file (@files) { my $filename = basename($file); open $file1, "<", $file; open $file2, ">", "$path1/$filename"; while ( my $line = <$file1> ) { $line =~ s# .* report s? .* ; .* ##sx; print $file2 $line; } close $file1; close $file2; }

        Disclaimer: It's late and I'm pretty sleepy. Although I think it should be fine, test it to make sure it behaves the same as your fixed script!

        - Mike

        That's good to hear!

        $/ is the input record separator and is essentially used to specify what character should be used to delimit lines. The default input record separator is \n (a.k.a. the newline character).

        However, in the context that you have it, $/ = undef; tells perl that there is no input value separator so that the entire line gets read into a scalar on the subsequent line of your script: $_ = <file1>;

Re^5: text matching
by Cristoforo (Curate) on Jun 17, 2012 at 01:13 UTC
    Here is the program using a different approach with the range operator.
    #!/usr/bin/perl use strict; use warnings; while (<DATA>) { if ((my $first = /^\s*#if/) .. (my $last = /^\s*#endif/)) { #print if $first || $last; print unless /^\s*reports?/; } else { print; } }

    Its a neat use of the range, ( .. ), operator.

    Chris

    Update: changed the first print line to more accurately perform what you needed.