2011-05-24 90 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