Python is readable

Kiuhnm kiuhnm03.4t.yahoo.it
Fri Mar 16 12:58:36 EDT 2012


On 3/16/2012 17:25, Steven D'Aprano wrote:
> On 2012年3月16日 13:55:06 +0100, Kiuhnm wrote:
>>>>> I don't understand the reason for $arg1 and $arg2. Is there some reason
>>> why the code couldn't do this instead?
>>>>>> my(@list1, @list2) = @_;
>>>> @_ contains references to arrays. You can't pass two arrays to a
>> function.
>>> Why ever not? That seems like basic functionality to me. I can't imagine
> any modern language that lacks such a simple feature. Even Pascal allows
> you to pass arrays as arguments to functions.
>> Is there some design principle that I'm missing that explains why Perl
> lacks this feature?

Perl uses references only when explicitly told so.
For instance,
 my @a = (1,2,3);
 my @b = @a;
creates two distinct arrays and you can modify @b without touching @a at 
all.
Another odd thing is that Perl "flattens" lists or arrays. If you write
 my @a = (1,2,3);
 my @b = (0, at a,4);
you'll end up with @b = (0,1,2,3,4).
If you want nested data structures, you'll need to use explicit references:
 my @b = (0,\@a,4); # '\' = take the ref of
Now you can write
 $b[1][0]
but that's short-hand for
 $b[1]->[0] # deref. $b[1] and get the first elem
which is short-hand for
 ${$b[1]}[0]
Square brackets build an array and return a reference to it:
 my $ref = [0,1,2];
(Notice that, in Perl, '$' means one ($ref is one reference), while '@' 
means many.)
Now you can write
 my @a = (1,[2,3,4],5)
because you're putting a reference into $a[1]!
So, let's go back to this code:
 sub pairwise_sum {
 my($arg1, $arg2) = @_;
 my(@result) = ();
 @list1 = @$arg1;
 @list2 = @$arg2;
 for($i=0; $i < length(@list1); $i++) {
 push(@result, $list1[$i] + $list2[$i]);
 }
 return(\@result);
 }
Here @list1 and @list2 are copies. No careful Perl programmer would do 
such extra copies. And no Perl programmer would use a C-style for loop.
Kiuhnm


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /