Thanks. Please delete the line: $/ = undef; and let me know if it works.
| [reply] [d/l] |
$/ = undef;
would do. I am a newbie to perl try things to understand | [reply] [d/l] |
#!/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 | [reply] [d/l] [select] |
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>;
| [reply] [d/l] [select] |
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. | [reply] [d/l] |