jptxs has asked for the wisdom of the Perl Monks concerning the following question:

trying to write simple script to put lines into error msgs

code:
1 # progam to place line numbers in all error messages
2 use strict;
3
4 my @this = qx(ls *pl); #adjust this to grab your programs
5 my $die = qq!dienice("!; #string starting die message
6
7 foreach my $file (@this) {
8 chomp $file;
9 open(SCRIPT, '$file') || die "$file DIE DIE DIE!!!!! $!";
10
11 my $line_num = 0;
12 my $test = 0;
13
14 my @newfile = <SCRIPT>;
15 close SCRIPT;
16
17 foreach my $line ( @newfile ) {
18 $line_num++;
19 if ( $line =~ m/$die/ ) {
20 $line =~ s/$die\d+\b/$die$line_num /i;
21 $test = 1;
22 }
23
24 open(NEW, '>$file') || die "DIE DIE DIE!!!!! $!";
25 print NEW "@newfile";
26 close NEW;
27 }
28 }

getting 'delete_tmp.pl DIE DIE DIE!!!!! No such file or directory at fixLines line 9'

when ls gives:

./ delete_tmp.pl* frontpage.pl* index.pl* update_tmp.pl*
../ fixLines include.pl* rep_req.pl*

Replies are listed 'Best First'.
Re: 'no such file' when it's there.
by merlyn (Sage) on Aug 31, 2000 at 07:25 UTC
    If I read your quotes right, you have
    9 open(SCRIPT, '$file') || die "$file DIE DIE DIE!!!!! $!";
    Ahh yes, the cut-n-paste reveals it. You are opening up a file named "dollar eff eye ell eee". Do you really have a file by that name? Drop the quotes, or change to double quotes, and you'll see a remarkable improvement in execution.

    And please change

    qx(ls *pl)
    to a simpler kinder gentler more accurate
    glob "*pl"
    or if that doesn't work
    <*pl>
    Thanks!

    -- Randal L. Schwartz, Perl hacker

      all i can say is "duh on me" :)
Re (tilly) 1: 'no such file' when it's there.
by tilly (Archbishop) on Aug 31, 2000 at 07:14 UTC
    I would say that you are probably not in the directory that you think you are when you die. Test -e. Use Cwd and print the current directory. Run ls from within Perl.

    As for other comments, first of all just don't include a return in your die and you get the line number. See the message you quote for an example. So you don't need to put it in your scripts, Perl does it for you, and will keep the line numbers correct after every edit to the script.

    Secondly you don't need to track line numbers in files you are reading, Perl does it for you in the special variable $. (see perlvar).

    Thirdly you are not consistently putting filenames in your error messages. That really is a good habit to get into.

    And finally, I would personally get irritated with a script that told me, "DIE DIE DIE!!!". All caps means yelling to me. I am perfectly capable of seeing that you died. I don't particularly need to be yelled at while I am trying to fix it...

      sorry to yell, didn't think about changing that before poting last time.

      maybe I'm just using it wrong, but $. doesn't seem to behave as I'd expect.

      i did:

      15 foreach my $line ( @newfile ) {
      16 if ( $line =~ m!dienice\("\d+\b! ) {
      17 $line =~ s!dienice\("\d+\b!dienice\("$. !i;
      18 $test = 1;
      19 } elsif ( $line =~ m!dienice\("\D+\b! ) {
      20 $line =~ s!dienice\("(\D+)\b!dienice\("$. $1 !i;
      21 $test = 1;
      22 }

      then printed to the old filename. it all works except all the numbers are 0. as in the replaced lines look like :

      "...or dienice("0 Can't connect to Oracle database..."

      where 0 is where one would expect the line number. there were no line numbers or incorrect ones before, so this is progress. i tried my old syntax with the $line_num++, and that works, but I'd much rather use your suggestion as it's cleaner. any ideas?

        $. is the line number on the most recent filehandle read, and reset when the file is closed. You're now wandering through an array, not reading a file, so the $. won't make any sense or correlation. If you want an element number, do this:
        for my $line (0..$#newfile) { .. access $newfile[$line] .. if error, talk about "line number $line" }

        P.S. in the future, please enclose your code in CODE tags. Much easier to read.

        -- Randal L. Schwartz, Perl hacker

Re: 'no such file' when it's there.
by chromatic (Archbishop) on Aug 31, 2000 at 07:18 UTC
    I like the special reserved word __LINE__ for telling me what line of the script I'm on when something special happens. Like tilly said, though, there's no real need 'cuz Perl's good at reporting it anyway.
Re: 'no such file' when it's there.
by gnat (Beadle) on Aug 31, 2000 at 23:04 UTC
    There was another problem with the original code:
    @files = qx(ls *.pl);
    won't trim the newlines off the lines returned by ls.

    Cheers; nat