Как вызвать сценарий perl из другого сценария perl и передать параметр? - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь вызвать скрипт perl из другого скрипта perl и передать ему параметр.

Например:

есть скрипт: main.pl

Я использую командную строку для запуска этого скрипта и задаю значение для параметра "$ directory", затем Я называю другой perl скрипт "sub.pl". Я хочу передать значение «$ directory» параметру «$ path» из sub.pl.

(вкратце, sub.pl имеет параметр $ path, main.pl имеет параметр $ directory Я хочу вызвать sub.pl в main.pl и передать значение $ directory в $ path)

Извините за подробное описание ... В любом случае, какая функция может выполнять эту работу? Спасибо.

Ответы [ 2 ]

1 голос
/ 10 января 2020

Вы не предоставили ни одного образца кода, который вы пробовали - как мы можем узнать, как вы видите код?

Хорошо, ниже я предоставляю образец основного сценария dir_main.pl и дополнительного сценария dir_sub.pl только для демонстрации, как бы я это сделал.

Оба сценария можно запускать с параметрами '--help' (-h) или '--man' (-m), чтобы получить справку и справочную страницу, описывающую использование и полную документацию для сценарии. Скрипт dir_sub.pl имеет дополнительную опцию '--debug' (-d) для печати содержимого options ha sh.

USAGE: perl dir_main.pl --dir c:\Users - Windows

ИСПОЛЬЗОВАНИЕ: dir_main.pl --dir /usr/home - Linux

ПРИМЕЧАНИЕ: в Linux оба сценария должны быть выполнены с помощью следующей команды chmod og+x dir_main.pl dir_sub.pl, прежде чем они смогут запускаться из shell без указания perl (оболочка знает из shebang, что сценарии должны выполняться с perl интерпретатором)

Исходный код: dir_main.pl

#!/usr/bin/perl
#
# DESCRIPTION:
#       Sample code 'dir_main.pl' written for StackOverflow
#
# DATE:
#       Jan 10, 2020
#
# AUTHOR:
#       Polar Bear <https://stackoverflow.com/users/12313309/polar-bear>
#

use strict;
use warnings;

use Getopt::Long qw(GetOptions);
use Pod::Usage;

my %opt;

GetOptions(
    'dir|d=s'   => \$opt{dir},
    'help|h'    => \$opt{help},
    'man|m'     => \$opt{man}
) or pod2usage(2);

pod2usage(1) if $opt{help};
pod2usage(-exitval => 0, -verbose => 2) if $opt{man};

system('perl','.\dir_sub.pl','--path',$opt{dir}) if $opt{dir};

exit 0;

=pod

=head1 NAME

program.pl - short description of the program 

=head1 SYNOPSIS

program.pl [options]

 Options:
    --dir,-d    input directory
    --help,-h   brief help message
    --man,-m    full documentation

=head1 OPTIONS

=over 4

=item B<--dir|-d>

Input directory

=item B<--help|-h>

Print a brief help message and exit

=item B<--man|-m>

Prints the manual page and exit

=back

=head1 DESCRIPTION

B<This program> surve some purpose to produce pre-defined result

=head1 AUTHOR

Polar Bear Jan 10, 2020

=head1 REPORTING BUGS

E-mail L<mailto:bugs@inter.net>

=head1 COPYRIGHT

Copyright information

=head1 SEE ALSO

L<The Perl Home page|http://www.perl.org/>

=cut

Исходный код: dir_sub.pl

#!/usr/bin/perl
#
# DESCRIPTION:
#       Sample code 'dir_sub.pl' written for StackOverflow
#
# DATE:
#       Jan 10, 2020
#
# AUTHOR:
#       Polar Bear <https://stackoverflow.com/users/12313309/polar-bear>
#

use strict;
use warnings;

use feature 'say';

use Getopt::Long qw(GetOptions);
use Pod::Usage;

use Data::Dumper;

my %opt;

GetOptions(
    'path|p=s'  => \$opt{path},
    'help|h'    => \$opt{help},
    'man|m'     => \$opt{man},
    'debug|d'   => \$opt{debug}
) or pod2usage(2);

pod2usage(1) if $opt{help};
pod2usage(-exitval => 0, -verbose => 2) if $opt{man};

print Dumper(\%opt) if $opt{debug};

list($opt{path}) if $opt{path};

sub list {
    my $path = shift;

    opendir my $dh, $path
            or die "ERROR: opendir couldn't open $path";

    map{ say $_ } readdir($dh);

    close $dh;
}

exit 0;

=pod

=head1 NAME

program.pl - short description of the program 

=head1 SYNOPSIS

program.pl [options]

 Options:
    --path,-p   input path to list
    --help,-h   brief help message
    --man,-m    full documentation
    --debug,-d  debug information

=head1 OPTIONS

=over 4

=item B<--path|-p>

Input path to list files

=item B<--help|-h>

Print a brief help message and exit

=item B<--man|-m>

Prints the manual page and exit

=item B<--debug|-d>

Prints the debug information

=back

=head1 DESCRIPTION

B<This program> surve some purpose to produce pre-defined result

=head1 AUTHOR

Polar Bear Jan 10, 2020

=head1 REPORTING BUGS

E-mail L<mailto:bugs@inter.net>

=head1 COPYRIGHT

Copyright information

=head1 SEE ALSO

L<The Perl Home page|http://www.perl.org/>

=cut
0 голосов
/ 10 января 2020

Самый первый вопрос: есть ли у sub.pl механизм для установки $path из командной строки?

Если нет, вы не собираетесь это делать: вы не можете произвольно установить внутренняя переменная до некоторого значения ... которая открыла бы всевозможные угрозы безопасности и опасности для любого фрагмента кода!

Если предположить, что вы можете назвать что-то вроде sub.pl path=/my/path, тогда это легко (но я вас ужасно подозреваю имею в виду первое!)

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