1

我正在尝试对一些 Git 源代码进行一些黑客攻击(如在 Git 的源代码中,而不仅仅是一些由 Git 管理的随机代码)。我正在看的是 Perl,我无法理解发生了什么。

我对 Perl 的经验很少(而且有几年的经验);我向几个有经验的朋友请教了一些建议,但他们一无所获。

相关代码在v1.8.1.5 源代码中,其中git-svn.perl'scmd_fetch函数包括以下行:

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

我对此的最佳解读是它会调用fetchorfetch_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根据需要填充列表。所以$selfgets$gs和get$min_rev并得到空列表。事实证明,这些都是有效值,因此不会发生任何不愉快的事情。$max_revundef@parents

如果您想影响$min_revet al. 的值,您可以将调用站点更改为读取

$gs->fetch(5, 9)

(事实证明它@parents被忽略了,所以我不知道它的合法价值可能是什么)。

于 2013-03-11T22:36:07.613 回答