Работа с типами в Perl.

Я много лет работал с Fortran и, конечно же, с Types в Fortran.

Теперь, поскольку я работаю в новой компании, мне приходится работать с Perl.

Поскольку моя основная работа заключается в работе с данными в текстовом файле и чтении файла, я хочу генерировать «объекты» или «типы» из этих данных. На Фортране я бы так и сделал, так дальше работать намного проще :)

Можно ли с помощью Perl генерировать типы для схемы строгого типа, как я могу это сделать в Fortran?

Например... вот что я бы сделал на Фортране:

Type demoType
    integer i
    character(256) str
end Type

Затем я могу работать с переменными этого типа. Type(demoType) demoVar напр.

Есть ли шанс так работать в Perl?

Извините за мой английский ... Я говорю по-немецки по рождению :)


person ratzeputz    schedule 09.04.2013    source источник
comment
Вы должны привести пример данных, с которыми вы работаете. То, что вы привыкли работать с типами и объектами, не означает, что это лучший (или самый простой!) способ работы в Perl.   -  person TLP    schedule 09.04.2013
comment
Ну, я хотел бы привести несколько примеров данных, но я не могу из-за конфиденциальности :(   -  person ratzeputz    schedule 09.04.2013
comment
Мне на самом деле не нужно объяснять вам, что вам не нужно публиковать реальные данные, не так ли? Потому что это было бы так утомительно.   -  person TLP    schedule 09.04.2013
comment
Этот вопрос напоминает мне цитату из Higher Order Perl: "A good Fortran programmer can write Fortran programs in any language" ;)   -  person Zaid    schedule 09.04.2013
comment
Да, но проблема в том, что я работаю с PERL сегодня первый день и точно не знал, что возможно, а что нет. Так почему же использовать метод проб и ошибок в течение нескольких часов, когда спрашиваешь профессионалов PERL, это быстрее? Так почему ты такой оскорбительный?   -  person ratzeputz    schedule 09.04.2013
comment
@ratzeputz Нет, проблема в том, что вы, вероятно, задали неправильный вопрос, потому что не знали, какой вопрос задать. Так что правильный способ спросить, как я сказал с самого начала, — это описать, как выглядят ваши данные. Тогда мы можем рассказать вам, как его разобрать. Если вы не понимаете Perl, Class::Struct вам не сильно поможет.   -  person TLP    schedule 09.04.2013
comment
@ratzeputz: я вовсе не хотел вас обидеть ... вы спросили, как вы можете имитировать типы Fortran в Perl, чтобы вы хотели писать программы в стиле Fortran на Perl. Об этом же говорит и цитата. Учитывая ваш опыт работы с Fortran, в этом нет ничего плохого. Возможно, через несколько лет вы вернетесь к своему вопросу с улыбкой и скажете: «Чувак, я действительно использовал часть возможностей Perl». Я был там и сделал это. И добро пожаловать в StackOverflow :)   -  person Zaid    schedule 09.04.2013
comment
В каком из моих ответов я написал, что не понимаю PERL? Я сказал, что сегодня впервые работал с PERL... ни больше, ни меньше. Это не значит, что я этого не понимаю... это значит, что я не знаю преимуществ и того, как я могу решить свою проблему на любом другом варианте, как я сделал бы это на Фортране. Поскольку я должен решить свою проблему быстро, способ, к которому я привык, является лучшим для меня. Я понимаю Class::Struct и могу с этим работать... так что проблема решена. @Zaid: Спасибо за приветственные слова ... но я думаю, что никогда не буду чувствовать себя здесь как дома ;)   -  person ratzeputz    schedule 09.04.2013


Ответы (4)


Есть несколько модулей CPAN, которые могут вам помочь. Это вариант: Class::Struct (который входит в стандартный дистрибутив perl, дальнейшая установка не требуется). Пример (взято из документации модуля):

use Class::Struct;

struct( Rusage => {
        ru_utime => 'Timeval',  # user time used
        ru_stime => 'Timeval',  # system time used
});

struct( Timeval => [
        tv_secs  => '$',        # seconds
        tv_usecs => '$',        # microseconds
]);

