For Programmers: Free Programming Magazines  


Home > Archive > PERL Beginners > February 2005 > printing lines from a file









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author printing lines from a file
Christopher Spears

2005-02-27, 3:55 am

Here is some code I am working on:

#!/bin/perl -w
use strict;

my $number_of_args = @ARGV;

open STDERR, ">./caught_errors" or die "Can't create
caught_errors: $!";

if ($number_of_args == 0) {
print "Not enough arguments!\n";
print "Usage: ./cedit somefile.C++\n";
print "Usage (optional): ./cedit somefile.C++
outputfile\n";
} elsif ($number_of_args == 1) {
system "g++", $ARGV[0];
open CAUGHTERRORS, "caught_errors" or die "Can't
open file: $!";
chomp(my $line = <CAUGHTERRORS> );
until (my $line =~ /^\s*$/) {
chomp($line = <CAUGHTERRORS> );
print $line."\n";
}
close CAUGHTERRORS;
} elsif ($number_of_args == 2) {
system "g++", $ARGV[0], "-o", $ARGV[1];
} else {
print "Too many arguments!\n";
print "Usage: ./cedit somefile.C++\n";
print "Usage (optional): ./cedit somefile.C++
outputfile\n";
}

Basically, I am trying automate g++. However, I don't
want any error messages printed to the screen. I want
them saved in a text file called caught_errors. That
part works. After g++ does its business, I want the
script to open the text file and print out any
messages that it sees in there. This is the part I am
having trouble with! This is frustrating because I
know I have done something like this before! Right
now, in caught_errors, I am getting the following
error messages:

hello.c++: In function `int main()':
hello.c++:7: error: syntax error before `return'
Use of uninitialized value in pattern match (m//) at
/home/Christstopher Spears/C++_code/tools/cedit line
16, <CAUGHTERRORS> line 1.

The first two are obviously from the C++ program I
wrote incorrectly to test the script. I don't
understand the third error message. Any hints?

John W. Krahn

2005-02-27, 3:55 am

Christopher Spears wrote:
> Here is some code I am working on:
>
> #!/bin/perl -w
> use strict;
>
> my $number_of_args = @ARGV;
>
> open STDERR, ">./caught_errors" or die "Can't create
> caught_errors: $!";
>
> if ($number_of_args == 0) {
> print "Not enough arguments!\n";
> print "Usage: ./cedit somefile.C++\n";
> print "Usage (optional): ./cedit somefile.C++
> outputfile\n";
> } elsif ($number_of_args == 1) {
> system "g++", $ARGV[0];
> open CAUGHTERRORS, "caught_errors" or die "Can't
> open file: $!";
> chomp(my $line = <CAUGHTERRORS> );
> until (my $line =~ /^\s*$/) {
> chomp($line = <CAUGHTERRORS> );
> print $line."\n";
> }
> close CAUGHTERRORS;
> } elsif ($number_of_args == 2) {
> system "g++", $ARGV[0], "-o", $ARGV[1];
> } else {
> print "Too many arguments!\n";
> print "Usage: ./cedit somefile.C++\n";
> print "Usage (optional): ./cedit somefile.C++
> outputfile\n";
> }
>
> Basically, I am trying automate g++. However, I don't
> want any error messages printed to the screen. I want
> them saved in a text file called caught_errors. That
> part works. After g++ does its business, I want the
> script to open the text file and print out any
> messages that it sees in there. This is the part I am
> having trouble with! This is frustrating because I
> know I have done something like this before! Right
> now, in caught_errors, I am getting the following
> error messages:
>
> hello.c++: In function `int main()':
> hello.c++:7: error: syntax error before `return'
> Use of uninitialized value in pattern match (m//) at
> /home/Christstopher Spears/C++_code/tools/cedit line
> 16, <CAUGHTERRORS> line 1.
>
> The first two are obviously from the C++ program I
> wrote incorrectly to test the script. I don't
> understand the third error message. Any hints?


The third message is from perl. When you redirect STDERR then all of perl's
warning and error messages go to the file as well as all child (g++) warning
and error messages. There is a FAQ on redirecting STDERR:

perldoc -q "How can I capture STDERR from an external command"


Also you are not reading from the file correctly:

> open CAUGHTERRORS, "caught_errors" or die "Can't
> open file: $!";
> chomp(my $line = <CAUGHTERRORS> );
> until (my $line =~ /^\s*$/) {
> chomp($line = <CAUGHTERRORS> );
> print $line."\n";
> }
> close CAUGHTERRORS;


Should be:

open CAUGHTERRORS, "caught_errors" or die "Can't open file: $!";
while ( my $line = <CAUGHTERRORS> ) {
last if $line =~ /^\s*$/;
print $line;
}
close CAUGHTERRORS;

Which will read from the file without producing the warning message above.



John
--
use Perl;
program
fulfillment
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com