On Thu, Apr 2, 2009 at 07:06, Joseph Mwesigwa Bbaale
<joemwesi...@gmail.com> wrote:
> Hello,
>
> I am a complete beginner - no programming background.
> I want to begin with Perl and I decided to by Randal's book "*Learning Perl*".
> I seem to have been progressing smoothly till when I arrived at the code
> below on page 65.
>
> my @names = qw/ tom fred dan betty roy /;
> my $result = &which_element_is("dan" @names);
>
> sub which_element_is {
>    my($what, @array) = @_;
>    foreach (0..$#array) {
>        if ($what eq $array[$_]) {
>            return $_;
>        }
>    }
>    -1;
> }
>
> The author states or seems to imply that, "... *...@array* is a copy of 
> *...@names
> *"! But I don't understand how and why this is so.
> I am stuck.
> Please, can someone help and explain to me how and why *...@array* is a copy 
> of
> *...@names?
snip

You can copy one array into another like this:

    my @first_array  = (1, 2, 3, 4);
    my $second_array = @first_array;

The array @second_array will contain (1, 2, 3, 4).  It is important to
note that this is a copy, so if you where to say

    $first_array[0] = 5;

The array @first_array would contain (5, 2, 3, 4), but @second_array
would be unaffected and therefore would still contain (1, 2, 3, 4).

You can also use list assignment with scalar variables:

    my @array = (1, 2, 3);
    my ($x, $y, $z) = @array;

In this case $x will be 1, $y will be 2, and $z will be 3.  You can
also mix scalars and an array so long as the array goes last:

    my @first_array                = (1, 2, 3, 4, 5, 6, 7);
    my ($x, $y, $z, @second_array) = @array;

Here $x will be 1, $y will be 2, $z will be 3 and @second_array will
be (4, 5, 6, 7).

Now, when you call a function in Perl the items you hand to the
function get put in the special array @_, so if you have a function

    sub foo {
        print "first arg is $_[0], second arg is $_[1]\n";
    }

and you say

    foo("abcd", 55);

the program will print "first arg is abcd, second arg is 55\n".  We
can see that the function in the sample code is being called with
("dan", @names).  At the time of the call @names contains ("tom",
"fred", "dan", "betty", "roy").  This means that inside the function
@_ will be ("dan", "tom", "fred", "dan", "betty", "roy").  Which means
when

    my($what, @array) = @_;

executes $what get become "dan" and @array get become ("tom", "fred",
"dan", "betty", "roy").

I hope this helps, please ask for clarifications if you need them.

-- 
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to