newbie baffled by de/referencing with subroutines

J

Jessica

I created an elaborate array (my @uniqueParsed) inside a subroutine
and I want to use data from that array after the sub is finished. I
declared a reference inside the sub:

my $uniqueParsed_r = \@uniqueParsed;

then tried to print the data outside the sub by this dereference:

print "dereferenced array is @$uniqueParsed_r \n";

but nothing was returned (i.e., @$uniqueParsed_r is empty). By the
way, if I put the print statement inside the sub, the dereferenced
array prints correctly.

What's wrong with my reference and/or dereference, and how do I fix it?


Thanks!
 
A

A. Sinan Unur

I created an elaborate array (my @uniqueParsed) inside a subroutine
and I want to use data from that array after the sub is finished. I
declared a reference inside the sub:

my $uniqueParsed_r = \@uniqueParsed;

then tried to print the data outside the sub by this dereference:

print "dereferenced array is @$uniqueParsed_r \n";

but nothing was returned (i.e., @$uniqueParsed_r is empty). By the
way, if I put the print statement inside the sub, the dereferenced
array prints correctly.

What's wrong with my reference and/or dereference, and how do I fix
it?

Have you seen the posting guidelines posted here regularly?

The guidelines contain valuable information on how to help others help
you, do read them.

I have a feeling you are missing:

use warnings;
use strict;

in your code.

I will venture to guess that you are not returning the reference from
your sub. In that case, $uniqueParsed_r only exists within the lexical
scope of the subroutine.

Please post a short example script that exhibits the problem so that we
don't have to guess what you are actually doing.

Sinan
 
J

Jessica

Thanks for your reply, Sinan. You're right, I haven't checked the
posting guidelines (abject apologies from this thoroughly befuddled
newbie). Also I did not use warnings or strict, as that's not what our
instructor has us do, for better or worse.

As far as sample code, here's a sketch. The actual code that generates
@uniqueParsed is long and probably irrelevant, so I'll kinda skip over
it:

sub parseGff
{
do lots of stuff ...
my @uniqueParsed = ();
put stuff into @uniqueParsed ...
my $uniqueParsed_r = \@uniqueParsed;
some more stuff that doesn't matter here ...
}

parseGff

print "dereferenced array is @{$uniqueParsed_r} \n";



So you're right, I don't return anything - and that's the part that has
me baffled. How do I return a reference from the sub? (I have zero
background in programming, it's only the 5th lecture and we're doing
references - the instructor is going too fast for newbies like me.)

Thanks again for your help!
 
A

A. Sinan Unur

Thanks for your reply, Sinan. You're right, I haven't checked the
posting guidelines (abject apologies from this thoroughly befuddled
newbie). Also I did not use warnings or strict, as that's not what
our instructor has us do, for better or worse.

For worse. Do read the guidelines for the justification for using them.
Then, demand that your instructor use them. If not, either ask him/her
to explain why. If the explanation does not satisfy you, demand your
money back. :) I know this sounds a little over the top, but I can see
no reason why warnings and strict should be turned off when learning.
As far as sample code, here's a sketch. The actual code that
generates @uniqueParsed is long and probably irrelevant, so I'll kinda
skip over it:

sub parseGff
{
do lots of stuff ...
my @uniqueParsed = ();
put stuff into @uniqueParsed ...
my $uniqueParsed_r = \@uniqueParsed;
some more stuff that doesn't matter here ...
}

parseGff

print "dereferenced array is @{$uniqueParsed_r} \n";


So you're right, I don't return anything - and that's the part that
has me baffled. How do I return a reference from the sub?

OK, I get the picture now.

Here is a short example to get you started:

#! /usr/bin/perl

my $array_ref = select_letters();
print "@$array_ref\n";

sub select_letters {
my @letters;

for my $letter ( 'A' .. 'Z' ) {
if(rand(1) < 0.5) {
push @letters, $letter;
}
}

return \@letters;
}

__END__
(I have zero background in programming, it's only the 5th lecture
and we're doing references - the instructor is going too fast for
newbies like me.)

Perl comes with extensive documentation.

Depending on your platform, you can access this documentation in a
variety of ways.

On Windows, with ActiveState Perl, you can find documentation in HTML
format via the Start menu.

On all platforms, you can use the command line program perldoc to view
documentation. You might want to consult:

perldoc perlreftut

and

perldoc perlsub

Sinan
 
T

Tad McClellan

