📄 ref.pm
字号:
# The source files are wholly original Motorola proprietary work now being # licensed as BSD, the following Copyright Notice will be added to each source # code file, documentation and other materials with the distribution:# # Copyright 2006, Motorola, All Rights Reserved.# # This program is licensed under a BSD license with the following terms:# # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met:## - Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. ## - Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. ## - Neither the name of the MOTOROLA nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission.### THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE.#package Ref;#==============================================================================## General Description:# Provides deep copy functionality##==============================================================================use strict;use Symbol ();use overload ();sub copy { my ($ref,$_depth,$_cache) = @_; my $class = ref($ref); return($ref) if ($class eq ''); # for class function usage, force object method to be invoked if present return _copy($ref,$_depth,$_cache) unless $_depth++; my $copy; my $addr = overload::StrVal($ref); if (exists($_cache->{$addr})) { $copy = ${$_cache->{$addr}}; } else { $_cache->{$addr} = \$copy; my ($class,$type) = ($addr =~ /^(?:(.*)=)?(.*)\(/o); if ($type eq 'HASH') { $copy = {}; while (my ($k,$v) = each(%$ref)) { $copy->{$k} = _copy($v,$_depth,$_cache); } } elsif ($type eq 'ARRAY') { $copy = []; for my $i (0..$#$ref) { $copy->[$i] = _copy($ref->[$i],$_depth,$_cache) if ( exists($ref->[$i]) ); } } elsif ($type eq 'GLOB') { $copy = Symbol::gensym; *$copy = *$ref; } elsif ($type eq 'SCALAR') { $$copy = $$ref; } elsif ($type eq 'REF') { $copy = \_copy($$ref,++$_depth,$_cache); } elsif ($type eq 'CODE') { $copy = $ref; } else { die("unable to copy: $ref"); } bless($copy,$class) if defined($class); } $copy;}sub _copy { UNIVERSAL::isa($_[0],__PACKAGE__) ? shift->copy(@_) : © }1;__END__ =head1 NAMERef - provides deep copy for objects and references=head1 SYNOPSIS use Ref; my $copy = Ref::copy($ref); package Object; use base 'Ref'; ... my $obj = Object->new; my $copy = $obj->copy;=head1 DESCRIPTIONThis module provides a means to deep copy objects or references. TheC<copy> routine may be invoked as either a class function or an objectmethod which subclasses may wish to override.=head1 AUTHORDaryn SharpWorldwide Software Development(c) Copyright Motorola 2002, All Rights Reserved
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -