> -----Original Message----- > From: David T-G [mailto:[EMAIL PROTECTED]] > Sent: Wednesday, June 12, 2002 9:40 AM > To: perl beginners > Subject: "lazy" variable declaration > > > Hi, all -- > > I'm trying to be good and so I use "my $variable" rather than > making them > global, and I prefer to not stick little [potentially-confusing] "my" > declarations around through the code so I declare my vars up front. > While some of them might usefully be pre-filled, many of them > can happily > by left declared but undefined, so things like > > my $foo, $bar, $baz ;
This does not declare $bar and $baz to be "my" vars. "use strict" will barf on this. Here the comma is the sequence operator, not the list separator. You need: my ($foo, $bar, $baz); > my ($foo, $bar, $baz) = "" ; This only initializes $foo. $bar and $baz are undef. To initialize all 3, use a list: my ($foo, $bar, $baz) = ('', '', ''); > > work nicely. I haven't yet figured out, though, all of the rules for > arrays and hashes. In my current script, I have > > my # vars we will use > ( > $m3u, # file name > $mp3, # disk label > $source,$host, # where we got it > $artist,$disk,$track, # the > real data :-) > @allsources, @allhosts, # where we get 'em > $fullpath, # hash key > @working, # stripped copy > of $fullpath > %threez, # hash that > holds DB record > ) = "" ; > > $m3u = $source = $host = "" ; # what > can't be undef > > with the second line since those vars cause problems later if they are > undefined (even though I set the vars to empty at declaration > time just > above) and, more importantly, have to put the hash at the end > or I get an > "odd number of elements added to hash" error. The single initializer value goes only to the first variable. If the first variable is a hash, you get the warning because a hash should have an even number of key/value pairs in an assignment. > > Since the code is meant to be clear and self-documenting, I > don't have to > have all of those comments on the right, and would prefer to > just have a > nice, polite "my" line listing everything and being done with it. Is > there any way to mix all of these together? Try the following: my (@foo, @bar) = qw(a b c d); print "\@foo is [@foo]\n"; print "\@bar is [@bar]\n"; This prints: @foo is [a b c d] @bar is [] Note that @foo "sucked up" all the values in the initializer list. So there's really no way to initialize @foo to [a b] and @bar to [c d] in a single statement like this. -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]