экспорт pdl () только из Perl PDL - PullRequest
0 голосов
/ 26 января 2012

Я хочу экспортировать только функцию pdl() из PDL, чтобы избежать конфликта пространства имен с другими автоматически экспортируемыми функциями, такими как max, median, sum, intersect и т. Д.

use PDL qw(pdl);

это не работает, так как вышеупомянутые функции все еще экспортируются (и я получаю предупреждения о переопределении функций).

С другой стороны, если я сделаю

use PDL qw();

Столкновение не происходит. Но когда я пытаюсь использовать функцию pdl() в программе через PDL::pdl(), происходит сбой с сообщением об ошибке:

Can't call method "new" on unblessed reference at Basic/Core/Core.pm.PL (i.e. PDL::Core.pm) line 934.

Также я попробовал внутри скрипта

{
     require PDL;
     pdl();
}

Я получаю то же сообщение об ошибке.

Может кто-нибудь посоветовать, как я могу экспортировать только pdl ()? Thx!

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Я на самом деле немного удивлен, что use PDL qw() делает что-то отличное от use PDL.На самом деле, я не понимаю, как это возможно: код из PDL::import не обращает внимания на свои аргументы.Для этой цели был создан другой модуль под названием PDL::Lite, который эквивалентен:

use PDL::Core '';
use PDL::Ops '';
use PDL::Primitive '';
use PDL::Ufunc '';
use PDL::Basic '';
use PDL::Slices '';
use PDL::Bad '';
use PDL::Version;
use PDL::Lvalue;

Некоторые дополнительные функции из обычного use PDL вырезаны, и ни одна из функций не импортирована.(PDL::Lvalue и PDL::Version ничего не экспортируют.)

На ваш второй вопрос, когда вы use PDL::Lite, вы все равно можете получить в конструкторе pdl с PDL->pdl(1, 2, 3).Вы не можете сказать PDL::pdl(1, 2, 3), потому что конструктор фактически определен в пакете PDL::Core.Пойди разберись.Итак, PDL::Core::pdl(1, 2, 3) делает то, что вы имели в виду, но это не очевидный выбор.

1 голос
/ 26 января 2012

ОПИСАНИЕ использовать PDL;# Эквивалентно следующему:

   use PDL::Core;
   use PDL::Ops;
   use PDL::Primitive;
   use PDL::Ufunc;
   use PDL::Basic;
   use PDL::Slices;
   use PDL::Bad;
   use PDL::MatrixOps;
   use PDL::Math;
   use PDL::Version;
   use PDL::IO::Misc;
   use PDL::IO::FITS;
   use PDL::IO::Pic;
   use PDL::Lvalue;

Полагаю, если вы импортируете только PDL :: Core, вы получите только функции в этом модуле.

...