+ -
当前位置:首页 → 问答吧 → 新特性: Array and hash container functions accept references

新特性: Array and hash container functions accept references

时间:2010-11-25

来源:互联网

本帖最后由 zhlong8 于 2010-11-25 19:30 编辑

看 perldelta 5.13.7 看到的, push pop 不用写那么难看了以后。表格对不齐了一引用


QUOTE:
=head2 Array and hash container functions accept references

All built-in functions that operate directly on array or hash
containers now also accept hard references to arrays or hashes:

|-------------------------------+-----------------------------|
| Traditional syntax              | Terse syntax                   |
|-------------------------------+-----------------------------|
| push @$arrayref, @stuff    | push $arrayref, @stuff    |
| unshift @$arrayref, @stuff | unshift $arrayref, @stuff |
| pop @$arrayref                  | pop $arrayref             |
| shift @$arrayref                 | shift $arrayref           |
| splice @$arrayref, 0, 2       | splice $arrayref, 0, 2    |
| keys %$hashref                 | keys $hashref             |
| keys @$arrayref                 | keys $arrayref            |
| values %$hashref              | values $hashref           |
| values @$arrayref              | values $arrayref          |
| ($k,$v) = each %$hashref   | ($k,$v) = each $hashref   |
| ($k,$v) = each @$arrayref  | ($k,$v) = each $arrayref  |
|----------------------------+---------------------------|

This allows these built-in functions to act on long dereferencing chains
or on the return value of subroutines without needing to wrap them in
C<@{}> or C<%{}>:

    push @{$obj->tags}, $new_tag;  # old way
    push $obj->tags,    $new_tag;  # new way
    for ( keys %{$hoh->{genres}{artists}} ) {...} # old way
    for ( keys $hoh->{genres}{artists}    ) {...} # new way

For C<push>, C<unshift> and C<splice>, the reference will auto-vivify
if it is not defined, just as if it were wrapped with C<@{}>.

Calling C<keys> or C<values> directly on a reference gives a substantial
performance improvement over explicit dereferencing.

For C<keys>, C<values>, C<each>, when overloaded dereferencing is
present, the overloaded dereference is used instead of dereferencing the
underlying reftype.  Warnings are issued about assumptions made in the
following three ambiguous cases:

    (a) If both %{} and @{} overloading exists, %{} is used
    (b) If %{} overloading exists on a blessed arrayref, %{} is used
    (c) If @{} overloading exists on a blessed hashref, @{} is used

作者: zhlong8   发布时间: 2010-11-25

都是浮云··

作者: wfnh   发布时间: 2010-11-25

perl 的很多东西都是这么一点一点堆出来的,这个我喜欢

作者: zhlong8   发布时间: 2010-11-25