SPUG: do vs. eval with Data::Dumper

Jeremy Devenport jeremy at weezel.com
Wed Jan 26 12:47:17 CST 2000


Maybe this little tidbit from `perldoc -f do` will help.

It also differs in that code evaluated with 'do FILENAME'
cannot see lexicals in the enclosing scope; 'eval STRING' does.

This is listed as one of the minor details in the second paragraph.

Jeremy

Tim Maher/CONSULTIX wrote:
> 
> SPUGsters (and E-SPUGsters),
> 
> I'm working on a complicated Data::Dumper example for my "Intermediate
> Perl" course, which worked just fine until I enabled "use strict" and
> rendered some previously global variables private.
>         (I know, been there, done that, got the T-shirt . . .)
> 
> I found a solution, but it shouldn't work, from what I read! 8-}
> Specifically, although the Camel says that "do file" is the same as
> "eval `cat file`" (p. 158), except for a few minor details, I'm finding
> evidence that there's a fundamental difference.
> 
> It looks like "do" is executing the code in its own scope, but eval is
> using the surrounding scope.
> 
> Or is there another explanation for the output of this test program?
> 
> #! /usr/bin/perl -w
> use strict;
> 
> my $size=0;
> 
> open  FILE, '> /tmp/dofile'  or  die;
> print FILE ' $size=42; ';
> close FILE or  die;
> 
> print "File contains: ", `cat /tmp/dofile`, "\n";
> 
> do '/tmp/dofile';
> print "\nDo yields:\t$size\n";  # prints 0
> 
> eval `cat /tmp/dofile`;
> print "\nEval yields:\t$size\n";        # prints 42
> 
> OUTPUT:
> 
> File contains:  $size=42;
> 
> Do yields:      0
> 
> Eval yields:    42
> 
> Also, I'm trying to make an alias for Data::Dumper::Dump (unexported!),
> using variations including:
>         *::Dump = \&Data::Dumper::Dump;
> and
>         *Dump = *Data::Dumper::Dump;
> 
> but when I hit the line below, I get;
>         Can't coerce array into hash at
>         /usr/lib/Perl5/5.00502/i586-linux/Data/Dumper.pm line 161.
> 
> print Dump([$size, \%pals, $hosts, \@::words],
>   ["size", "*${prefix}pals", "${prefix}hosts", "*${prefix}words"]);
> 
>   (I set $prefix to :: to reload variables as globals, with "strict"
>   in effect)
> 
> What's wrong here? And why doesn't Data::Dumper export Dump()
> in the first place? 8-}
> 
> TIA,
> *========================================================================*
> | Tim Maher, PhD  Consultix &              (206) 781-UNIX/8649           |
> |  Pacific Software Gurus, Inc             Email: tim at consultix-inc.com  |
> |  UNIX/Linux & Perl Training              http://www.consultix-inc.com  |
> | 2/22: UNIX  2/28: Perl Modules  2/29: Int. Perl  3/3: Pattern Matching |
> *========================================================================*
> 
>  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>     POST TO: spug-list at pm.org        PROBLEMS: owner-spug-list at pm.org
>  Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/
>  SUBSCRIBE/UNSUBSCRIBE: Replace ACTION below by subscribe or unsubscribe
>         Email to majordomo at pm.org: ACTION spug-list your_address

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    POST TO: spug-list at pm.org        PROBLEMS: owner-spug-list at pm.org
 Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/
 SUBSCRIBE/UNSUBSCRIBE: Replace ACTION below by subscribe or unsubscribe
        Email to majordomo at pm.org: ACTION spug-list your_address





More information about the spug-list mailing list