Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

Ovid (2709)

Ovid
  (email not shown publicly)
http://publius-ovidius.livejournal.com/
AOL IM: ovidperl (Add Buddy, Send Message)

Stuff with the Perl Foundation. A couple of patches in the Perl core. A few CPAN modules. That about sums it up.

Journal of Ovid (2709)

Thursday September 08, 2005
12:22 PM

Spot the Bug

[ #26645 ]

Late at night, lots of coding and a little test program confused me for a moment until I looked at it again and almost laughed myself silly. I needed to test that I could read individual records in a file. The records are separated by a lone dot "." appearing by itself on a line. My intention was to open the file, read in individual records, remove that trailing dot and visually inspect the records one by one. Spot the bug:

#!/usr/bin/perl

use strict;
use warnings;

my $file = shift || die "No file, dummy!";
open FH, "<", $file or die "Could not open ($file) for reading: $!";
local $/ = "\n.\n";

while (defined (my $record = <FH>)) {
    chomp $record;
    print $record;
    <STDIN>;
}

Moral of this story: don't code while tired.

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • I stared at it and stared at it but didn't see it until I actually tried the code. Then it hit me; "$/ has been modified so it's hanging at the <STDIN>!" Thanks for a very fun lunchtime distraction.

    #!/usr/bin/perl
    use strict;
    use warnings;

    my $file = shift || die "No file, dummy!";
    open FH, "<", $file or die "Could not open ($file) for reading: $!";
    my @records;

    {
      local $/ = "\n.\n";
      chomp(@records = <FH>);
    };

    for my $record (@records) {
        print $record;
        <

  • Hehe. I did spot it without running the code – after I stepped out of the box and started thinking about what things it does other than its primary goal. It took about three minutes of staring.

    I can’t think of a solution that is compact, non-obfuscatory, and avoids redundancy (ie setting $/ twice) all at once. The best I can do is

    while( 1 ) {
        do {
           local $/ = "\n.\n";
           my $record = <FH>;
           last if no

    • this should be a property of the filehandle, not a global variable.

      Perl 6, baby, Perl 6.