배열 배열을 서브 루틴으로 전달하여 명령을 다른 디렉토리에서 병렬로 실행할 수있는 서브 루틴을 만들려고합니다.배열 배열을 Perl에서 서브 루틴으로 전달
기본적으로 각 첫 번째 색인은 각 명령 - 디렉토리 쌍에 대한 것입니다. 두 번째 색인에는 디렉토리와 명령 자체라는 두 가지 변수가 있습니다. 예를 들어
그러나my @commands;
$commands[0][0] = 'tmp1';#directory
$commands[0][1] = 'echo "ave Maria" > avemaria.txt';#command
, I는 서브 루틴의 데이터를 참조하는 방법을 알아낼 수 I는 모든 가능한 조합을 시도한 "[] {}"I는 다양한 위치에서 생각하면 . https://perldoc.perl.org/perldsc.html에있는 perl 설명서를 읽었지만 여기에 적용되는 방법을 볼 수 없습니다.
#!/usr/bin/env perl
use strict; use warnings; use Cwd;
my $TOP_DIRECTORY = getcwd();
local $SIG{__WARN__} = sub {#kill the program if there are any warnings
my $message = shift;
my $fail_filename = "$TOP_DIRECTORY/$0.FAIL";
open my $fh, '>', $fail_filename or die "Can't write $fail_filename: $!";
printf $fh ("$message @ %s\n", getcwd());
close $fh;
die "$message\n";
};#http://perlmaven.com/how-to-capture-and-save-warnings-in-perl
sub execute {
my $command = shift;
print "Executing Command: $command\n";
if (system($command) != 0) {
my $fail_filename = "$TOP_DIRECTORY/$0.fail";
open my $fh, '>', $fail_filename or die "Can't write $fail_filename: $!";
print $fh "$command failed.\n";
close $fh;
print "$command failed.\n";
die;
}
}
sub run_parallel {
my $command_array_reference = shift;
unless ((ref $command_array_reference) =~ m/ARRAY/) {
print "run_parallel requires an array reference as input.\n";
die;
}
use Parallel::ForkManager;
my $manager = new Parallel::ForkManager(4);
my $START_DIRECTORY = getwd();
foreach my $command (0..scalar @{ $command_array_reference }-1) {
$manager->start and next;
my $dir = @$command_array_reference[$command][0];
chdir $dir or die "Can't chdir to $dir: $!";
execute(@$command_array_reference[$command][1]);
chdir $START_DIRECTORY or die "Can't chdir to $START_DIRECTORY: $!";
$manager->finish;
}
$manager->wait_all_children;#necessary after all lists
}
my @commands;
$commands[0][0] = 'tmp1';#directory
$commands[0][1] = 'echo "ave Maria" > aveMaria.txt';#command
$commands[1][0] = 'tmp2';#directory
$commands[1][1] = 'echo "IN HOC SIGNO VINCES" > xp.txt';#command
run_parallel(\@commands);
이 특정 구성은 오류가 나는 서브 루틴에서 디렉토리 명령 쌍을 읽을 수있는 방법을
[email protected]:~/Scripts$ perl parallelForkManager_dir.pl
syntax error at parallelForkManager_dir.pl line 38, near "]["
Global symbol "$dir" requires explicit package name at parallelForkManager_dir.pl line 39.
Global symbol "$dir" requires explicit package name at parallelForkManager_dir.pl line 39.
syntax error at parallelForkManager_dir.pl line 40, near "]["
Execution of parallelForkManager_dir.pl aborted due to compilation errors.
을 생산?
당신은 여러 다른 튜토리얼을 배우는 것처럼 보입니다. 그 중 하나는 Gabor의 PerlMaven입니다. 훌륭합니다. 하지만 지금은 스타일이 전략을 포기하고 코드에 많은 문제가 있습니다. 원하는 경우 [codereview]의 Perl 태그에 자유롭게 게시 할 수 있습니다.se]와 누군가가 한 번 살펴보고 코드 스타일의 조언을 제공하고 전략에 대해서도 알려줄 것입니다. 또한 오류 메시지를 읽어야합니다. 정확한 것은 프로그래밍의 큰 부분이며 일반적으로 오류가있는 경우 메시지가 유용합니다. :) – simbabque
나는 ** simbabque **가 말한 것을지지합니다. 저는 여러분이 * Working * 코드를 [Code Review] (https://codereview.stackexchange.com/)에 게시하고 우리가 그것을 비평하도록함으로써 많은 것을 배울 것이라고 생각합니다. 저는 종종 OP 자신의 답을 OP의 코드 리뷰와 결합하지만, 이것은 주제를 벗어났습니다. 리뷰를 직접 물어 보면 훨씬 낫습니다. – Borodin
@Borodin 거기 가서 : https://codereview.stackexchange.com/q/182010/23233 – simbabque