Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 在perl中获取参数函数数组_Arrays_Perl_Function_Parameters - Fatal编程技术网

Arrays 在perl中获取参数函数数组

Arrays 在perl中获取参数函数数组,arrays,perl,function,parameters,Arrays,Perl,Function,Parameters,我想得到我在函数中发送的数组,但它似乎是空的。 我调用send_file() send_file($addr, @curfile); sub send_file($$) { my $addr = $_[0]; my @elem = @_; ... } 这就是我找回情妇的方法 send_file($addr, @curfile); sub send_file($$) { my $addr = $_[0]; my @elem = @_; ...

我想得到我在函数中发送的数组,但它似乎是空的。 我调用
send_file()

send_file($addr, @curfile);
sub send_file($$)
{
    my $addr = $_[0];
    my @elem = @_;
    ...
}
这就是我找回情妇的方法

send_file($addr, @curfile);
sub send_file($$)
{
    my $addr = $_[0];
    my @elem = @_;
    ...
}

为什么
my@elem
是空的?如何在不丢失所有内容的情况下取回阵列?

不要使用原型。它们的目的是更改您不需要的源解析

sub send_file
{
    my $addr = shift;
    my @elem = @_;
    ...
}

send_file($addr, @curfile);

不要使用原型。它们的目的是更改您不需要的源解析

sub send_file
{
    my $addr = shift;
    my @elem = @_;
    ...
}

send_file($addr, @curfile);

您应该改为通过引用传递数组:

#!/usr/bin/perl

use strict;
use warnings;

my $test_scalar = 10;
my @test_array  = qw(this is a test);

sub test($\@)
{
    my ($scalar, $array) = @_;

    print "SCALAR = $scalar\n";
    print "ARRAY  = @$array\n";
}

test($test_scalar, @test_array);

system 'pause';
输出:

SCALAR = 10
ARRAY  = this is a test
Press any key to continue . . .

编辑: 如果您希望在不通过引用传递的情况下执行相同的操作,请将$$更改为$@并使用shift,这样第一个参数就不会包含在数组中。通过引用传递数组是更好的编码实践,不过。这只是为了向您展示如何在不通过引用传递的情况下完成:

#!/usr/bin/perl

use strict;
use warnings;

my $test_scalar = 10;
my @test_array  = qw(this is a test);

sub test($@)
{
    my ($scalar, @array) = @_;

    print "SCALAR = $scalar\n";
    print "ARRAY  = @array\n";
}

test($test_scalar, @test_array);

system 'pause';
这将得到相同的输出


如果确实不需要$@的话,您也可以完全去掉它。

您应该通过引用传递数组:

#!/usr/bin/perl

use strict;
use warnings;

my $test_scalar = 10;
my @test_array  = qw(this is a test);

sub test($\@)
{
    my ($scalar, $array) = @_;

    print "SCALAR = $scalar\n";
    print "ARRAY  = @$array\n";
}

test($test_scalar, @test_array);

system 'pause';
输出:

SCALAR = 10
ARRAY  = this is a test
Press any key to continue . . .

编辑: 如果您希望在不通过引用传递的情况下执行相同的操作,请将$$更改为$@并使用shift,这样第一个参数就不会包含在数组中。通过引用传递数组是更好的编码实践,不过。这只是为了向您展示如何在不通过引用传递的情况下完成:

#!/usr/bin/perl

use strict;
use warnings;

my $test_scalar = 10;
my @test_array  = qw(this is a test);

sub test($@)
{
    my ($scalar, @array) = @_;

    print "SCALAR = $scalar\n";
    print "ARRAY  = @array\n";
}

test($test_scalar, @test_array);

system 'pause';
这将得到相同的输出

如果您愿意,也可以将$@完全去掉,因为它确实是不必要的

为什么我的@elem是空的

你的
@elem
不是空的,它正好有两个元素。第一个是
$addr
的值,第二个是
@curfile
数组中元素的大小/数量。这是由于
$
定义需要两个标量,因此
scalar@curfile
作为第二个参数传递

我怎样才能在不失去一切的情况下找回阵列

由于您没有使用原型优势,所以只需省略原型部分

sub send_file {
    my ($addr, @elem) = @_;
    ...
}
为什么我的@elem是空的

你的
@elem
不是空的,它正好有两个元素。第一个是
$addr
的值,第二个是
@curfile
数组中元素的大小/数量。这是由于
$
定义需要两个标量,因此
scalar@curfile
作为第二个参数传递

我怎样才能在不失去一切的情况下找回阵列

由于您没有使用原型优势,所以只需省略原型部分

sub send_file {
    my ($addr, @elem) = @_;
    ...
}

尝试使用数组的引用作为参数
send\u file($addr,\@curfile)-->
my@elem=@{$\u1]
};尝试使用数组的引用作为参数
send\u file($addr,\@curfile)-->
my@elem=@{$\u1]
}@我的例子并不准确。试一试,数组引用只是一个标量,如果在函数原型中使用“$”声明数组引用,则子例程将正确处理该数组引用。无论在原型中使用“$”还是“\@”,两者的作用都是一样的。如果对使用这两种方法传入的数组引用使用
ref()
函数,则在这两种情况下都将返回“array”。无论哪种方式,它都会将输入识别为数组引用。@mpapec:如果您不相信我的话,请运行我的代码并查看其行为是否相同:)我指的是第二个示例。第一个在功能上是正确的。哦,我明白了,我的意思是说
$scalar=shift
,而不是
$scalar=$\u0]
,这样在填充数组之前,标量就会从“@\uu0”中取出。很好,我刚刚看到了第一个的所有格式更改,并假设它就是您所说的那个。@mpapec:我的示例并不不准确。试一试,数组引用只是一个标量,如果在函数原型中使用“$”声明数组引用,则子例程将正确处理该数组引用。无论在原型中使用“$”还是“\@”,两者的作用都是一样的。如果对使用这两种方法传入的数组引用使用
ref()
函数,则在这两种情况下都将返回“array”。无论哪种方式,它都会将输入识别为数组引用。@mpapec:如果您不相信我的话,请运行我的代码并查看其行为是否相同:)我指的是第二个示例。第一个在功能上是正确的。哦,我明白了,我的意思是说
$scalar=shift
,而不是
$scalar=$\u0]
,这样在填充数组之前,标量就会从“@\uu0”中取出。很好,我刚刚看到了第一个的所有格式更改,并假设它就是你所说的那个。