Как я могу распределить свое приложение Perl как единственный файл?

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

проблема с известным примером, который Вы даете, очень характерна для потоки , не вызовы статического метода. Выглядит, как будто Вы добираетесь activeCount() для потока, упомянутого thread, но Вы действительно получаете счет для вызывающего потока. Это - логическая ошибка, которую Вы как программист совершаете. Издание предупреждения является соответствующей вещью для компилятора, чтобы сделать в этом случае. Вам решать учесть предупреждение и зафиксировать Ваш код.

РЕДАКТИРОВАНИЕ: Я понимаю, что синтаксис языка - то, что разрешение Вы, чтобы написать вводящий в заблуждение код, но помнить, что компилятор и его предупреждения являются частью языка также. Язык позволяет Вам делать что-то, что компилятор считает сомнительным, но он дает Вам предупреждение удостовериться, что Вы знаете, что он мог вызвать проблемы.

5
задан brian d foy 15 September 2009 в 16:09
поделиться

5 ответов

Ваш код не работал (хотя было бы полезно указать сообщения об ошибках, которые вы получили), потому что вы пытались использовать 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
}

Дополнения:

3
ответ дан 18 December 2019 в 10:46
поделиться

Если вы хотите упаковать свой Perl-скрипт в двоичный файл со всеми модулями, от которых он зависит, вы можете использовать PAR Packager :

pp -o binary_name foo.pl
5
ответ дан 18 December 2019 в 10:46
поделиться

Файл может содержать несколько пакетов. Сначала поместите свой класс, а затем основной сценарий:

package Foo::Bar;

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

#...

package main;

my $foo = Foo::Bar->new();
print ref $foo;  # Foo::Bar
4
ответ дан 18 December 2019 в 10:46
поделиться

У вас уже есть несколько хороших ответов. Кроме того, можно создать модуль, который будет запускаться непосредственно как сценарий.

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.
}

Дополнительные сведения см. В статье Брайана Д Фоя Как сценарий становится модулем .

2
ответ дан 18 December 2019 в 10:46
поделиться

Общая схема будет заключаться в замене вашего «require ...» содержимым того, что вам требуется. Это еще не все (может потребоваться BEGIN {}), и я не совсем уверен, в чем дело. Конечно, вы хотите автоматизировать его.

Вот альтернатива: сгенерируйте один исполняемый файл, в котором будут упакованы модули, от которых вы зависите, используя PAR / pp

2
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: