Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 为什么pass by ref需要移位而不是@?_Perl - Fatal编程技术网

Perl 为什么pass by ref需要移位而不是@?

Perl 为什么pass by ref需要移位而不是@?,perl,Perl,我有一个关于在Perl中通过引用传递子例程的问题。对于值,如果我使用@uu传递,它将起作用,但对于仅引用的shift则起作用。不知道为什么。我给出了下面的示例代码: 这项工作: #! /usr/bin/perl use strict; use warnings; my $name = 'John'; PassScalarByRef( \$name ); sub PassScalarByRef{ my $got = shift; print "Hello $$got\n";

我有一个关于在Perl中通过引用传递子例程的问题。对于值,如果我使用@uu传递,它将起作用,但对于仅引用的shift则起作用。不知道为什么。我给出了下面的示例代码:

这项工作:

#! /usr/bin/perl

use strict;
use warnings;

my $name = 'John';
PassScalarByRef( \$name );

sub PassScalarByRef{
    my $got = shift;
    print "Hello $$got\n";
}
但不是这个:

#! /usr/bin/perl

use strict;
use warnings;

my $name = 'John';
PassScalarByRef( \$name );

sub PassScalarByRef{
    my $got = @_;
    print "Hello $$got\n";
}

在第二种情况下,分配给
$got
@
提供了一个标量上下文,从而使其计算为其大小(元素数)。你可以说:

my ($got) = @_;

…将
@
的第一个元素指定给
$got
,如您所料。

您正在标量上下文中使用
@
数组
$got
现在包含传递的参数数。您应该尝试使用my($got)=@,它现在在列表上下文中使用数组,这就是您的意思。

使用不同的方法


我的$got=$\u0]

大多数运算符以一致的方式为其操作数提供特定的上下文;例如,
+
给出两个操作数的标量上下文
|
给出其左操作数标量上下文,右操作数给出
|
本身具有的任何上下文

赋值有点不同,因为有两种类型,列表赋值和标量赋值

标量赋值如下所示:

$scalar = ...
lvaluesub() = ...
(左值子类是perl很少使用的特性;内置的
pos
就是一个例子)

只分配了一个值,这些值给出了
=
的右操作数标量上下文

列表分配如下所示:

@array = ...
@arraytoslice[...] = ...
%hash = ...
@hashtoslice{...} = ...
( ... ) = ...
甚至

() = ...
所有这些都需要赋值的值列表,因此请给出正确的操作数列表上下文

当你说:

my $got = @_;
这是一个标量赋值,因此
@
获取标量上下文,从而使其返回其元素数,而不是第一个值

相反,你可以说:

my ($got) = @_;
有些人会始终如一地这样做,即使对于只有一个操作数的子对象也是如此;其他人会

my $param1 = shift;
my $param2 = shift;
对于具有少量操作数的子对象


对于方法来说,对于其余参数,使用shift键和@u的列表赋值来获取对象/类是很常见的。

注意:Perl总是按ref传递。您所做的是为将来遇到这个问题的人传递ref.注释:这个问题与按引用传递或按值传递无关。它与列表分配和标量分配有关,我的文章版本。