1

いくつかのGitソースコードでハッキングを試みています(Gitが管理するランダムなコードだけでなく、Gitのソースコードのように)。私が見ているのはPerlで、何が起こっているのか理解するのに苦労しています。

私はPerlの経験がほとんどありません(そしてその数年前です)。経験豊富な数人の友人にアドバイスを求めましたが、何も見つかりませんでした。

関連するコードはv1.8.1.5ソースコードにあり、git-svn.perlcmd_fetch関数には次の行が含まれています。

$_fetch_all ? $gs->fetch_all : $gs->fetch;

これを最もよく読んでいるのは、fetchまたはfetch_all関数のいずれかを呼び出すことです(確かに、他のことをどのように実行できるかはわかりません)。

SVN.pmは、次の行で始まるfetch関数があります。

my ($self, $min_rev, $max_rev, @parents) = @_;

私は関数の引数を収集することを認識していますが、(そして最後に私の質問):これらの引数はどこに渡されますか?

4

2 に答える 2

4

アロー表記で呼び出される関数はメソッドとして呼び出されます。メソッドの最初の引数は、メソッドが呼び出されたオブジェクトです。$selfに設定され$gsます。残りの引数は空であるため、undef.

于 2013-03-11T21:54:10.827 に答える
2

まず、引用したコードの左側に割り当てがあることを心から願っています。制御フローに条件演算子を使用することは、人道に対する罪です。とは言うものの、何が起こるかについてのあなたの直感は正しいです:、の値に応じて、$_fetch_allまたは$gs->fetch$gs->fetch_all呼び出されます。さて、議論の質問に移りましょう。

Perlメソッド呼び出しは、引数のリストの前に呼び出し元を追加することによって引数を渡します。

$gs->fetch

その結果、引数($gs)はとしてメソッドに渡され@_ます。引数の割り当て行

my ($self, $min_rev, $max_rev, @parents) = @_;

次にリスト割り当て

my ($self, $min_rev, $max_rev, @parents) = ($gs);

リスト割り当ては、左側の配列またはハッシュがすべての引数を食い尽くすか、割り当て先のリストが使い果たされるまで、対応する要素を割り当て、必要に応じてリストを埋めundefます。したがって、を$self取得し、を取得して、空のリストを取得します。これらはすべて有効な値であることが判明したため、不利なことは何も起こりません。$gs$min_rev$max_revundef@parents

$min_revet al。の値に影響を与えたい場合は、呼び出しサイトを変更して次のようにします。

$gs->fetch(5, 9)

(無視されていることが判明した@parentsため、その正当な値が何であるかはわかりません)。

于 2013-03-11T22:36:07.613 に答える