2016-08-15 5 views
0

ファイルを開いて編集するサブルーチンを作成しようとしています。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. 
+0

このようなサブルーチンプロトタイプの適用を学んだところを教えてください。 – Borodin

+0

Perlに精通している人は、サブルーチンとレキシカル変数に 'snake_case'を使ってくれてありがとうと思います。グローバルに 'CapitalisedNames'を予約するのが一番安全です。 Perlには固定された条件付きもあるので、単一の文の 'if'ブロックはエイリアンです。 – Borodin

+0

'$ VULN 'に句読点が含まれている可能性がある場合は、正規表現でエスケープする必要があるかもしれません。 – Borodin

答えて

4

Avoid prototypes。 Perlのプロトタイプは、他の言語でのやり方や新しいプログラマーの期待通りの動作をしません。

Prototype mismatch ...は、元の宣言/定義とは異なるプロトタイプでメソッドを定義(または再定義)したことを意味します。この場合。

sub addComment ($$$$); 
sub addComment { ... } 

には2つの異なるプロトタイプがあります(つまり、2番目の宣言にプロトタイプはありません)。修正するには、サブ定義が同じプロトタイプ

sub addComment ($$$$); 
sub addComment ($$$$) { ... } 

を使用作ることができますが、ほとんどの場合、あなたはプロトタイプのないほうが良いでしょう(そして、あなたはどちらか、先行宣言を必要としない)

# sub addComment ($$$$); # don't need this 
sub addComment { ... } 
関連する問題