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
Perl 当一个变量的值被分配给另一个变量时,数据存储在一个位置,而第二个变量的值为';你没变吗?_Perl - Fatal编程技术网

Perl 当一个变量的值被分配给另一个变量时,数据存储在一个位置,而第二个变量的值为';你没变吗?

Perl 当一个变量的值被分配给另一个变量时,数据存储在一个位置,而第二个变量的值为';你没变吗?,perl,Perl,给出以下Perl代码: sub a{ my $variable = $_[0]; } $variable的内容与$\u0]的内容相同。它在变量的生命周期内不会改变 赋值的解释是否阻止Perl为$\u0]的内容创建两个内存位置?不清楚您的意思,但有两个“容器”$\u0]传递给函数的参数由一个组成my$变量创建另一个变量。赋值不会创建容器/标量/变量 根据评论,您的问题似乎实际上是关于my$variable和/或分配是否被优化。他们不是 >perl -MO=Concise,-exec,a

给出以下Perl代码:

sub a{
my $variable = $_[0];
}
$variable的内容与
$\u0]
的内容相同。它在变量的生命周期内不会改变


赋值的解释是否阻止Perl为
$\u0]
的内容创建两个内存位置?

不清楚您的意思,但有两个“容器”<代码>$\u0]传递给函数的参数由一个组成
my$变量
创建另一个变量。赋值不会创建容器/标量/变量


根据评论,您的问题似乎实际上是关于
my$variable
和/或分配是否被优化。他们不是

>perl -MO=Concise,-exec,a -e"sub a { my $variable = $_[0]; return; }"
main::a:
1  <;> nextstate(main 1 -e:1) v
2  <#> aelemfast[*_] s
3  <0> padsv[$variable:1,2] sRM*/LVINTRO   <-- my $variable
4  <2> sassign vKS/2                       <-- scalar assignment in void context
5  <;> nextstate(main 2 -e:1) v
6  <0> pushmark s
7  <@> return K
8  <1> leavesub[1 ref] K/REFC,1
-e syntax OK
>perl-MO=简明,-exec,a-e“suba{my$variable=$\u0];return;}”
main::a:
下一状态(主1-e:1)v
2 aelemfast[*uUs]s

3 padsv[$variable:1,2]sRM*/LVINTRO不清楚您的意思,但有两个“容器”<代码>$\u0]
传递给函数的参数由一个组成
my$变量
创建另一个变量。赋值不会创建容器/标量/变量


根据评论,您的问题似乎实际上是关于
my$variable
和/或分配是否被优化。他们不是

>perl -MO=Concise,-exec,a -e"sub a { my $variable = $_[0]; return; }"
main::a:
1  <;> nextstate(main 1 -e:1) v
2  <#> aelemfast[*_] s
3  <0> padsv[$variable:1,2] sRM*/LVINTRO   <-- my $variable
4  <2> sassign vKS/2                       <-- scalar assignment in void context
5  <;> nextstate(main 2 -e:1) v
6  <0> pushmark s
7  <@> return K
8  <1> leavesub[1 ref] K/REFC,1
-e syntax OK
>perl-MO=简明,-exec,a-e“suba{my$variable=$\u0];return;}”
main::a:
下一状态(主1-e:1)v
2 aelemfast[*uUs]s

3 padsv[$variable:1,2]sRM*/LVINTRO赋值运算符
=
总是复制值。这意味着如果
$\u0]
包含一个非常大的字符串,那么
$variable
将包含另一个完全分开的非常大的字符串

如果这让您感到困扰,您可以使用参考资料:

my $reference = \$_[0];
# the value can be accessed as $$reference


一,。除非赋值右边的值无论如何都会被丢弃。

赋值运算符
=
总是复制该值。这意味着如果
$\u0]
包含一个非常大的字符串,那么
$variable
将包含另一个完全分开的非常大的字符串

如果这让您感到困扰,您可以使用参考资料:

my $reference = \$_[0];
# the value can be accessed as $$reference


一,。除非赋值右边的值会被丢弃。

我不明白两个容器是什么意思。一个标量怎么可能有两个项目

请注意:
$\u0]
是调用函数中第一个参数的别名。如果第一个参数是变量,并且
$\u0]
发生了更改,则调用代码中变量的值将发生更改

#!/usr/bin/env perl

use strict;
use warnings;

sub a {
  $_[0] = 1;
}

my $var = 0;
a( $var );
print "$var\n";

我不明白你说的两个容器是什么意思。一个标量怎么可能有两个项目

请注意:
$\u0]
是调用函数中第一个参数的别名。如果第一个参数是变量,并且
$\u0]
发生了更改,则调用代码中变量的值将发生更改

#!/usr/bin/env perl

use strict;
use warnings;

sub a {
  $_[0] = 1;
}

my $var = 0;
a( $var );
print "$var\n";

从概念上讲,普通赋值总是对数据进行浅拷贝

所谓“浅层”,我的意思是当
my$foo=\@array
是一个数组的引用时,那么
my$bar=$foo
$bar
转换为对同一数组的不同引用,因此当你
推送$bar,$qux
时,你会像推送$foo,$qux
一样附加到同一数组中,但是如果您执行
$bar=\@另一个数组
,则
$foo
仍指向原始数组

“从概念上讲”,我的意思是你可以这样想。作为一种优化,Perl偶尔会将这两个变量保留在内存的同一部分,直到您尝试修改其中一个变量为止。这被称为“书面复制”。但是,除非你比大多数XS代码更深入地挖掘,否则你永远不会注意到它的发生

但是,在某些情况下,可以有多个变量引用相同的数据。这些通常被称为“别名”。在
foreach
grep
map
块中,
$\uuu
变量(或在
foreach
情况下的另一个词汇变量)是当前正在处理的项的别名:

foreach my $foo ($bar, $baz) {
    # In here, $foo is an alias for $bar, then $baz.
    # When $foo is aliased to $bar, then modifiying $foo
    # also modifies $bar, and vice versa.
}
别名也可以通过分配给glob来创建。下面是一个例子:

our $foo;
my $bar = 19;
*foo = \$bar;        # alias $foo to $bar
$foo++;
$bar++;
print $foo + $bar;   # 42
注意,
$foo
有一个包变量(
our
);全局赋值仅适用于包变量。但是Data::Alias和Devel::LexAlias允许您对词法变量(
my
)执行类似的操作

出现别名的另一种情况是subs中的
@
数组。在这里:

sub quux {
    # In here, $_[0] is an alias for $foo
    # In here, $_[1] is an alias for $bar
}

quux($foo, $bar);

最后,仔细使用绑定变量也可以伪造别名。

从概念上讲,正常赋值总是生成数据的浅拷贝

所谓“浅层”,我的意思是当
my$foo=\@array
是一个数组的引用时,那么
my$bar=$foo
$bar
转换为对同一数组的不同引用,因此当你
推送$bar,$qux
时,你会像推送$foo,$qux一样附加到同一数组中,但是如果您执行
$bar=\@另一个数组
,则
$foo
仍指向原始数组

“从概念上讲”,我的意思是你可以这样想。作为一种优化,Perl偶尔会将这两个变量保留在内存的同一部分,直到您尝试修改其中一个变量为止。这被称为“书面复制”。但是,除非你比大多数XS代码更深入地挖掘,否则你永远不会注意到它的发生

但是,在某些情况下,可以有多个变量引用相同的数据。这些通常被称为“别名”。在
foreach
grep
map
块中,
$\uu
变量(或
块中的另一个词汇变量