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:
December 2: Social gathering
Next Installfest:
TBD
Latest News:
Nov. 18: Club officer elections
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::...



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/


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.