首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当用perl在行尾写"if“时,它的作用范围是什么?

当用perl在行尾写"if“时,它的作用范围是什么?
EN

Stack Overflow用户
提问于 2013-02-23 20:38:32
回答 3查看 166关注 0票数 4

这个问题实际上来自于使用线程。我们知道,在perl线程中,我们有一个名为lock的函数,根据cpan http://perldoc.perl.org/threads/shared.html:lock在变量上放置一个顾问锁,直到锁超出作用域为止。好吧,如果我们写这样的东西呢:

代码语言:javascript
复制
1 sub foo{
2   lock($obj) if threads::shared::is_shared($obj); #equivalent to if(threads::shared::is_shared($obj)) {lock($obj);}  ?
3   ... rest of the code
4   ... more code
5 }

所以锁的范围是从第2行到第4行,还是仅仅是第2行?如果" if“语句添加了一个块,那么锁($obj)可能只是第2行,请参见我的#注释

这个问题其实是有答案的,但我想补充一些发现:

我发现不管你怎么写

代码语言:javascript
复制
lock($ojb) if threads::shared::is_shared($obj);

代码语言:javascript
复制
if (threads::shared::is_shared($obj)) {
   lock($ojb);
}

锁的作用域是相同的-整个foo()子例程。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-23 20:45:10

if语句修饰符不会在其应用的语句周围放置隐式块。因此,锁的作用域(如果应用了的话)就是其余的子例程。

票数 7
EN

Stack Overflow用户

发布于 2013-02-23 21:12:33

根据实验结果,我发现无论你怎么写:

代码语言:javascript
复制
lock($ojb) if threads::shared::is_shared($obj);

代码语言:javascript
复制
if (threads::shared::is_shared($obj)) {
   lock($ojb);
}

锁的作用域是相同的-整个foo()子例程。

票数 0
EN

Stack Overflow用户

发布于 2013-02-23 20:41:47

来自您在问题中链接的文档

代码语言:javascript
复制
  my $var :shared;
  {
      lock($var);
      # $var is locked from here to the end of the block
      ...
  }
  # $var is now unlocked

所以锁一直持续到街区的尽头。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15045402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档