Boulder-Util

 view release on metacpan or  search on metacpan

lib/Boulder/Util.pm  view on Meta::CPAN

    local ($,) = '';
    local ($\) = '';
    $data = [$data] if ( ref($data) eq 'HASH' );
    foreach my $rec (@$data) {
        my $param;
        foreach $param ( keys %$rec ) {
            my ($escaped_param) = escape($param);
            my @vals =
              ref( $rec->{$param} ) eq 'ARRAY'
              ? @{ $rec->{$param} }
              : ( $rec->{$param} );
            my $v;
            foreach $v (@vals) {
                print $filehandle "$escaped_param=", escape("$v"), "\n";
            }
        }
        print $filehandle "=\n";
    }
}

sub boulder_load {
    my ( $filehandle, $mode ) = @_;
    my @lines;
    if ( defined($filehandle) && ( $filehandle ne '' ) ) {
        while (<$filehandle>) {
            chomp;
            last if /^=/;
            push( @lines, $_ );
        }
    }
    return undef unless @lines;
    return "@lines" =~ /=/ ? join( "&", @lines ) : join( "+", @lines )
      if $mode == QUERY;
    my %hash;
    foreach (@lines) {
        my ( $key, $value ) = split /=/, $_, 2;
        next unless $key;
        $value = unescape($value);
        unless ( exists( $hash{$key} ) ) {
            $hash{$key} = $value;
            next;
        }
        if ( ref( $hash{$key} ) eq 'ARRAY' ) {
            push( @{ $hash{$key} }, $value );
        } else {
            $hash{$key} = [ $hash{$key}, $value ];
        }
    }
    \%hash;
}

# Borrowed from CGI so we don't have to load that package if
# we don't need to. Turns a string into a filehandle.
sub to_filehandle {
    my $thingy = shift;
    return undef unless $thingy;
    return $thingy if UNIVERSAL::isa( $thingy, 'GLOB' );
    return $thingy if UNIVERSAL::isa( $thingy, 'FileHandle' );
    if ( !ref($thingy) ) {
        my $caller = 1;
        while ( my $package = caller( $caller++ ) ) {
            my ($tmp) =
                $thingy =~ /[\':]/
              ? $thingy
              : "$package\:\:$thingy";
            return $tmp if defined( fileno($tmp) );
        }
    }
    return undef;
}

1;

__END__

=begin

=head1 NAME

Boulder::Util - Utility methods for simple Boulder IO interactions.

=head1 SYNOPSIS
 
 #!/usr/bin/perl -w
 use strict;
 
 use Boulder::Util qw( boulder_save boulder_load );
 
 my $file ='pixies.txt';
 
 my $data = { 
     vocals => ['frank', 'kim'],
     guitar => ['frank', 'joey'],
     bass => 'kim',
     drums => 'david'
 };
 
 my $fh;
 open ($fh,">$file");
 boulder_save($fh,$data);
 close $fh;
 
 my $fh2;
 open ($fh2,"$file");
 while(my $q = boulder_load($fh2,Boulder::Util::QUERY)) {
     print "$q\n";
 }
 close $fh2;

=head1 DESCRIPTION

Boulder::Util is a utility package for manipulating simple Boulder IO
records in a lightweight fashion.

Boulder IO is the native format output by the CGI package's C<save>
method. While working on a project I used that method to serialize
the state of a query for later use. That later use did not involve
a CGI request though. I wanted to avoid loading up the CGI package
just to read in the file memory and the L<Boulder> package itself
seemed like a bit much. What I wished I had was a quick way of
reading those records without incurring the overhead of either



( run in 2.944 seconds using v1.01-cache-2.11-cpan-0d23b851a93 )