Thanks Ted,
But the moral of my story is I should explain what I'm doing instead of
boiling the code down to my specific error. That way you guys could tell me
a better way. So here it is:
I'm using Getopt::Long, but I wanted some extra functionality. So I wrote a
wrapper that did some additional stuff (really good stuff). Getopt::Long
requires an address of a hash, and an array of program argument/option
definitions. So I can't use an ref to an anonymous hash, I need to declare
a hash and pass the reference. But my pgm is almost working but now I'm
getting an "Can't use string ("1") as a SCALAR ref while "strict refs" in
use". Don't really know why (it should work).
Jay
----- Original Message -----
From: "Ted Deppner" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, August 07, 2001 6:28 PM
Subject: Re: [vox-tech] Perl: A different approach to: Can I declare
$main::...
> On Tue, Aug 07, 2001 at 11:49:12AM -0500, Jay Strauss wrote:
> > What I really want to do, is perform some housekeeping and variable
> > initialization within a subroutine (so that I can stick it at the bottom
of
> > the source and not look at it all the time). So I've been monkeying
with:
>
> go hashref. all your problems go away...
>
> > use strict;
> >
> > my %arg = (quiet=>"yep");
> my $arg = { quiet => yep };
>
> # ...skip this till you read the rest of the code below...
> # you MUST initialize a ref w/ a ref to avoid later my() scoping problems
> #
> # my $arg; sub sub1 { my $h=shift; $h->{b}++; } sub1($arg); # WILL FAIL
> # my is undef on entry to sub1, with a $h->{b} instancitated INSIDE sub1.
> #
> # my $arg={}; sub sub1 { my $h=shift; $h->{b}++; } sub1($arg); # WILL WORK
> # $arg is instanciated as a HREF outside sub1, and the my $h=shift won't
> # harm it, as the arrayref is passed in.
>
> > housekeeping(\%arg);
> housekeeping($arg);
> >
> > sub housekeeping
> > {
> > print keys %{$_[0]}, "\n";
> stays the same
> > my %arg;
> > *arg = \%{$_[0]};
> my %arg = %{ $_[0] }; # LOCAL copy of the data, not the original
data(BAD)
> my $arg=$_[0]; # assumed you use this below -- better as my
$arg=shift
> > print keys %arg, "\n";
> print keys %{ $arg }, "\n";
>
> $arg->{anyvar}="initialvalue";
> push @{ $arg->{myarrayref} }, (1, 2, 3, 4);
> $arg->{myotherarrayref} = \(1, 2, 3, 4); #think this works
> $arg->{myhashref} => { a=>1, b=>2 };
> > }
> >
> > But that doesn't work. I want to make a hash within the housekeeping
sub
> > that when assign values it modifies the original hash (reference passed
in).
> > But I can't seem to get the typeglob assignment to work. Help??
>
> Never typeglob!
> typeglobbing ugly!
> All typeglobbers are bad!
> typeglob == goto
> <smack!>
> (I don't like typeglobs... in case that wasn't clear yet)
>
> I've only had to resort to typeglobs when doing funky things with
> filehandles, but then it'd probably be better to convert to IO::File
> structures rather than resort to typeglobs.
>
> --
> Ted Deppner
> http://www.psyber.com/~ted/
_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com