Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Read bzip2 directly into array

by Happy-the-monk (Monsignor)
on Apr 03, 2012 at 09:03 UTC ( #963196=note: print w/ replies, xml ) Need Help??


in reply to Read bzip2 directly into array

You are not showing is the exact code you are using when you get to the named error message Can't use an undefined value as an array reference...

The code you show will produce the following message: Global symbol "@apple" requires explicit package name at $0 line 6.

Test with this: perl -e 'use strict; my $buffer = \@apple'

So what is the code you are actually using?

Cheers, Sören


Comment on Re: Read bzip2 directly into array
Re^2: Read bzip2 directly into array
by prescott2006 (Acolyte) on Apr 03, 2012 at 11:22 UTC
    Sorry, I forgot to define the array when I type the code here.
    #!/usr/bin/perl use Data::Dumper; use strict ; use warnings ; use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ; use IO::File ; my $input = new IO::File "<tmp.bz2" or die "Cannot open 'tmp.bz2': + $!\n" ; my @apple; my $buffer = \@apple; bunzip2 $input => $buffer or die "bunzip2 failed: $Bunzip2Error\n +"; foreach (@{$buffer}) { if (/good(.*)/) { print $1; } }
    This is the code I wrote to read a txt contain in tmp.bz2 which contain: goodmorning goodbye goodafternoon and supposed to output: morning bye afternoon but it doesn't work.

      ... if (/good(.*)/)

      This is much better.
      Although $buffer now contains:

      $VAR1 = \[ \'goodmorning goodbye goodafternoon ' ];

      So although there's your array, it only contains scalar value referenced inside. I think that's not the behaviour you expected from the IO::Uncompress::Bunzip2 documentation talking about arrays.
      There it says:

      If $output is an array reference, the uncompressed data will be pushed onto the array.

      That is, all of the bunzipped data is pushed onto the array, so you can fill your array with data from several bunzipped files.

      Change the matching to if ($$_ =~ /good(.*)/) to make your code output the value.

      If you also want to break the result into a list, use split to do that.

      Cheers, Sören

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://963196]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (11)
As of 2014-11-26 15:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (171 votes), past polls