Perl子例程获取参数而不发送任何参数

时间:2013-03-11 21:47:15

标签: perl

我试图在一些Git源代码中进行一些攻击(如Git的源代码,而不仅仅是由Git管理的一些随机代码)。我正在看的那个位于Perl,我无法理解正在发生的事情。

我对Perl的经验很少(而且几年前);我曾经问过几个有更多经验的朋友,但是他们什么也没找到。

代码的相关位于v1.8.1.5 source code,其中git-svn.perlcmd_fetch函数包含以下行:

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

我最好的解读是,它会调用fetchfetch_all函数(我无法看到它是如何做其他事情的,当然)。

SVN.pm中,我们发现fetch function,它以以下行开头:

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

我认识到收集函数参数,但(最后,我的问题):这些参数在哪里传递

2 个答案:

答案 0 :(得分:4)

使用箭头表示法调用的函数称为方法。方法的第一个参数是调用其方法的对象。因此$self将设置为$gs。其余参数为空,因此为undef

答案 1 :(得分: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_rev获取undef@parents获取空列表。事实证明,这些都是有效的值,因此不会发生任何不幸事件。

如果您想影响$min_rev等人的值,您可以将呼叫站点更改为

$gs->fetch(5, 9)

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