Jessica said:
I created an elaborate array (my @uniqueParsed) inside a subroutine
and I want to use data from that array after the sub is finished. I
declared a reference inside the sub:

my $uniqueParsed_r = \@uniqueParsed;

then tried to print the data outside the sub by this dereference:

print "dereferenced array is @$uniqueParsed_r \n";

but nothing was returned (i.e., @$uniqueParsed_r is empty). By the
way, if I put the print statement inside the sub, the dereferenced
array prints correctly.


You should always enable strict and warnings when developing Perl code!

What's wrong with my reference and/or dereference,


There is nothing wrong with either your reference nor your dereference.

There is something wrong with your variable scoping.

(I am forced to guess that that is what it is, because you did
not include a short and complete program that I can run. Have
you seen the Posting Guidelines that are posted here frequently?
)

and how do I fix it?


Don't declare a lexical variable that will cease to exist as
soon as the subroutine returns, instead return a reference
to the elaborate array.

sub nameless_sub {
my @uniqueParsed;
# populate the array...
return \@uniqueParsed;
}

my $uP = nameless_sub();
print "dereferenced array is @$uP\n";
 
T

Tad McClellan

Jessica said:
Also I did not use warnings or strict, as that's not what our
instructor has us do, for better or worse.


You have a poor instructor.

strict and warnings help find bugs in your code, take all
of the help that you can get.

How do I return a reference from the sub?


return \@uniqueParsed;

it's only the 5th lecture and we're doing
references -


You have a poorly designed curriculum.

the instructor is going too fast for newbies like me.)


You have a poor instructor.

Sounds all-around poor. How much was the tuition?
 
E

Eric Bohlman

Thanks for your reply, Sinan. You're right, I haven't checked the
posting guidelines (abject apologies from this thoroughly befuddled
newbie). Also I did not use warnings or strict, as that's not what our
instructor has us do, for better or worse.

Can we have some clarification here? Are you saying

1) Your instructor specifically told his class *not* to use warnings and
strict? or

2) Your instructor simply didn't tell his class to use them?

If 1) is the case, then your instructor is B A D, period. He's
deliberately teaching his students bad habits. In that case it looks
like *all* the fault lies with the instructor.

If 2) is the case, then your instructor isn't experienced enough in Perl
to be teaching it; that's probably not so much his fault as the
institution's fault for trying to cut corners in order to save money.
But if that's the case, the worst thing any of his students can do is
take the attitude "I don't need to do anything the instructor didn't
specifically tell me to do"; that's really the same as "I won't learn
this if it's not going to be on the test."

Assuming that your goal in taking a Perl class is more ambitious than
just being able to say "I took a Perl class once"--in other words,
assuming that your goal is to eventually be able to write Perl programs--
then you're hoping to reach a point where you *won't* have an instructor
telling you what to do and there *won't* be any examinations. But once
you reach that point, you *won't* know everything there is to know about
Perl programming (since your name isn't "Larry Wall") even though you'll
still need to know more about it. And that means being able to pick up
stuff on your own. That means becoming aware of what are considered
"best practices" in the field and observing them unless/until you're able
to articulate why your needs would be better served by something else.

When learning a programming language, you really *do* have to do a lot of
self-study beyond what's taught in the classroom and what's part of the
assigned coursework. Because if a class is taught properly, the
classroom time and the assignments will be devoted to only those aspects
of the language that are difficult to pick up through self-study; there
simply isn't time for what amounts to the instructor reading the textbook
or the widely-available reference material to his class.

With Perl, you're fortunate in that you don't have to go digging around
to find good reference material; it's already there on your computer!
The one thing a lot of people have to get used to is that Perl's
documentation is quite "information-dense" whereas most software
documentation is "information-sparse" (full of screen shots, lists of
menu items, and similar stuff that would be immediately obvious to anyone
who's ever used the software). There's a lot of meat on those bones!
But you don't have to eat it all at once. Just develop a basic mental
model of how the material is organized, so that when you have a question
nagging at you, you have some idea of where to look for the answer.

And probably the single most important important thing you can do is to
get in the habit of *always* looking for the answers to such questions,
even if they seem trivial or not of immediate importance (and if the
answers don't leave you completely enlightened, feel quite free to come
here and ask for clarification; questions of the form "I was wondering
about...It says in perlop that...But I still quite don't get...And I
wonder why it's done that way" are valuable not just to you, but to other
readers of the group, because they get people thinking, learning new
things, and re-examining old assumptions. You can learn an awful lot
simply by reading the responses to well-asked questions (WAQs) here).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top