3 new versions checked in finally.
[urisagit/File-Slurp.git] / extras / slurp_bench.pl
old mode 100755 (executable)
new mode 100644 (file)
index eeab16c..68eb5fd
@@ -10,8 +10,9 @@ use FileHandle ;
 use Fcntl qw( :DEFAULT :seek );
 
 use File::Slurp () ;
+use FileSlurp_12 () ;
 
-my $file = 'slurp_data' ;
+my $file_name = 'slurp_data' ;
 my( @lines, $text ) ;
 
 my %opts ;
@@ -20,7 +21,7 @@ parse_options() ;
 
 run_benchmarks() ;
 
-unlink $file ;
+unlink $file_name ;
 
 exit ;
 
@@ -37,7 +38,7 @@ sub run_benchmarks {
 
                if ( $opts{slurp} ) {
 
-                       File::Slurp::write_file( $file, $text ) ;
+                       File::Slurp::write_file( $file_name, $text ) ;
 
                        bench_list_slurp( $size ) if $opts{list} ;
                        bench_scalar_slurp( $size ) if $opts{scalar} ;
@@ -51,221 +52,314 @@ sub run_benchmarks {
        }
 }
 
-sub bench_spew_list {
+##########################################
+##########################################
+sub bench_scalar_slurp {
 
-       my( $size ) = @_ ;
+       my ( $size ) = @_ ;
 
-       print "\n\nWriting (Spew) a list of lines: Size = $size bytes\n\n" ;
+       print "\n\nReading (Slurp) into a scalar: Size = $size bytes\n\n" ;
+
+       my $buffer ;
 
        my $result = timethese( $opts{iterations}, {
-               'FS::write_file' =>
-                       sub { File::Slurp::write_file( $file, @lines ) },
-               'FS::write_file Aref' =>
-                       sub { File::Slurp::write_file( $file, \@lines ) },
-               'print' =>
-                       sub { print_file( $file, @lines ) },
-               'print/join' =>
-                       sub { print_join_file( $file, @lines ) },
-               'syswrite/join' =>
-                       sub { syswrite_join_file( $file, @lines ) },
-               'original write_file' =>
-                       sub { orig_write_file( $file, @lines ) },
+
+               'FS::read_file' =>
+                       sub { my $text = File::Slurp::read_file( $file_name ) },
+
+               'FS12::read_file' =>
+                       sub { my $text = FileSlurp_12::read_file( $file_name ) },
+
+               'FS::read_file_buf_ref' =>
+                       sub { my $text ;
+                          File::Slurp::read_file( $file_name, buf_ref => \$text ) },
+               'FS::read_file_buf_ref2' =>
+                       sub { 
+                          File::Slurp::read_file( $file_name, buf_ref => \$buffer ) },
+               'FS::read_file_scalar_ref' =>
+                       sub { my $text =
+                           File::Slurp::read_file( $file_name, scalar_ref => 1 ) },
+
+               old_sysread_file =>
+                       sub { my $text = old_sysread_file( $file_name ) },
+
+               old_read_file =>
+                       sub { my $text = old_read_file( $file_name ) },
+
+               orig_read_file =>
+                       sub { my $text = orig_read_file( $file_name ) },
+
+               orig_slurp =>
+                       sub { my $text = orig_slurp_scalar( $file_name ) },
+
+               file_contents =>
+                       sub { my $text = file_contents( $file_name ) },
+
+               file_contents_no_OO =>
+                       sub { my $text = file_contents_no_OO( $file_name ) },
        } ) ;
 
        cmpthese( $result ) ;
 }
 
-sub print_file {
+##########################################
 
-       my( $file_name ) = shift ;
+sub bench_list_slurp {
 
-       unlink $file_name ;
+       my ( $size ) = @_ ;
 
-       local( *FH ) ;
-       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
+       print "\n\nReading (Slurp) into a list: Size = $size bytes\n\n" ;
 
-       print FH @_ ;
-}
+       my $result = timethese( $opts{iterations},  {
 
-sub print_join_file {
+               'FS::read_file' =>
+                       sub { my @lines = File::Slurp::read_file( $file_name ) },
 
-       my( $file_name ) = shift ;
+               'FS::read_file_array_ref' =>
+                       sub { my $lines_ref =
+                            File::Slurp::read_file( $file_name, array_ref => 1 ) },
 
-       unlink $file_name ;
+               'FS::read_file_scalar' =>
+                       sub { my $lines_ref =
+                            [ File::Slurp::read_file( $file_name ) ] },
 
-       local( *FH ) ;
-       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
+               old_sysread_file =>
+                       sub { my @lines = old_sysread_file( $file_name ) },
 
-       print FH join( '', @_ ) ;
+               old_read_file =>
+                       sub { my @lines = old_read_file( $file_name ) },
+
+               orig_read_file =>
+                       sub { my @lines = orig_read_file( $file_name ) },
+
+               orig_slurp_array =>
+                       sub { my @lines = orig_slurp_array( $file_name ) },
+
+               orig_slurp_array_ref =>
+                       sub { my $lines_ref = orig_slurp_array( $file_name ) },
+       } ) ;
+
+       cmpthese( $result ) ;
 }
 
-sub syswrite_join_file {
+######################################
+# uri's old fast slurp
 
-       my( $file_name ) = shift ;
+sub old_read_file {
 
-       unlink $file_name ;
+       my( $file_name ) = shift ;
 
        local( *FH ) ;
-       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
+       open( FH, $file_name ) || carp "can't open $file_name $!" ;
 
-       syswrite( FH, join( '', @_ ) ) ;
+       return <FH> if wantarray ;
+
+       my $buf ;
+
+       read( FH, $buf, -s FH ) ;
+       return $buf ;
 }
 
-sub sysopen_syswrite_join_file {
+sub old_sysread_file {
 
        my( $file_name ) = shift ;
 
-       unlink $file_name ;
-
        local( *FH ) ;
-       sysopen( FH, $file_name, O_WRONLY | O_CREAT ) ||
-                               carp "can't create $file_name $!" ;
+       open( FH, $file_name ) || carp "can't open $file_name $!" ;
 
-       syswrite( FH, join( '', @_ ) ) ;
+       return <FH> if wantarray ;
+
+       my $buf ;
+
+       sysread( FH, $buf, -s FH ) ;
+       return $buf ;
 }
 
-sub orig_write_file
-{
-       my ($f, @data) = @_;
+######################################
+# from File::Slurp.pm on cpan
 
-       unlink $f ;
+sub orig_read_file
+{
+       my ($file) = @_;
 
+       local($/) = wantarray ? $/ : undef;
        local(*F);
+       my $r;
+       my (@r);
 
-       open(F, ">$f") || croak "open >$f: $!";
-       (print F @data) || croak "write $f: $!";
-       close(F) || croak "close $f: $!";
-       return 1;
+       open(F, "<$file") || croak "open $file: $!";
+       @r = <F>;
+       close(F) || croak "close $file: $!";
+
+       return $r[0] unless wantarray;
+       return @r;
 }
 
-# sub bench_scalar_spew {
 
-#      my ( $size ) = @_ ;
+######################################
+# from Slurp.pm on cpan
 
-#      print "\n\nScalar Spew of $size file\n\n" ;
+sub orig_slurp { 
+    local( $/, @ARGV ) = ( wantarray ? $/ : undef, @_ ); 
+    return <ARGV>;
+}
 
-#      my $result = timethese( $dur, {
+sub orig_slurp_array {
+    my @array = orig_slurp( @_ );
+    return wantarray ? @array : \@array;
+}
 
-#              new =>
-#                      sub { File::Slurp::write_file( $file, $text ) },
+sub orig_slurp_scalar {
+    my $scalar = orig_slurp( @_ );
+    return $scalar;
+}
 
-#              new_ref =>
-#                      sub { File::Slurp::write_file( $file, \$text ) },
+######################################
+# very slow slurp code used by a client
 
-#              print_file =>
-#                      sub { print_file( $file, $text ) },
+sub file_contents {
+    my $file = shift;
+    my $fh = new FileHandle $file or
+        warn("Util::file_contents:Can't open file $file"), return '';
+    return join '', <$fh>;
+}
 
-#              print_join_file =>
-#                      sub { print_join_file( $file, $text ) },
+# same code but doesn't use FileHandle.pm
 
-#              syswrite_file =>
-#                      sub { syswrite_file( $file, $text ) },
+sub file_contents_no_OO {
+    my $file = shift;
 
-#              syswrite_file2 =>
-#                      sub { syswrite_file2( $file, $text ) },
+       local( *FH ) ;
+       open( FH, $file ) || carp "can't open $file $!" ;
 
-#              orig_write_file =>
-#                      sub { orig_write_file( $file, $text ) },
+    return join '', <FH>;
+}
 
-#      } ) ;
+##########################################
+##########################################
 
-#      cmpthese( $result ) ;
-# }
+sub bench_spew_list {
 
-# sub bench_scalar_slurp {
+       my( $size ) = @_ ;
 
-#      my ( $size ) = @_ ;
+       print "\n\nWriting (Spew) a list of lines: Size = $size bytes\n\n" ;
 
-#      print "\n\nScalar Slurp of $size file\n\n" ;
+       my $result = timethese( $opts{iterations}, {
+               'FS::write_file'        => sub { unlink $file_name if $opts{unlink} ; 
+                       File::Slurp::write_file( $file_name, @lines ) },
+               'FS::write_file Aref'   => sub { unlink $file_name if $opts{unlink} ; 
+                       File::Slurp::write_file( $file_name, \@lines ) },
+               'print'                 => sub { unlink $file_name if $opts{unlink} ; 
+                       print_file( $file_name, @lines ) },
+               'print/join'            => sub { unlink $file_name if $opts{unlink} ; 
+                       print_join_file( $file_name, @lines ) },
+               'syswrite/join'         => sub { unlink $file_name if $opts{unlink} ;
+                       syswrite_join_file( $file_name, @lines ) },
+               'original write_file'   => sub {  unlink $file_name if $opts{unlink} ; 
+                       orig_write_file( $file_name, @lines ) },
+       } ) ;
 
-#      my $buffer ;
+       cmpthese( $result ) ;
+}
 
-#      my $result = timethese( $dur, {
+sub print_file {
 
-#              new =>
-#                      sub { my $text = File::Slurp::read_file( $file ) },
+       my( $file_name ) = shift ;
 
-#              new_buf_ref =>
-#                      sub { my $text ;
-#                         File::Slurp::read_file( $file, buf_ref => \$text ) },
-#              new_buf_ref2 =>
-#                      sub { 
-#                         File::Slurp::read_file( $file, buf_ref => \$buffer ) },
-#              new_scalar_ref =>
-#                      sub { my $text =
-#                          File::Slurp::read_file( $file, scalar_ref => 1 ) },
+       local( *FH ) ;
+       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
 
-#              read_file =>
-#                      sub { my $text = read_file( $file ) },
+       print FH @_ ;
+}
 
-#              sysread_file =>
-#                      sub { my $text = sysread_file( $file ) },
+sub print_join_file {
 
-#              orig_read_file =>
-#                      sub { my $text = orig_read_file( $file ) },
+       my( $file_name ) = shift ;
 
-#              'Slurp.pm scalar' =>
-#                      sub { my $text = slurp_scalar( $file ) },
+       local( *FH ) ;
+       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
 
-#              file_contents =>
-#                      sub { my $text = file_contents( $file ) },
+       print FH join( '', @_ ) ;
+}
 
-#              file_contents_no_OO =>
-#                      sub { my $text = file_contents_no_OO( $file ) },
-#      } ) ;
+sub syswrite_join_file {
 
-#      cmpthese( $result ) ;
-# }
+       my( $file_name ) = shift ;
 
-# sub bench_list_slurp {
+       local( *FH ) ;
+       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
 
-#      my ( $size ) = @_ ;
+       syswrite( FH, join( '', @_ ) ) ;
+}
 
-#      print "\n\nList Slurp of $size file\n\n" ;
+sub sysopen_syswrite_join_file {
 
-#      my $result = timethese( $dur, {
+       my( $file_name ) = shift ;
 
-#              new =>
-#                      sub { my @lines = File::Slurp::read_file( $file ) },
+       local( *FH ) ;
+       sysopen( FH, $file_name, O_WRONLY | O_CREAT ) ||
+                               carp "can't create $file_name $!" ;
 
-#              new_array_ref =>
-#                      sub { my $lines_ref =
-#                           File::Slurp::read_file( $file, array_ref => 1 ) },
+       syswrite( FH, join( '', @_ ) ) ;
+}
 
-#              new_in_anon_array =>
-#                      sub { my $lines_ref =
-#                           [ File::Slurp::read_file( $file ) ] },
+sub orig_write_file
+{
+       my ($f, @data) = @_;
 
-#              read_file =>
-#                      sub { my @lines = read_file( $file ) },
+       local(*F);
 
-#              sysread_file =>
-#                      sub { my @lines = sysread_file( $file ) },
+       open(F, ">$f") || croak "open >$f: $!";
+       (print F @data) || croak "write $f: $!";
+       close(F) || croak "close $f: $!";
+       return 1;
+}
 
-#              orig_read_file =>
-#                      sub { my @lines = orig_read_file( $file ) },
+##########################################
 
-#              'Slurp.pm to array' =>
-#                      sub { my @lines = slurp_array( $file ) },
+sub bench_scalar_spew {
 
-#              orig_slurp_to_array_ref =>
-#                      sub { my $lines_ref = orig_slurp_to_array( $file ) },
-#      } ) ;
+       my ( $size ) = @_ ;
 
-#      cmpthese( $result ) ;
-# }
+       print "\n\nWriting (Spew) a scalar: Size = $size bytes\n\n" ;
 
+       my $result = timethese( $opts{iterations}, {
+               'FS::write_file'        => sub { unlink $file_name if $opts{unlink} ;
+                       File::Slurp::write_file( $file_name, $text ) },
+               'FS::write_file Sref'   => sub { unlink $file_name if $opts{unlink} ; 
+                       File::Slurp::write_file( $file_name, \$text ) },
+               'print'                 => sub { unlink $file_name if $opts{unlink} ; 
+                       print_file( $file_name, $text ) },
+               'syswrite_file'         => sub { unlink $file_name if $opts{unlink} ; 
+                       syswrite_file( $file_name, $text ) },
+               'syswrite_file_ref'     => sub { unlink $file_name if $opts{unlink} ; 
+                       syswrite_file_ref( $file_name, \$text ) },
+               'orig_write_file'       => sub { unlink $file_name if $opts{unlink} ; 
+                       orig_write_file( $file_name, $text ) },
+       } ) ;
 
-###########################
-# write file benchmark subs
-###########################
+       cmpthese( $result ) ;
+}
 
+sub syswrite_file {
 
+       my( $file_name, $text ) = @_ ;
 
-#######################
-# top level subs for script
+       local( *FH ) ;
+       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
 
-#######################
+       syswrite( FH, $text ) ;
+}
+
+sub syswrite_file_ref {
+
+       my( $file_name, $text_ref ) = @_ ;
+
+       local( *FH ) ;
+       open( FH, ">$file_name" ) || carp "can't create $file_name $!" ;
+
+       syswrite( FH, ${$text_ref} ) ;
+}
 
 sub parse_options {
 
@@ -274,6 +368,7 @@ sub parse_options {
                direction|d=s
                context|c=s
                sizes|s=s
+               unlink|u
                legend|key|l|k
                help|usage
        ) ) ;
@@ -289,7 +384,7 @@ sub parse_options {
        $opts{direction} ||= 'both' ;
        $opts{context} ||= 'both' ;
        $opts{iterations} ||= -2 ;
-       $opts{sizes} ||= '500,10k,1m' ;
+       $opts{sizes} ||= '512,10k,1m' ;
 
        if ( $opts{direction} eq 'both' ) {
        
@@ -369,28 +464,81 @@ sub parse_options {
 sub legend {
 
        die <<'LEGEND' ;
+--------------------------------------------------------------------------
 Legend for the Slurp Benchmark Entries
 
 In all cases below 'FS' or 'F::S' means the current File::Slurp module
 is being used in the benchmark. The full name and description will say
 which options are being used.
-
+--------------------------------------------------------------------------
 These benchmarks write a list of lines to a file. Use the direction option
 of 'out' or 'both' and the context option is 'list' or 'both'.
 
        Key                     Description/Source
-       ---                     ------------------
+       -----                   --------------------------
        FS::write_file          Current F::S write_file
        FS::write_file Aref     Current F::S write_file on array ref of data
        print                   Open a file and call print() on the list data
-       print/join              Open a file and call print() on the joined
-                               list data
+       print/join              Open a file and call print() on the joined list
+                               data
        syswrite/join           Open a file, call syswrite on joined list data
-       sysopen/syswrite        Sysopen a file, call syswrite on joined
-                               list data
+       sysopen/syswrite        Sysopen a file, call syswrite on joined list
+                               data
        original write_file     write_file code from original File::Slurp
                                (pre-version 9999.*)
+--------------------------------------------------------------------------
+These benchmarks write a scalar to a file. Use the direction option
+of 'out' or 'both' and the context option is 'scalar' or 'both'.
 
+       Key                     Description/Source
+       -----                   --------------------------
+       FS::write_file          Current F::S write_file
+       FS::write_file Sref     Current F::S write_file of scalar ref of data
+       print                   Open a file and call print() on the scalar data
+       syswrite_file           Open a file, call syswrite on scalar data
+       syswrite_file_ref       Open a file, call syswrite on scalar ref of
+                               data
+       orig_write_file         write_file code from original File::Slurp
+                               (pre-version 9999.*)
+--------------------------------------------------------------------------
+These benchmarks slurp a file into an array. Use the direction option
+of 'in' or 'both' and the context option is 'list' or 'both'.
+
+       Key                             Description/Source
+       -----                           --------------------------
+       FS::read_file                   Current F::S read_file - returns array
+       FS::read_file_array_ref         Current F::S read_file - returns array
+                                       ref in any context
+       FS::read_file_scalar            Current F::S read_file - returns array
+                                       ref in scalar context
+       old_sysread_file                My old fast slurp - calls sysread
+       old_read_file                   My old fast slurp - calls read
+       orig_read_file                  Original File::Slurp on CPAN 
+       orig_slurp_array                Slurp.pm on CPAN - returns array
+       orig_slurp_array_ref            Slurp.pm on CPAN - returns array ref
+--------------------------------------------------------------------------
+These benchmarks slurp a file into a scalar. Use the direction option
+of 'in' or 'both' and the context option is 'scalar' or 'both'.
+
+       Key                             Description/Source
+       -----                           --------------------------
+       FS::read_file                   Current F::S read_file - returns scalar
+       FS12::read_file                 F::S .12 slower read_file -
+                                       returns scalar
+       FS::read_file_buf_ref           Current F::S read_file - returns
+                                       via buf_ref argument - new buffer
+       FS::read_file_buf_ref2          Current F::S read_file - returns
+                                       via buf_ref argument - uses
+                                       existing buffer
+       FS::read_file_scalar_ref        Current F::S read_file - returns a 
+                                       scalar ref
+       old_sysread_file                My old fast slurp - calls sysread
+       old_read_file                   My old fast slurp - calls read
+       orig_read_file                  Original File::Slurp on CPAN 
+       orig_slurp                      Slurp.pm on CPAN
+       file_contents                   Very slow slurp code done by a client
+       file_contents_no_OO             Same code but doesn't use FileHandle.pm 
+--------------------------------------------------------------------------
 LEGEND
 }
 
@@ -419,7 +567,10 @@ Usage: $0 [--iterations=<iter>] [--direction=<dir>] [--context=<con>]
        --sizes=<size_list>     What sizes will be used in slurping (either
        -s=<size_list>          direction). This is a comma separated list of
                                integers. You can use 'k' or 'm' as suffixes
-                               for 1024 and 1024**2. Default is '500,1k,1m'.
+                               for 1024 and 1024**2. Default is '512,10k,1m'.
+
+       --unlink                Unlink the written file before each time
+       -u                      a file is written
 
        --legend                Print out a legend of all the benchmark entries.
        --key
@@ -434,215 +585,3 @@ DIE
 
 __END__
 
-
-sub bench_scalar_spew {
-
-       my ( $size ) = @_ ;
-
-       print "\n\nScalar Spew of $size file\n\n" ;
-
-       my $result = timethese( $dur, {
-
-               new =>
-                       sub { File::Slurp::write_file( $file, $text ) },
-
-               new_ref =>
-                       sub { File::Slurp::write_file( $file, \$text ) },
-
-               print_file =>
-                       sub { print_file( $file, $text ) },
-
-               print_join_file =>
-                       sub { print_join_file( $file, $text ) },
-
-               syswrite_file =>
-                       sub { syswrite_file( $file, $text ) },
-
-               syswrite_file2 =>
-                       sub { syswrite_file2( $file, $text ) },
-
-               orig_write_file =>
-                       sub { orig_write_file( $file, $text ) },
-
-       } ) ;
-
-       cmpthese( $result ) ;
-}
-
-sub bench_scalar_slurp {
-
-       my ( $size ) = @_ ;
-
-       print "\n\nScalar Slurp of $size file\n\n" ;
-
-       my $buffer ;
-
-       my $result = timethese( $dur, {
-
-               new =>
-                       sub { my $text = File::Slurp::read_file( $file ) },
-
-               new_buf_ref =>
-                       sub { my $text ;
-                          File::Slurp::read_file( $file, buf_ref => \$text ) },
-               new_buf_ref2 =>
-                       sub { 
-                          File::Slurp::read_file( $file, buf_ref => \$buffer ) },
-               new_scalar_ref =>
-                       sub { my $text =
-                           File::Slurp::read_file( $file, scalar_ref => 1 ) },
-
-               read_file =>
-                       sub { my $text = read_file( $file ) },
-
-               sysread_file =>
-                       sub { my $text = sysread_file( $file ) },
-
-               orig_read_file =>
-                       sub { my $text = orig_read_file( $file ) },
-
-               orig_slurp =>
-                       sub { my $text = orig_slurp_to_scalar( $file ) },
-
-               file_contents =>
-                       sub { my $text = file_contents( $file ) },
-
-               file_contents_no_OO =>
-                       sub { my $text = file_contents_no_OO( $file ) },
-       } ) ;
-
-       cmpthese( $result ) ;
-}
-
-sub bench_list_slurp {
-
-       my ( $size ) = @_ ;
-
-       print "\n\nList Slurp of $size file\n\n" ;
-
-       my $result = timethese( $dur, {
-
-               new =>
-                       sub { my @lines = File::Slurp::read_file( $file ) },
-
-               new_array_ref =>
-                       sub { my $lines_ref =
-                            File::Slurp::read_file( $file, array_ref => 1 ) },
-
-               new_in_anon_array =>
-                       sub { my $lines_ref =
-                            [ File::Slurp::read_file( $file ) ] },
-
-               read_file =>
-                       sub { my @lines = read_file( $file ) },
-
-               sysread_file =>
-                       sub { my @lines = sysread_file( $file ) },
-
-               orig_read_file =>
-                       sub { my @lines = orig_read_file( $file ) },
-
-               orig_slurp_to_array =>
-                       sub { my @lines = orig_slurp_to_array( $file ) },
-
-               orig_slurp_to_array_ref =>
-                       sub { my $lines_ref = orig_slurp_to_array( $file ) },
-       } ) ;
-
-       cmpthese( $result ) ;
-}
-
-######################################
-# uri's old fast slurp
-
-sub read_file {
-
-       my( $file_name ) = shift ;
-
-       local( *FH ) ;
-       open( FH, $file_name ) || carp "can't open $file_name $!" ;
-
-       return <FH> if wantarray ;
-
-       my $buf ;
-
-       read( FH, $buf, -s FH ) ;
-       return $buf ;
-}
-
-sub sysread_file {
-
-       my( $file_name ) = shift ;
-
-       local( *FH ) ;
-       open( FH, $file_name ) || carp "can't open $file_name $!" ;
-
-       return <FH> if wantarray ;
-
-       my $buf ;
-
-       sysread( FH, $buf, -s FH ) ;
-       return $buf ;
-}
-
-######################################
-# from File::Slurp.pm on cpan
-
-sub orig_read_file
-{
-       my ($file) = @_;
-
-       local($/) = wantarray ? $/ : undef;
-       local(*F);
-       my $r;
-       my (@r);
-
-       open(F, "<$file") || croak "open $file: $!";
-       @r = <F>;
-       close(F) || croak "close $file: $!";
-
-       return $r[0] unless wantarray;
-       return @r;
-}
-
-
-######################################
-# from Slurp.pm on cpan
-
-sub slurp { 
-    local( $/, @ARGV ) = ( wantarray ? $/ : undef, @_ ); 
-    return <ARGV>;
-}
-
-sub slurp_array {
-    my @array = slurp( @_ );
-    return wantarray ? @array : \@array;
-}
-
-sub slurp_scalar {
-    my $scalar = slurp( @_ );
-    return $scalar;
-}
-
-######################################
-# very slow slurp code used by a client
-
-sub file_contents {
-    my $file = shift;
-    my $fh = new FileHandle $file or
-        warn("Util::file_contents:Can't open file $file"), return '';
-    return join '', <$fh>;
-}
-
-# same code but doesn't use FileHandle.pm
-
-sub file_contents_no_OO {
-    my $file = shift;
-
-       local( *FH ) ;
-       open( FH, $file ) || carp "can't open $file $!" ;
-
-    return join '', <FH>;
-}
-
-##########################