好用的Perl包 Class::Ref

包的鏈接 https://metacpan.org/pod/Class::Ref

網頁上介紹是 Class::Ref - Automatic OO wrapping of container references
就是將一個哈希、數組引用到一個 package 中來使用。

下面給出一個例子:

#!/usr/bin/perl

use FindBin qw($RealBin);
use lib "$RealBin/lib";
use lib "$RealBin";

use Class::Ref;

# example 1
### creat a hash
$test = { 
        foo => { 
                bar => 'Hello World!' 
                } 
        };


$obj = Class::Ref->new($test);
print $obj->foo->bar . "\n";    # returns "Hello World!"
$obj->baz({ blah => 123 });
print $obj->baz->blah . "\n";    # returns 123


#example 2
$group1 = { 
        foo => { 
                bar => 'group1 Hello World!' 
                } 
        };

$group2 = { 
        server => { 
                ip => '192.168.32.1',
                dc => 'eqdc10', 
                } 
        };

$list = { %{$group1}, %{$group2} };
$obj = Class::Ref->new($list);
print $obj->foo->bar . "\n";   
print $obj->server->ip . "\n";   
print $obj->{server}{dc} . "\n";   



# example 3
$obj = Class::Ref->new({ foo => [{ bar => 'Hello Again!' }] });
print $obj->foo->[0]->bar . "\n";    # returns "Hello Again!"

運行結果如下所示:
運行結果

再列舉一個使用的例子,我們要做一個 Foo.pm 的包,可以使用 Class::Ref 來製作這個類的屬性值, 通過引用綁定外部的哈希或者數組,具體使用見下面的代碼,給出了詳細的代碼。

package Foo;

use Carp;
use Class::Ref;

use strict;
use vars qw($VERSION $Debug);


######################################################################
#### Configuration Section

$VERSION = '3.426';


######################################################################
###

sub new {
    @_ >= 1 or croak 'usage: Foo->new ({options})';
    my ($class, $ARGS) = (@_);

    my $self = bless {}, $class;

    my $obj = Class::Ref->new($ARGS);

    $self->{REF} = $obj;

    return ($self);

}


sub test {
    my $self = shift;

    # 
    print $self->{REF}->{'foo'}{'bar'} . "\n";

    # 
    print $self->{REF}->foo->bar . "\n";
} 



# Dump 
1;

測試使用代碼如下:

#!/usr/bin/perl

use FindBin qw($RealBin);
use lib "$RealBin/lib";
use lib "$RealBin";

use Foo;

###

$group1 = { 
        foo => { 
                bar => 'group1 Hello World!' 
                } 
        };

$group2 = { 
        server => { 
                ip => '192.168.32.1',
                dc => 'eqdc10', 
                } 
        };

$obj = Foo->new( { %{$group1}, %{$group2} } );
$obj->run;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章