Почему это должна быть ошибка? Экземпляр имеет доступ ко всем статическим методам. Статические методы не могут измениться, состояние экземпляра (пробующий к ошибка компиляции).
проблема с известным примером, который Вы даете, очень характерна для потоки , не вызовы статического метода. Выглядит, как будто Вы добираетесь activeCount()
для потока, упомянутого thread
, но Вы действительно получаете счет для вызывающего потока. Это - логическая ошибка, которую Вы как программист совершаете. Издание предупреждения является соответствующей вещью для компилятора, чтобы сделать в этом случае. Вам решать учесть предупреждение и зафиксировать Ваш код.
РЕДАКТИРОВАНИЕ: Я понимаю, что синтаксис языка - то, что разрешение Вы, чтобы написать вводящий в заблуждение код, но помнить, что компилятор и его предупреждения являются частью языка также. Язык позволяет Вам делать что-то, что компилятор считает сомнительным, но он дает Вам предупреждение удостовериться, что Вы знаете, что он мог вызвать проблемы.
Ваш код не работал (хотя было бы полезно указать сообщения об ошибках, которые вы получили), потому что вы пытались использовать Foo :: Bar до того, как он был определен. Попробуйте следующее:
use strict;
use warnings;
my $foo = Foo::Bar->new();
# more code...
# end code
# begin definitions
BEGIN {
package Foo::Bar;
use strict;
use warnings;
# definitions...
1;
package Foo::Baz;
# more stuff, if you need to define another class
}
Дополнения:
Если вы хотите упаковать свой Perl-скрипт в двоичный файл со всеми модулями, от которых он зависит, вы можете использовать PAR Packager :
pp -o binary_name foo.pl
Файл может содержать несколько пакетов. Сначала поместите свой класс, а затем основной сценарий:
package Foo::Bar;
sub new {
my $class = shift;
return bless {}, $class;
}
#...
package main;
my $foo = Foo::Bar->new();
print ref $foo; # Foo::Bar
У вас уже есть несколько хороших ответов. Кроме того, можно создать модуль, который будет запускаться непосредственно как сценарий.
package Foo;
__PACKAGE__->run(@ARGV) unless caller();
sub run {
# Do stuff here if you are running the Foo.pm as
# a script rather than using it as a module.
}
Дополнительные сведения см. В статье Брайана Д Фоя Как сценарий становится модулем .
Общая схема будет заключаться в замене вашего «require ...» содержимым того, что вам требуется. Это еще не все (может потребоваться BEGIN {}), и я не совсем уверен, в чем дело. Конечно, вы хотите автоматизировать его.
Вот альтернатива: сгенерируйте один исполняемый файл, в котором будут упакованы модули, от которых вы зависите, используя PAR / pp