ファイルを開いて編集するサブルーチンを作成しようとしています。Perlのサブルーチンへのパラメータの受け渡し
サブルーチンを単独のPerlスクリプトとして実行することができましたが、サブルーチンの形式ではパラメータを正しく渡すことができません。
私はVB.NetとObjective-Cのバックグラウンドから来ていますが、サブルーチンや関数のプロトタイプがあります。
$FileName
は、スクリプトの実行時に$ARGV[0]
に割り当てられます。
ここに私の関数呼び出しです:
addComment("v-66721", "Open", "!!!FINDING!!! deployment.config does not exist.", $FileName);
ここでは私の宣言です:
sub addComment($$$$);
そして、ここではサブルーチンです:
sub addComment {
my $VULN = $_[0];
my $Result = $_[1];
my $Comment = $_[2];
my $FileName = $_[3];
# Copy the checklist to a new file name.
my $outputFile = $FileName;
$outputFile =~ s/\.ckl/_commented\.ckl/;
copy($FileName, $outputFile);
# Create a temporary file to edit.
my $tempFile = $FileName;
$tempFile =~ s/\.ckl/\.ckl_temp/;
open(OLD, "<$outputFile") or die "Can't open $outputFile: $!";
open(NEW, ">$tempFile") or die "Can't open $tempFile: $!";
my $foundVULN = 0;
while (<OLD>) {
if ($foundVULN == 0 && $_ =~ /$VULN/) {
$foundVULN = 1;
}
if ($foundVULN == 1 && $_ =~ /Not_Reviewed/) {
s/Not_Reviewed/$Result/;
}
if ($foundVULN == 1 && $_ =~ /COMMENTS/) {
s/<COMMENTS>/<COMMENTS>$Comment/;
$foundVULN = 0;
}
print NEW $_;
}
close(OLD);
close(NEW);
# Replace the output file contents with what we did in our temp file.
rename($tempFile, $outputFile) or die "Can't rename $tempFile to $outputFile: $!";
return;
}
私は
my $VULN = shift
を使用して試してみました
my $Result = shift
my $Comment = shift
my $FileName = shift
しかし、それは動作するようには思えません。
私はプロトタイプを使用すべきではないことを読んだことがありますが、そうしてもいなくても動作しないようです。
私は取得していますエラーメッセージは次のとおりです。
Prototype mismatch: sub main::addComment ($$$$) vs none at ./Jre8_manual.pl line 614.
このようなサブルーチンプロトタイプの適用を学んだところを教えてください。 – Borodin
Perlに精通している人は、サブルーチンとレキシカル変数に 'snake_case'を使ってくれてありがとうと思います。グローバルに 'CapitalisedNames'を予約するのが一番安全です。 Perlには固定された条件付きもあるので、単一の文の 'if'ブロックはエイリアンです。 – Borodin
'$ VULN 'に句読点が含まれている可能性がある場合は、正規表現でエスケープする必要があるかもしれません。 – Borodin