l i n u x - u s e r s - g r o u p - o f - d a v i s
L U G O D
 
Next Meeting:
April 21: Google Glass
Next Installfest:
TBD
Latest News:
Mar. 18: Google Glass at LUGOD's April meeting
Page last updated:
2001 Dec 30 17:07

The following is an archive of a post made to our 'vox-tech mailing list' by one of its subscribers.

Report this post as spam:

(Enter your email address)
Re: [vox-tech] Perl: A different approach to: Can I declare $main::...
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [vox-tech] Perl: A different approach to: Can I declare $main::...



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" <ted@psyber.com>
To: <vox-tech@franz.mother.com>
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


LinkedIn
LUGOD Group on LinkedIn
Sign up for LUGOD event announcements
Your email address:
facebook
LUGOD Group on Facebook
'Like' LUGOD on Facebook:

Hosting provided by:
Sunset Systems
Sunset Systems offers preconfigured Linux systems, remote system administration and custom software development.

LUGOD: Linux Users' Group of Davis
PO Box 2082, Davis, CA 95617
Contact Us

LUGOD is a 501(c)7 non-profit organization
based in Davis, California
and serving the Sacramento area.
"Linux" is a trademark of Linus Torvalds.

Sponsored in part by:
O'Reilly and Associates
For numerous book donations.