2012-03-23 32 views
1

我想調用子程序在Perl一樣:如何使用開關類型參數子程序在Perl

sub temp { 
    ---- some code ----- 
} 
temp(-switchName, value1, --switchName2, value2) 

就像我知道的Getopt ::龍是有命令行開關類型參數。 所以我想知道子程序類型的參數。

+4

您已接受*無*以前的答案。請糾正這個問題。 – Borodin 2012-03-23 08:21:21

+2

你爲什麼需要那個?對不起,如果這是粗魯的,但我問,因爲原因改變了答案。 – Schwern 2012-03-23 08:53:07

+0

截至撰寫本文時,您已將原始問題編輯爲完全不同的問題,現在答案沒有意義。請回復你的問題,並在另一個問題下發布你的新問題。 – 2012-04-03 02:06:29

回答

3

有許多原因之一可能要做到這一點,但你沒有說,所以我不得不猜測一些。

命令行上的開關很有用,因爲命令行程序將參數與參數列表混合在一起,需要一些方法來了解其差異。因此,「以......開頭的東西 - 不是常規論據」的慣例。

command --key value --key2 value2 file1 file2 file3 
command file1 --key value file2 --key2 value2 file3 

你當然可以做一個子程序,在那裏挑選通過其尋找的東西與--開始,這意味着在列表中的下一個參數列表類似的東西是相關聯的價值......但子程序有更好和更簡單的方法來做到這一點。

temp(["file1", "file2", "file3"], { something => 1 }); 

在這種情況下的參數的主列表被傳遞在第一作爲數組參考,並且選擇在第二在哈希引用傳遞。沒有歧義。

sub temp { 
    my($files, $options) = @_; 

    print "Something!\n" if $options->{something}; 

    for my $file (@$files) { 
     ...do something with $file... 
    } 
} 

你甚至可以採取這一步,作爲一個選項傳遞一切。

temp(files => ["file1", "file2", "file3"], something => 1); 

sub temp { 
    my %args = @_; 

    print "Something!\n" if $args{something}; 

    for my $file (@{$args{files}}) { 
     ...do something with $file... 
    } 
} 

這很有用,如果它不是很清楚什麼是選項和什麼是參數。這裏可能有些過分的「帶選項的文件列表」例子。

+0

不應該是'$ options - > {something}'是一個hashref嗎? – dgw 2012-03-23 10:27:22

+0

@dgw是的,謝謝。 – Schwern 2012-03-25 04:17:26

2

如果我理解正確,您可以將您的參數傳遞給散列並使用它來訪問它們。這樣的:

sub temp { 
    my %opts = @_; 

    if ($opts{'-switch1'}) { 
    # ... do something ... 
    } 

    ... 
} 

temp(-switch1 => 1); 
# or 
temp(-switch1, 1); 
+0

Thakx您的代碼幫助我... :) – 2012-03-23 09:42:56

+0

@ user970553,如果代碼有幫助,請檢查旁邊的「接受」按鈕。這表示「感謝」作者,並幫助下一位讀者看到哪個答案是正確的。 – 2012-03-25 13:29:29

相關問題