Załóżmy, że mam plik Perla, w którym są części, które muszę uruchomić tylko wtedy, gdy jestem nazywany jako skrypt. Pamiętam, jak kiedyś czytałem o włączaniu tych części w metodę main() i robieniu tego, co robiłem, ale nie pamiętałem, co to był warunek(). Wyszukiwanie w Google nie przyniosło niczego pożytecznego. Czy ktoś może wskazać właściwe miejsce, aby to poszukać?W Perlu, w jaki sposób mogę sprawdzić, czy mój plik jest używany jako moduł, czy uruchamiany jako skrypt?
Odpowiedz
Jeśli plik jest wywoływany jako skrypt, nie będzie caller więc można użyć:
main() unless caller;
See brian d foy „s explanation.
#!/usr/bin/perl
use strict;
use warnings;
main() unless caller;
sub main {
my $obj = MyClass->new;
$obj->hello;
}
package MyClass;
use strict;
use warnings;
sub new { bless {} => shift };
sub hello { print "Hello World\n" }
no warnings 'void';
"MyClass"
wyjściowa:
C:\Temp> perl MyClass.pm
Hello World
Korzystanie z innego skryptu:
C:\Temp\> cat mytest.pl
#!/usr/bin/perl
use strict;
use warnings;
use MyClass;
my $obj = MyClass->new;
$obj->hello;
wyjściowa:
C:\Temp> mytest.pl
Hello World
Lepiej tego nie robić, i zamiast wziąć uporządkowanego podejścia podobnego MooseX::Runnable.
Twoja klasa będzie wyglądać następująco:
class Get::Me::Data with (MooseX::Runnable, MooseX::Getopt) {
has 'dsn' => (
is => 'ro',
isa => 'Str',
documentation => 'Database to connect to',
);
has 'database' => (
is => 'ro',
traits => ['NoGetopt'],
lazy_build => 1,
);
method _build_database {
Database->connect($self->dsn);
}
method get_data(Str $for_person){
return $database->search({ person => $for_person });
}
method run(Str $for_person?) {
if(!$defined $for_person){
print "Type the person you are looking for: ";
$for_person = <>;
chomp $for_person;
}
my @data = $self->get_data($for_person);
if([email protected]){
say "No data found for $for_person";
return 1;
}
for my $data (@data){
say $data->format;
}
return 0;
}
}
Teraz masz klasy, który może być używany wewnątrz programu łatwo:
my $finder = Get::Me::Data->new(database => $dbh);
$finder->get_data('jrockway');
wewnątrz interaktywny skrypt, który jest większy niż tylko „w biegu "powyższa metoda:
...
my $finder = Get::Me::Data->new(dsn => 'person_database');
$finder->run('jrockway') and die 'Failure'; # and because "0" is success
say "All done with Get::Me::Data.";
...
Jeśli chcesz zrobić to samodzielnie, możesz powiedzieć:
$ mx-run Get::Me::Data --help
Usage: mx-run ... [arguments]
--dsn Database to connect to
$ mx-run Get::Me::Data --dsn person_database
Type the person you are looking for: jrockway
<data>
$ mx-run Get::Me::Data --dsn person_database jrockway
<data>
Zauważ, jak napisałeś mały kod i jaka jest elastyczność tworzonej klasy. "main if! caller" jest fajny, ale po co zawracać sobie głowę, kiedy możesz zrobić coś lepszego?
(BTW, MX :: Runnable ma wtyczki, dzięki czemu można z łatwością zwiększyć ilość wyświetlanych wyników debugowania, ponownie uruchomić aplikację po zmianie kodu, uczynić aplikację stałą, uruchomić ją w programie profilującym itd.)
+1 za pokazanie drogi łosia.Nadal nie zainwestowałem w ten sposób myślenia. –
nazywam te rzeczy "modulinos" pierwotnie w moim Scripts as Modules artykule Perl Journal (obecnie dr Dobbs). Google to określenie i masz odpowiednie zasoby. Sinan był już powiązany z moimi źródłami programistycznymi w jednej z moich książek, o której mówię. Może Ci się też spodobać How a Script Becomes a Module.
- 1. Skrypt wsadowy uruchamiany jako administrator
- 2. Określić, czy plik jest używany w Perlu na Windows
- 3. Jak mogę sprawdzić, czy mój skrypt Perla działa pod Windows?
- 4. python: jak sprawdzić, czy plik został wykonany jako import, czy główny skrypt?
- 5. Jak ustalić, czy mój proces jest uruchamiany interaktywnie?
- 6. W jaki sposób mój skrypt Perla może ustalić, czy plik Excel jest w formacie XLS czy XLSX?
- 7. Jak sprawdzić, czy plik jest używany przez inny proces - Powershell
- 8. Wykrywanie, czy kod jest uruchamiany jako rozszerzenie Chrome
- 9. W Perlu, w jaki sposób określić, czy podprogram został wywołany jako metoda?
- 10. Czy jEdit może być używany jako IDE?
- 11. jak sprawdzić, czy klucz rekordu jest używany w innych tabelach jako klucz obcy (sql)?
- 12. Jak sprawdzić, czy kod jest uruchamiany z testu nosa?
- 13. Sprawdź, czy plik jest używany z VBS
- 14. Jak sprawdzić w PHP, czy skrypt jest uruchamiany z żądania konsoli lub przeglądarki?
- 15. Jak sprawdzić, czy katalog istnieje w Perlu?
- 16. Jak sprawdzić, czy proces jest uruchamiany przez Menedżera sterowania usługami
- 17. Jaki jest najlepszy moduł do przetwarzania równoległego w Perlu?
- 18. W jaki sposób kopiujesz dowolne dane do schowka jako plik?
- 19. Jak sprawdzić, czy ciąg znaków może być używany jako nazwa zmiennej w PHP?
- 20. Jak załadować plik zewnętrzny i upewnić się, że jest on uruchamiany jako pierwszy w JSFiddle?
- 21. Jak mogę sprawdzić, czy określony plik klucza publicznego jest używany z git?
- 22. Czy istnieje sposób sprawdzenia, czy skrypt jest uruchamiany przez program PowerShell ISE?
- 23. Jak sprawdzić skrypt NAnt, czy właściwość jest ustawiona, czy nie?
- 24. (W jaki sposób) Czy mogę wykonać pojedynczy plik .cmake w systemie Windows?
- 25. Szyny: w jaki sposób sprawdzić, czy coś jest boolean?
- 26. Jak mogę sprawdzić, czy mój kontekst jest nadal ważny?
- 27. w jaki sposób XQUERY jest rzeczywiście używany?
- 28. W jQuery, w jaki sposób mogę dodać coś jako rodzeństwo?
- 29. Jak ustalić, czy kod jest wykonywany jako skrypt lub funkcja?
- 30. Eksportuj klasę jako moduł Node.js w TypeScript
To jest naprawdę pomocne. Dzięki za link. – seth
@ Witam serdecznie. –
Co z 'perl -MMyClass -e '...''? –