Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,为什么我在使用@u[0]、@u[1]等访问子例程的参数时会收到警告?_Perl_Warnings - Fatal编程技术网

在Perl中,为什么我在使用@u[0]、@u[1]等访问子例程的参数时会收到警告?

在Perl中,为什么我在使用@u[0]、@u[1]等访问子例程的参数时会收到警告?,perl,warnings,Perl,Warnings,下面的一个是代码 sub max { if (@_[0] > @_[1]) { @_[0]; } else { @_[1]; } } print "biggest is ".&max(37,25); 当我运行它时,我得到以下警告: Scalar values @_[0] better written as $_

下面的一个是代码

sub max 
    {
        if (@_[0] > @_[1]) 
        {
            @_[0];
        }
        else
        {
            @_[1];
        }
    }
    print "biggest is ".&max(37,25);
当我运行它时,我得到以下警告:

Scalar values @_[0] better written as $_[0] at file.pl line 3.
Scalar values @_[1] better written as $_[1] at file.pl line 3.
Scalar values @_[0] better written as $_[0] at file.pl line 5.
Scalar values @_[0] better written as $_[0] at file.pl line 9.
biggest is 37.

虽然我得到了正确的输出,但我想知道这条警告背后的原因是什么,因为我认为在子例程中使用
@
$

更合适。问题是,使用数组片而不是标量引用单个数组元素。正如错误所说。数组切片是数组中元素的列表,例如:

my @a = (0 .. 9);
print @a[0,3,4];    # prints 034
相反,当引用单个数组元素时,使用标量前缀
$

print $a[3];        # prints 3
所以当你这么做的时候

@_[0];
Perl告诉您,引用标量值的正确方法不是使用数组片,而是使用标量表示法:

$_[0];

就这些。

试着用这个例子来理解它:

@array = (1,2,3); #array is the name of the array and @ means that it's an array
print $array[1];  
#this will print element at index 1 and you're doing it in scalar context
同样地

@_ = (1,2,3); #_ is the name of the array
print $_[1]; 
#this will print element at index 1 of array _ and again you're doing it in scalar context

您引用的是数组,而不是标量<代码>@[0]表示
($[0])
。但是perl有点聪明,所以它警告您应该返回标量,而不是显式的单个元素列表。这里您应该使用
$\u0]

我建议使用prototype,因为现在可以调用
max(1,2,3)
,结果将是
2
,而不是
3
。所以定义为

sub max ($$) { $_[0] > $_[1]) ? $_[0] : $_[1] }
或者更好,您可以使用未定义的元素数(>=2)。用0或1项来调用它可能没有意义

sub max (@) { 
    return undef if $#_<0; 
    my $s = shift; 
    for(@_) { $s = $_ if $_ > $s } $s 
} 
sub-max(@){
如果$#$s}$s,则返回undef
} 

我的意思是“@”和“$”而不是“@”和“$”。不要在注释字段中添加更正,而是使用问题上的“
编辑”
按钮将新信息添加到问题中。可能重复的问题正是因为Perl告诉您的原因而得到警告。从数组中获取单个元素最好使用$,而不是@。下次当您收到Perl发出的您不理解的警告时,请尝试在代码中添加
use diagnostics
,看看这会告诉您什么。SinanÜnür和DaveCros,非常感谢。嗯,我不想想象,我如何输入特定于函数的参数,因此,
@[0]
$[0]
是不同的@TLP,有什么想法吗?loldop:
$\u0]
与变量
$\u0
无关。您将
[0]
读取为“名为
的数组中的索引0,即
@
”和
$
读取为“作为标量值返回”。@StefanMajewsky我知道
$
@
之间的区别。但是我试着想象在什么情况下,函数
@[0]
并不意味着
$[0]
(只有当你使用
标量
函数或其他类型的操作/操作符,它们具有不同的标量/列表/数组行为)@StefanMajewsky都很好,我在上面的问题上找到了很好的答案
结果是什么“$scalar=@array[n]”?
在对OP questionPerl的评论中,perl有时会出错,尽管
perl-e“使用警告”语法“@[qw“0 1”]”
使用perl原型通常……不是一个特别好的主意。@Dave Sherohman:为什么不呢?它使定义更清晰,并在编译时进行检查Perl5的原型有两个目的。首先,它们是对解析器的提示,用于更改解析器解析子例程及其参数的方式。其次,它们改变了Perl5在执行这些子例程时处理这些子例程参数的方式。一个常见的新手错误是假设它们与其他语言中的子程序签名具有相同的语言用途。这不是真的。”——@Dave Sherohman:通常我不同意你的看法。如果你想让程序员只对两个标量使用max(第一种情况),那么我建议使用原型。第二种情况我同意你的意见(更一般的max(),因为在这种情况下,不能在参数中使用数组调用它。我已经解决了这个问题!谢谢您的评论!我想简单的“return”比“return undef”好