LINUX.ORG.RU

Perl структуры


0

1

Подскажите что бы почитать по «сложным» структурам в перл. Наверное не совсем ясно выразился. Лучше приведу аналогию из С++

struct dataType {
 int num;
 char *name;
};

class foo {
 dataType data[];
};

foo bar;
bar.data[1].num=10;
bar.data[1].name="fgdfg";

всякие алокации и т.д. я упустил в коде, только для изображения сути вопроса:)

★★★★★

Последнее исправление: Jetty (всего исправлений: 1)
Ответ на: комментарий от anonymous

нет, мне ооп не нужен :)
Именно вложенные структуры :)

Jetty ★★★★★
() автор топика
Ответ на: комментарий от unsigned

Кажись хватит ))))
Думаю ответ как все это создать найдется быстро :)
Спасибо :)

Jetty ★★★★★
() автор топика
my $bar = {
	data => [
		{ num => 10, name => 'fgdfg' },
		{ num => 12, name => 'qwerty' }
	]
};

say $bar->{data}->[0]->{num};
say $bar->{data}[1]{name};
arsi ★★★★★
()

Как обычно, все оказалось проще чем я искал :) Вот результат:

#!/usr/bin/perl -w

{
        use strict;
        package abc;

        our %storage;

        sub new {
                my $self = shift;
                return $self;
        }

        sub add {
                my $self = shift;
                my $arg = shift;
                $storage{$arg} = { count => 0, status => 1};
        }

        sub show {
                my $self = shift;
                my $arg = shift;
                print "count: ".$storage{$arg}->{count}."\n";
                print "status: ".$storage{$arg}->{status}."\n";
        }

        1;
}

my $p = new abc;

abc->add("val");
abc->show("val");

exit 0;
Jetty ★★★★★
() автор топика
Ответ на: комментарий от Jetty

ппц. ежели это синглтон, то new не нужен а методы надо вызывать как abc::add(«val»);

Ежели это не синглтон, то 1) new должен возвращать blessed ref 2) our %storage; не нужен, структура должна быть внутри класса.

эксит не нужен. скобочки вокруг пакаджа не нужны, ибо надо писать package main; раз уж так хочется в одном файле.

iSage ★★★★
()
Ответ на: комментарий от iSage

1) new должен возвращать blessed ref

так ?

sub new {
  my $class = @_;
  my $self = {};
  return bless($self, $class);
}

2) our %storage; не нужен, структура должна быть внутри класса.

Вот это я как раз и не понял, точнее не понял как ее определить корректно.

эксит не нужен.

Это в случае внутрифайлового пакаджа, а если в отдельный pm засунуть то нужен, верно ?

скобочки вокруг пакаджа не нужны

Это просто для отступа и читабельности :)

Jetty ★★★★★
() автор топика
Ответ на: комментарий от iSage

разделил на части, вот что получилось:

File: abc.pm


#!/usr/bin/perl -w
use strict;
package abc;

use vars qw(%storage);

sub new {
        my $class = shift;
        return bless({}, $class);
}

sub add {
        my $self = shift;
        my $arg = shift;
        $storage{$arg} = { count => 0, status => 1};
}

sub show {
        my $self = shift;
        my $arg = shift;
        print "count: ".$storage{$arg}->{count}."\n";
        print "status: ".$storage{$arg}->{status}."\n";
}

1;

__END__
File: test.pl


#!/usr/bin/perl -w

use strict;
use abc;

my $p = abc->new();

$p->add("val");
$p->show("val");

exit 0;
Jetty ★★★★★
() автор топика
Ответ на: комментарий от Jetty
#!/usr/bin/perl -w
use strict;
package abc;


sub new {
        my $class = shift;
        my $self = {};
        $self->{'storage'}={};
        return bless($self, $class);
}

sub add {
        my $self = shift;
        my $arg = shift;
        $self->{'storage'}->{$arg} = { count => 0, status => 1};
}

sub show {
        my $self = shift;
        my $arg = shift;
        if (defined $self->{'storage'}->{$arg})
        {
            print "count: ".$self->{'storage'}->{$arg}->{count}."\n";
            print "status: ".$self->{'storage'}->{$arg}->{status}."\n";
        }
}

1;

#!/usr/bin/perl -w

use strict;
use abc;

my $p = abc->new();

$p->add("val");
$p->show("val");
$p->show("noval");
iSage ★★★★
()
Ответ на: комментарий от Jetty

exit нужен только если надо выйти не закончив обработку. в случае пакаджа в отдельном файле файл должен возвращать 1.

iSage ★★★★
()
Ответ на: комментарий от iSage

Спасибо :)
Мысли окончательно упорядочились :)

Jetty ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.