# create an object:
my $t = Rusage->new(ru_utime=>Timeval->new(), ru_stime=>Timeval->new());


# $t->ru_utime and $t->ru_stime are objects of type Timeval.
# set $t->ru_utime to 100.0 sec and $t->ru_stime to 5.0 sec.
$t->ru_utime->tv_secs(100);
$t->ru_utime->tv_usecs(0);
$t->ru_stime->tv_secs(5);
$t->ru_stime->tv_usecs(0);
person Miguel Prz    schedule 09.04.2013
comment
Большое спасибо ... кажется, это то, к чему я привык из своего прошлого на Фортране :) - person ratzeputz; 09.04.2013

В FORTRAN, как и в C, переменные в основном занимают фиксированное место в памяти. Таким образом, Type, как и ваш demoType, описывает, как размещается элемент, и таким вещам, как строки, должен быть предварительно назначен максимальный размер.

В Perl скалярное значение — в основном строки и числа — занимает намного больше места, чем просто место для самого значения, и поэтому не может быть отображено таким же образом.

Чтобы программировать на Perl, вы должны дистанцироваться от реализации и позволить системе времени выполнения позаботиться обо всем за вас. Строка может изменяться в размере на неопределенный срок (зависит от памяти компьютера), и предпочтительным способом связывания наборов значений является использование хэша (типа массива, который индексируется произвольными строками, а не числа).

Например, одиночное значение demoType может выглядеть так:

my $demo_type = {
  i => 99,
  str => 'text'
}

и если вы хотите работать со многими такими парами, вам следует взглянуть на объекты Perl.

Если у вас нет опыта работы с объектно-ориентированным программным обеспечением, то вас ждет долгий и увлекательный путь!

person Borodin    schedule 09.04.2013
comment
Ну, у меня есть опыт работы с .NET... так что объектно-ориентированный не проблема. Даже спустя много лет я не использовал .NET :) - person ratzeputz; 09.04.2013
comment
Объектно-ориентированное программирование на Perl — это немного сделай сам, в том смысле, что конструктор — это просто еще один метод, методы — это просто подпрограммы, и вы должны явно собирать и использовать параметр this. Почти все, что предлагает Perl, — это инкапсуляция через пакеты, наследование и полиморфизм с использованием bless и синтаксиса вызова метода, представленного в Perl 5. - person Borodin; 09.04.2013

Я бы посоветовал вам взглянуть на Modern Perl.
Если вы хотите работать с типами, а затем посмотреть на Moose, чтобы работать объектно-ориентированным способом и предоставлять методы и атрибуты.
Ядро perl динамически оценивает переменную, чтобы присвоить ей тип.

person weismat    schedule 09.04.2013

Я думаю, вы, возможно, пытаетесь сохранить целочисленное значение и строковое значение одного и того же числа.

{
  i = 123;
  str = "123";
}

Если это так, вы пытаетесь сделать что-то, что Perl делает за вас автоматически.

my $integer = 123;

my $string = $integer;

print $string;

Другая возможность заключается в том, что вам нужно связать число со строкой. В этом случае вы можете просто использовать:

  • массив.

    my @data = ( 123, 'string' );
    
    print 'integer: ', $data[0], "\n";
    print 'string: ', $data[1], "\n";
    
  • ссылка на массив

    my $data = [ 123, 'string' ];
    
    print 'integer: ', $data->[0], "\n";
    print 'string: ', $data->[1], "\n";
    
  • хэш

    my %data = (
      123 => 'string',
    );
    
    print $data{123}, "\n";
    
  • хэш-ссылка

    my $data = {
      123 => 'string',
    };
    
    print $data->{123}, "\n";
    

В любом случае вы должны публиковать анонимные примеры данных, чтобы мы действительно могли помочь вам изучить Perl.

Я думаю, вам следует прочитать документацию по Perl. Он довольно обширен. Именно так я научился программировать на Perl.

Как минимум прочитайте perlintro и perldata. Если вам нужно создать вложенные структуры данных, вам также следует обратиться к perldsc.

Вы также можете посмотреть на learn.perl.org.

person Brad Gilbert    schedule 09.04.2013