Возвращая "ссылки", а не значения из sub? - PullRequest
1 голос
/ 23 августа 2011

У меня есть подпрограмма в perl (автоматически генерируется SWIG), из которой я хочу вернуть несколько значений.Тем не менее, я, кажется, получаю переменные метаданные вместо фактических значений.

sub getDate {
    my $tm = *libswigperlc::MyClass_getDate;
    ($tm.sec, $tm.min, $tm.hour, $tm.day, $tm.month, $tm.year + 1900);
}

Вызывающая сторона выглядит так ...

my ($sec,$min,$hour,$day,$month,$year) = $s->getDate();
print "$year-$month-$day $hour:$min\n";

$ tm.year + 1900 действительно возвращает значение, как и хотел.Если я добавлю «+ 1» к другим значениям, они тоже будут работать как хотелось.

Но

print $month;

приводит к

*libswigperlc::MyClass_getDatemonth

вместо

3

Каков наилучший способ вернуть значения вызывающей стороне?

Я начинающий пользователь perl - обычно использую C ++.

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Давайте перейдем к более длинному ответу:

  1. Прежде всего, вы используете строгие и предупреждающие прагмы?(используйте строгое; используйте предупреждения;) Они сэкономят вам много времени, отбросив часть вашей свободы Perl (Для меня без них вы выходите из свободы в крайний анархизм (:).

  2. $ tm. Sec сделает это: попытается объединить $ tm с sec. Тогда что за sec? -Если вы используете строгую прагму, то sec - это подпрограмма, объявленная где-то перед вызовом -Если вы не используетестрогая прагма (полагаю, что это так). sec используется как голое слово.

  3. Что такое * libswigperlc :: MyClass_getDate? Возвращает ли он объект, перегружающий оператор конкатенации (.) и/ или добавить в него оператор (+)? Если да (и особенно без строгих прагм / предупреждений), вы можете ожидать любой результат в зависимости от определения функций перегрузки. Получение правильного результата путем + - это одновозможностей.

Это все, что приходит мне в голову, я надеюсь, что другие тоже добавят свои объяснения или исправят мои.

0 голосов
/ 24 августа 2011

tchrist - вы были правы, чтобы подвергнуть сомнению линию typeglob. Эта строка была сгенерирована Swig, и я не понимал этого.

Все, что мне нужно было сделать, это вернуть typeglob как есть ...

sub getDate { 
    *libswigperlc::MyClass_getDate2; 
}

Теперь вызывающий абонент может получить доступ к таким участникам, как этот ...

my $tm = myClass->getDate();
print "Year = $tm->{year}";

По крайней мере, теперь я понимаю это достаточно хорошо, чтобы знать, чтобы оставить все как есть или изменить его так, как это было согласно первоначальной идее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...