Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re^4: text matching

by prassi (Acolyte)
on Jun 16, 2012 at 06:54 UTC ( [id://976541]=note: print w/replies, xml ) Need Help??


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.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-04-18 00:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found