2013-03-11 62 views
1

我試圖在一些Git源代碼中進行一些黑客攻擊(如在Git的源代碼中,而不僅僅是由Git管理的一些隨機代碼片段)。我正在看的是Perl,而且我很難理解正在發生的事情。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

首先,我真的希望你引用的代碼左邊有一個任務。使用條件操作符來控制流程是一種危害人類的罪行。也就是說,你對所發生的事情的直覺是正確的:根據$_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被忽略,所以我不知道它的合法值可能)。

+0

不,沒有任務。如果您想查看,我已直接鏈接到源代碼。而且,盡我所知,Perl旨在讓你犯下危害人類的罪行。 TIMTOWTDI等等。該死的,我想念Python。 – 2013-03-11 22:54:30

4

用箭頭符號調用的函數被稱爲方法。方法的第一個參數是其方法被調用的對象。因此將$self設置爲$gs。其餘的參數是空的,因此undef

+0

從技術上講,兩個標量參數會得到'undef',而數組參數會得到空的列表。 – darch 2013-03-11 22:24:29