Richard Lee wrote: > > one more question on reference, > > if say you have sub as below
Your code is badly wrong. Please let me correct it first. > my @arrayref; > > sub do_something { > my $something = @_; That will set $something to the number of parameters passed in @_ To retrieve the first parameter you should write my ($something) = @_; or my $something = shift; > open FILE, "$something", or die; You should not quote scalar variables unless you know what it does and have a reason to do it. Also the it is far better and safer to use lexical file handles and the three-parameter form of open, and you should incorporate the $! variable into the die string so that it is clear why the open has failed. open my $file, '<', $something or die $!; > while (<FILE>) { while (<$file>) { if you are using my proposed change. > my @array = map (split /,/)[1,2,3,5]; That will probably not compile. You are calling map(split /,/) and map requires either a block or an expression as its first parameter, followed by a list to map. You mean simply my @array = (split /,/)[1,2,3,5]; > push @arrayref, [EMAIL PROTECTED]; > } > close FILE; If you use a lexical file handle $file then it will be closed implicitly when it goes out of scope at the end of the subroutine. There is no need for an explicit call to close. > } > > my @arrayref_copy = do_something($something); > > > > Let's for a moment forget about my inefficient style and just look at > the last step. If I wanted to use @arrayref_copy and pass it into another > subroutine,should I reference them again?(if file itself was pretty big?) > > another_sub([EMAIL PROTECTED]); <-- is this the right thing to do? or is > this redundant since array is already collection of reference? > > sub another_sub { > > } Yes that would be fine. It helps because you're not copying all the references to a second list. But I would go a step further and pass it back from the first subroutine as a reference to an array. Like this sub read_file { my $name = shift; open my $fh, '<', $name or die $!; my @data; while (<$fh>) { my @record = (split /,/)[1, 2, 3, 5]; push @data, [EMAIL PROTECTED]; } return [EMAIL PROTECTED]; } and then you can write my $data = read_file('filename'); my $result = another_sub($data); and so on. HTH, Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/