Perl: “Variable will not stay shared”

问题复现:

#!/usr/bin/perl

use warnings;
use strict;

sub fun {
    my $var = "hello world";

    doSth();
    sub doSth {
        print "var: $var\n";
    }
}

fun();

报错信息:Variable "$var" will not stay shared at t.pl line 11.

出错原因

perlsub声明是全局的,在fun()中声明的doSth()不是fun()的私有函数

第一次调用fun()时声明doSth(),并且其$var变量是第一次fun()中的'hello world'

如果第二次调用fun(),此时doSth()已经存在,不会再次声明,而此时调用doSth()打印的并不是此刻fun()中的$var,而是第一次fun()中的$var.之后的调用doSth已经和fun无关了,而且sub声明的doSth可以在任何地方使用

使用如下代码测试以上分析


#!/usr/bin/perl

use warnings;
use strict;

sub fun {
    my $var = shift || "hello world";

    print "fun var: $var\n";
    sub doSth {
        print "$var\n";
    }
    doSth();

}
fun();

fun("two");

fun("three");

输出:

Variable "$var" will not stay shared at t.pl line 19.
fun var: hello world
hello world
fun var: two
hello world
fun var: three
hello world

解决方案

#!/usr/bin/perl

use warnings;
use strict;

sub fun {
    my $var = shift || "hello world";
    ## 使用闭包
    my $doSth = sub {
        print "var: $var\n";
    };

    $doSth->();

}
fun();

fun("two");

fun("three");

或者

#!/usr/bin/perl

use warnings;
use strict;

sub fun {
    my $var = shift || "hello world";
    ## 使用符号表的类型团
    no strict "refs";
    *doSth = sub {
        print "$var\n";
    };
    print "fun var: $var\n";
    doSth();

}
fun();

fun("two");

fun("three");

或者

## 通过词法作用域变量控制
{
    my $var;

    sub fun {
        $var = shift || "hello world";
        doSth();
    }

    sub doSth {
        print "$var\n";
    }

}

fun();

fun("two");

fun("three");

解决方案在stackoverflow找到
http://stackoverflow.com/questions/25399728/perl-variable-will-not-stay-shared

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值