Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 分配';班次';变平均数?_Perl_Variables - Fatal编程技术网

Perl 分配';班次';变平均数?

Perl 分配';班次';变平均数?,perl,variables,Perl,Variables,例如: use strict; my $file = shift; open(IN, $file) || die "Unable to open $file\n"; open(OUT, ">$file.$$") or die $!; my @array = (1, 2, 3); my $value = shift @array; print $value; # will print '1' my$file=shift发生了什么事?您可以阅读有关shift的文档。这很清楚shift接受

例如:

use strict;
my $file = shift;

open(IN, $file) || die "Unable to open $file\n";
open(OUT, ">$file.$$") or die $!;
my @array = (1, 2, 3);
my $value = shift @array;
print $value; # will print '1'

my$file=shift
发生了什么事?

您可以阅读有关
shift
的文档。这很清楚
shift
接受数组并提取第一个元素(实际上是从数组中删除它)。如果不提供任何数组,它将使用
@ARGV
(程序命令行的参数)读取数据。如果您在函数中,它将使用函数的参数

例如:

use strict;
my $file = shift;

open(IN, $file) || die "Unable to open $file\n";
open(OUT, ">$file.$$") or die $!;
my @array = (1, 2, 3);
my $value = shift @array;
print $value; # will print '1'

如果在主程序中使用,它将移动程序参数列表中的第一个值。如果在子例程中使用,它会将第一个值从
@
,,sub的参数列表。有关详细信息,请参见。

shift
使用
@
变量,该变量包含传递给函数的值;如果
shift
在函数外部引用,则
shift
使用
@ARGV
作为传递给脚本本身的值

警告一句:当您将文件名和路径传递给脚本或函数时,将其放在单引号中可能是明智的,尤其是在许多路径包含空格的Windows中。这将告诉Perl您正在向它传递一个标量值,而不是一个值数组。如果要插入名称的一部分,可以使用双引号。例如:

my $path = 'C:\Goat Kids';
func("$path\\goat.txt");
或者,如果要将文件名直接传递给脚本,请从命令行执行以下操作:

perl goat.pl "C:\Goat Kids\goat.txt"

前面的答案描述了
shift
的工作原理。我想谈谈为什么在你自己的程序中使用它是个好主意

默认情况下,Perl是一种按引用传递的语言。如果子例程修改其参数,调用方将看到这些(有时是意外的)更改。使用
shift
将子例程参数指定给私有变量是一种很好的做法。这样,如果您对它进行任何更改,调用者将看不到它。例如,下面的代码输出

1
2
2
第一个子例程修改其参数,调用者看到了更改。第二个子例程修改其参数的私有副本,此更改在调用程序中不可见

use strict;
use warnings;

sub pass_by_ref {
    $_[0] = 2;
}

sub pass_by_value {
    my $x = shift @_;
    $x = 3;
}

my $x = 1;
print $x, "\n";
pass_by_ref($x);
print $x, "\n";
pass_by_value($x);
print $x, "\n";

需要注意的是,该值也将从原始数组中删除。@Wooble:Right。如果不清楚,我会将其添加到响应中。请注意,单引号在Windows命令行中的含义与在Unix shell中的含义不同。如果在Windows命令shell中键入
perl goat.pl'C:\goat Kids\goat.txt'
goat.pl
将看到一个带单引号的参数。我更正了它。谢谢我通常不使用命令行选项,因为我的大多数用户只想双击脚本来运行它。但是,我编写的脚本经常调用以文件名作为参数的函数。欢迎使用StackOverflow。这是一个问答网站,不是新闻组或讨论论坛。它的工作原理是有人提出一个问题,然后人们可以通过在“你的答案”区域键入来发布问题的答案。你的帖子不是对所问问题的回答(“我同意其他答案都很好”),也不应该作为一个答案出现。如果您还没有,请花几分钟阅读和其他一些问题,看看该网站是如何设计的工作。谢谢。对于内置函数的本地文档:perldoc-f shift(至少Ubuntu需要您安装perl doc包才能工作,但在您尝试时会告诉您)。请原谅,这似乎是代码可读性方面最差的约定。@愤世嫉俗的乐观主义者,这只是在您第一次看到它时让您感到困惑,除非你对细节记性很差。我尊重你的意见,但我不同意读这篇文章的人的看法。对于写它的人来说,可能并不可怕…@愤世嫉俗的乐观主义者,我认为人们在Perl方面往往是不公平的。没有参考手册就可以完全理解的语言很少,为什么Perl会有什么不同呢?我不明白人们为什么会这样想。这是一个常见的Perl习语,请阅读Perl的常用用法。问题是您不知道
“shift”
shift()
?的确切副本之间的区别。