2011-05-24 202 views
2

我試圖計算如何將$ opt {p}中的值和直接字符串發送到子例程而不是數組。字符串中的Perl哈希對值

use Getopt::Std; 
my $opt_string = 'hdp:j:'; 
getopts("$opt_string", \%opt) or usage(); 

usage() if $opt{h}; 
} 

sub usage() 
{ 
     print STDERR << "EOF"; 
     This program grabs the problem print request and puts them in folder for investigation. 
     usage: $0 [-d] [-p printer] [-j job] -h  : this (help) message 
     -p printer: problem printer 
     -j file : problem print job id 
     -d  : print debugging messages to stderr 

     example: $0 -p PRINTERQ -j 76063 -d 
EOF 
     exit; 

} 

sub find_printer 
{ 
     my $printer = $_[0] ; 
     print "Looking for printer $printer .. \n"; 

} 


find_printer($opt{p}) or die "Unable to find printer"; 

回答

3

子程序總是收到一個陣列 - 即使包含單個參數

+0

啊好的,謝謝。 – AndyM 2011-05-24 09:35:29

1

@_是不是一個真正的陣列(通常是 - 如果你把它的一個引用它暫時變成了現實),它是隻是爲了提供訪問與其他perl語法一致的參數的語法。

1

根據perlvar [http://perldoc.perl.org/perlvar.html]:

在一個子程序陣列@_包含傳遞到子程序的參數。

和perlsub [http://perldoc.perl.org/perlsub.html]:

在顯示了陣列@_傳入的任何參數。因此,如果您使用兩個參數調用函數,那麼這些函數將存儲在$ [0]和$ [1]中。數組@_是一個本地數組,但其元素是實際標量參數的別名。特別是,如果更新元素$ [0],則會更新相應的參數(或者如果它不可更新,則會發生錯誤)。如果參數是調用函數時不存在的數組或哈希元素,則僅在修改了該元素(或如果)或對其進行了引用時才創建該元素。 (某些早期版本的Perl創建了該元素是否已分配給該元素。)分配給整個數組@將刪除該別名,並且不更新任何參數。

@_絕對是一個數組:)

+1

該文件希望你相信,是的......在這個問題的上下文中,它想知道如何在不創建數組的情況下傳遞參數,我認爲值得說出真相,即沒有創建單獨的數組。 – ysth 2011-05-24 17:39:51