in reply to "do" what?

This parses OK

It shouldn't. The line 'my %config = {};' should trigger the error 'Reference found where even-sized list expected'

Assuming we change it to 'my %config = ();' it still doesn't work, since %config is lexically scoped and the do block doesn't seem to be able to access lexically scoped variables. If you change it to:

our %config = ();

Then you should get the effect you're after.

Having said that, evaluating a config file to set global variables is not a great idea. In fact this is the exact problem XML::Simple was written to solve. If your config file was called scriptname.xml and looked like this:

<config> <username>zxcvb</username> <password>zzzzz</password> </config>

Then you could use it like this:

use XML::Simple; my $config = XMLin(); print $config->{username};

In real life, you would set explicit values for XMLin's keyattr and forcearray options and you'd probably also want to investigate the caching options.

Replies are listed 'Best First'.
Re^2: "do" what?
by Aristotle (Chancellor) on Oct 21, 2002 at 22:43 UTC
    Or if you don't want to go that far, you can change it to something like:
    { username => 'zxcvb', password => 'zzzzz', }
    and use it like this: my $config = do "config.pl";

    Makeshifts last the longest.

      From a security perspective, that's just as bad. Someone with write access to the config file could change it to:

      system("insert malicious command here"); { username => 'zxcvb', password => 'zzzzz', }

      If you don't need to trust the keeper of the config file to refrain from malicious or even dumb stuff, why expose yourself to the risk.

      Check out YAML for another way to represent complex data structures in config files without needing eval (or "do" in this case).

        If that's an issue, use Safe;

        Makeshifts last the longest.