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