2015-10-05 92 views
4

运行:为什么变量仍然稳居

$t = 3; 
{ 
    tie $t, 'Yep'; 
} # Expect $t to become untied here. 
print $t; 

package Yep; 

sub TIESCALAR { 
    bless {}, 'Yep'; 
} 

sub UNTIE { 
    print "UNTIE\n"; 
} 

sub DESTROY { 
    print "DESTROY\n"; 
} 

输出是:

Can't locate object method "FETCH" via package "Yep" at a.pl line 5. 
DESTROY 

预期输出是:

DESTROY 
3 

我想tie变量$ T只为tie所在范围的持续时间。在领域之外,它的表现必须与领带之前一样。因此,我将tie包装到块中,并且预计在达到块末尾时会调用untie(例如,在块末尾恢复值的'local',但对于绑定变量,我期望行为被恢复(untie $t)) 。请注意0​​尚未超出范围。

+0

[Cross-posted on perl5porters](http://www.nntp.perl.org/group/perl.perl5.porters/2015/10/msg231557.html)。泽夫拉姆的回答是:“这故意不是如何行事。搭售效果永久 变化问题的对象,在这种情况下,标量$ T,只要对象是否 效果持续。它不再是词汇范围 比块内的“$ t = 4”的效果更好。 – ThisSuitIsBlackNot

+0

另外,请注意,在收到答案后,请不要完全改变您的问题。你使现有的答案无效,并使未来的访问者感到困惑,因为一些答案会解决你的新问题,一些答案将解决旧的,完全不同的问题。今后,请提出一个新问题。 – ThisSuitIsBlackNot

+0

我很抱歉,但我不认为它是如此不同。我认为tie/untie以类似的方式工作:new/delete,inc/dec,创建/销毁。所以在文件范围的末尾(当程序结束时),我希望变量解开,并且在TIESCALAR中调用构造对象的DESTROY。因此,而不是隐式文件范围,我创建明确的'领带...'@ThisSuitIsBlackNot –

回答

1

至于完全新问题,

更改变量是不会自动撤消领带魔术。你可以使用untie去除魔法,但如果你只是简单地使用一个新变量,这是最好的。

my $t = 3; 

{ 
    tie my $t, 'Yep'; 
} # Tied variable destroyed here. 

print "$t\n"; # 3. 
+0

'本地'比'我'更好吗? –

+0

你永远不想使用'local'。你只有在你不能使用'my'时才使用它 – ikegami

4

答案:为什么当绑定变量超出范围时UNTIE不会被调用?

因为UNTIE在用户调用内置命令untie时处理。如果在超出范围时调用DESTROY,请处理DESTROY

如果需要的逻辑在两个那么你可以

  1. 呼叫来自

    sub UNTIE { &_destructor; } # Perl 4 style, which passes the current 
    sub DESTROY { &_destructor; } # @_ to the called procedure. 
    
  2. goto共同清理子共同清理子从两个

    ​​
  3. 别名一方向另一方:

    *UNTIE = *DESTROY{CODE}; 
    
+0

#2纯粹比#1差。它比较慢,并且通过搞乱堆栈跟踪使得调试变得更加困难。 – ikegami

4

为什么何时缚住变量解开不是所谓超出范围?

问为什么当变量超出范围UNTIE不叫的是同样的事情,问为什么,每当DESTROY被称为UNTIE不叫。那么,那将是无用的。有用的是调用untie时调用的函数,这就是UNTIE

如果您希望在调用untie时调用通用代码,并且该对象被销毁时,没有任何东西阻止您。当范围中,这些变化是由

my $t = 3; 

{ 
    $t = 4; 
} 

print "$t\n"; # 4, not 3. 

同去时的变化是增加

sub UNTIE { shift->_destructor(@_) } 
sub DESTROY { shift->_destructor(@_) } 
+0

不,我的意思是UNTIE –

+0

@Eugen Konkov,我不明白你的意见。如果有帮助,我会澄清我的答案。 – ikegami

+0

我澄清了我的问题 –

0

的例子我给我一个线索。所以在我的情况下使用本地。

my $t = 3; 

{ 
    tie local $t, 'Yep'; 
} # Tied variable destroyed here. 

print "$t\n"; # 3. 
相关问题