Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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
String 使变量引用它自己的字符串内容_String_Perl_Reference - Fatal编程技术网

String 使变量引用它自己的字符串内容

String 使变量引用它自己的字符串内容,string,perl,reference,String,Perl,Reference,我想让一个变量引用它自己的内容,所以我这样做了: $x=\$x; 但这并不像我预期的那样有效,$x成为了对自身的引用,因此$$x与$x相同。我所期望的是$$x成为原始字符串。为什么会这样?如果不在$x中复制字符串,我应该如何正确编写它?因为在某些情况下,$x可能是一个巨大的字符串。将引用指定给值,而不是变量: my $string = 'abcefgh'; $string = \ "$string"; print $$string, "\n"; 你所要求的是不可能的。变量不能同时包含引用和

我想让一个变量引用它自己的内容,所以我这样做了:

$x=\$x;

但这并不像我预期的那样有效,
$x
成为了对自身的引用,因此
$$x
$x
相同。我所期望的是
$$x
成为原始字符串。为什么会这样?如果不在
$x
中复制字符串,我应该如何正确编写它?因为在某些情况下,
$x
可能是一个巨大的字符串。

将引用指定给值,而不是变量:

my $string = 'abcefgh';
$string = \ "$string";

print $$string, "\n";

你所要求的是不可能的。变量不能同时包含引用和字符串。你必须利用两个变量。这就给你留下了两个选择

将引用存储在新变量中

$perl-e'
使用特征qw(例如);
我的$x=“abc”;
我的$y=\$x;
比如说$y;
说$$y;
'
标量(0x232a398)
abc
很好,简单,高效,并且不会混淆变量在什么时候包含什么

这种方法的缺点是,对原始
$x
的引用看不到更改。然而,很难想象这种情况会有什么影响

请注意,新的var甚至可以与旧的var同名。我不建议这样做,因为这会造成不必要的混乱和容易出错

$perl-e'
使用特征qw(例如);
我的$x=“abc”;
我的$x=\$x;
比如说x美元;
比如$$x;
'
标量(0x232a398)
abc
将值存储在新变量中

$perl-e'
使用特征qw(例如);
我的$x=“abc”;
$x=\(我的$container=$x);
比如说x美元;
比如$$x;
'
标量(0x175cbe0)
abc
这种方法的缺点是需要复制字符串。然而,直到5点20分,情况才如此。5.20为字符串引入了一种写时拷贝机制。这意味着上面的代码实际上不会复制5.20+中的字符串;它只会复制一个指针。请注意,在以下示例中,两个标量共享相同的字符串缓冲区(
0x2ac53d0
):

$perl-MDevel::Peek-e'my$x=“abc”;my$y=$x;转储($\ux)为$x,$y;'2>&1 \
|grep-P'^(?:SV | FLAGS | PV)\b'
SV=0x2abcdc8处的PV(0x2a9f0c0)
标志=(POK、IsCOW、pPOK)
PV=0x2ac53d0“abc”\0
SV=0x2abcde0处的PV(0x2a9f150)
标志=(POK、IsCOW、pPOK)
PV=0x2ac53d0“abc”\0

$x=\“$x”
被建议作为
$x=\(我的$container=$x)的较短版本,它强制字符串化,并复制整个字符串,即使在支持COW的Perl版本中也是如此。

但这不就是字符串的副本吗?“abcefgh”和“$string”不是同时存在吗?@soger:那么就从一开始就创建它:
my$string=\'abcdefgh'。现实生活并没有那么简单。@soger:复制字符串有什么错?除了编写一些C代码之外,这是获取变量内容引用而不是变量本身引用的唯一方法。我看不出这是一个问题,除非字符串包含多个千兆字节。您复制该值,但只需要获取对它的引用。看,即使你能做你想做的事情,原始内容也会因为引用计数而消失。只需使用另一个变量作为引用。@Akhland哦,对了。。。我没有想到参考计数…@Akhland,胡说。如果它仍然可以访问,它就不可能消失。如果OP可以做他们试图做的事情(以
$$x
的形式访问原始值),那么如果它的引用计数达到零,那么它将是Perl中的一个主要错误。