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

Hi. I'm a long time user (and lover) of Perl, but only recently I decided learn OO Perl, and as an excercise I chose to rewrite my old IRC bot. There's just one problem that I've been stuck with for days now. I've tried reading about every possible documentation available that could guide me to the correcct direction and dug Google upside down, but so far have come out empty-handed... =(

I don't really know how to explain this, so I'll let the code speak for itself:

sub joinChannel { my $self = shift; open ( ${ $self->{LOGHANDLE} }, '>>', $self->{LOGFILE}) or croak("Failed to open " . $self->{LOGFILE}); $self->SUPER::sendStr("JOIN " . $self->{NAME}); }

The problem is the open() line. No matter what I do, I can't seem to be able to open the file with $self->{LOGHANDLE} as the file handle..

I tried Alias and its attr(), but for some reason I couldn't get it to work. It compiled and ran fine, but the log file stayed empty.

I also tried to use a local variable as the file handle when opening the file and then assigning its ref or value to $self->{LOGHANDLE}, but it didn't produce any output to the log file either.

Any help would be appreciated a lot.

Thanks in advance,
Joeli

Replies are listed 'Best First'.
Re: How to open() something in a hash?
by GrandFather (Saint) on Jan 24, 2009 at 00:56 UTC

    How are you using the file handle (specific code sample required here!)? The following works for me:

    use strict; use warnings; my $str; my $self = bless {}; open $self->{fh}, '>', \$str; my $fh = $self->{fh}; # Perl gets confused unless globs are simple sca +lars print $fh "Hello world\n"; close $self->{fh}; print $str;

    Prints:

    Hello world

    Perl's payment curve coincides with its learning curve.
      Alternatives to
      my $fh = $self->{fh}; print $fh "Hello world\n";
      are
      print { $self->{fh} } "Hello world\n";
      and
      use IO::Handle qw( ); $self->{fh}->print("Hello world\n");

      Strange how you find the answer yourself just when you've asked for help... =)

      You're right, there was nothing wrong with opening the file. I just had forgotten to do $self->{LOGHANDLE}->autoflush(1) which was kinda essential since my tests consisted of starting up the bot, spamming a few lines in irc to see if it logged anything and then killing it with ^C since I hadn't bothered to implement any cleaner way to shut down the bot yet. =)

      By the way, you can use  print { $self->{fh} } "Hello world\n"; to print to a file handle that isn't just a simple scalar. ;)

      Thanks for the help anyways!