[Moscow.pm] Strategy ("Стратегия") и "Декоратор"(Decorator/Wrapper) реализация на Perl

Shrub Alexey ashrub на agava.com
Чт Июл 10 01:30:09 PDT 2008


Missing right curly or square bracket at ./decorator.pl line 144, at end 
of line
syntax error at ./decorator.pl line 144, at EOF
Execution of ./decorator.pl aborted due to compilation errors.

main не закрыт

Orlovsky Alexander wrote:
> 10.07.08, 10:01, "Shrub Alexey" <ashrub на agava.com>:
> 
>> Can't bless non-reference value at ./decorator.pl line 31
>> поправил, получил
>> Can't use string ("f") as an ARRAY ref while "strict refs" in use at 
>> ./decorator.pl line 120.
>> дальше смотреть поленился, что не так?
> 
> При копи-пасте потерялись обратные слеши, вот рабочий исходный код:
> 
> 
> #!/usr/bin/perl
> use strict;
> use warnings;
> 
> main();
> exit;
> 
> sub main {
>     my $printer =
>         VerticalDecorator->new(
>             ReverseDecorator->new(
> #                SimpleArrayPrinter->new(
>                 PrettyArrayPrinter->new(
>                     data     => [ [ 'a' .. 'f' ], [ 1 .. 6 ], [ 'g' .. 'l' ] ],
>                     splitter => ' ',
>                     format   => {
>                         title => 'Data Title',
>                     },
>                 )
>             )
>         );
> { # interface description (for Decorators and Components) and implementation:)
> package ArrayPrinter;
>     sub new {
>         my $class = shift;
>         my %params = @_;
>         return bless \%params, $class;
>     }
> 
>     sub print_data { } 
> 
>     sub set_data {
>         my $self = shift;
>         my $ref = shift;
>         $self->{data} = $ref;
>     }
> 
>     sub get_data {
>         my $self = shift;
>         return $self->{data};
>     }
> }
> 
> { # Concrete component SimpleArrayPrinter
> package SimpleArrayPrinter;
> use base 'ArrayPrinter';
> 
>     sub print_data {
>         my $self = shift;
>         for my $a ( @{ $self->get_data() } ) {
>             print join($self->{splitter}, @{$a}), "\n";
>         }
>     }
> }
> 
> { # Concrete component PrettyArrayPrinter
> package PrettyArrayPrinter;
> use base 'ArrayPrinter';
>     use Data::Dumper;
>     use Pretty::Table;
> 
>     sub print_data {
>         my $self = shift;
>         my $pt = Pretty::Table->new(
>             %{ $self->{'format'} }
>         );
>         $pt->set_data_ref( $self->get_data() );
>         print $pt->output();
>     }
> }
> 
> { # Decorator's base class
> package Decorator;
> use base 'ArrayPrinter';
>     sub new {
>         my $class = shift;
>         my $component = shift;
>         my $self = bless { component => $component }, $class;
>         return $self;
>     }
> 
>     sub print_data {
>         my $self = shift;
>         $self->{component}->print_data();
>     }
> 
>     sub set_data {
>         my $self = shift;
>         $self->{component}->set_data(@_);
>     }
> 
>     sub get_data {
>         my $self = shift;
>         return $self->{component}->get_data(@_);
>     }
> }
> 
> { # Concrete decorator: VerticalDecorator
> package VerticalDecorator;
> use base 'Decorator';
>     use Data::Dumper;
> 
>     sub new {
>         my $class = shift;
>         my $self = $class->SUPER::new(@_);
>         $self->_vertical();
>         return $self;
>     }
> 
>     sub _vertical {
>         my $self = shift;
>         my @result;
>         for my $a ( @{ $self->{component}->get_data() } ) {
>             my $i = 0;
>             for my $elem ( @{$a} ) {
>                 push @{ $result[$i] }, $elem;
>                 $i++;
>             }
>         }
>         $self->{component}->set_data( \@result );
>     }
> }
> 
> { # Concrete decorator: ReverseDecorator
> package ReverseDecorator;
> use base 'Decorator';
> 
>     sub new {
>         my $class = shift;
>         my $self = $class->SUPER::new(@_);
>         $self->_reverse_data();
>         return $self;
>     }
> 
>     sub _reverse_data {
>         my $self = shift;
>         my @data;
>         for my $a ( @{ $self->{component}->get_data() } ) {
>             push @data, [ reverse @{$a} ];
>         }
>         $self->{component}->set_data( \@data );
>     }
> }
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org

-- 
Шруб Алексей
developer
icq: 345894734
http://www.agava.ru/


Подробная информация о списке рассылки Moscow-pm