gpt4 book ai didi

perl - 延迟 Perl 中范围更改的代码

转载 作者:行者123 更新时间:2023-12-04 16:57:09 25 4
gpt4 key购买 nike

我经常发现能够安排代码在离开当前范围时执行很有用。在我之前在 TCL 的生活中,一位 friend 创建了一个我们称为 defer 的函数。

它启用了如下代码:
设置 fp [打开“x”]
defer("关闭 $fp");

在当前范围退出时调用它。主要的好处是无论我如何/在哪里离开范围,它总是被调用。

所以我在 Perl 中实现了类似的东西,但似乎有更简单的方法。欢迎评论批评。

我在 Perl 中的做法:

  • 创建一个全局绑定(bind)变量,其中包含要执行的子数组。
  • 每当我想安排在退出时调用 fn 时,我都会使用 local 来更改数组。
    当我离开当前范围时,Perl 将全局更改为以前的值
    因为全局是绑定(bind)的,所以我知道何时发生此值更改并且可以调用列表中的 subs。

  • 实际代码如下。

    有一个更好的方法吗?似乎这将是一个普遍需要的能力。
    use strict;

    package tiescalar;

    sub TIESCALAR {
    my $class = shift;

    my $self = {};
    bless $self, $class;
    return $self;
    }

    sub FETCH {
    my $self = shift;
    return $self->{VAL};
    }

    sub STORE {
    my $self = shift;
    my $value = shift;

    if (defined($self->{VAL}) && defined($value)) {
    foreach my $s (@{$self->{VAL}}) { &$s; }
    }
    $self->{VAL} = $value;
    }

    1;

    package main;

    our $h;
    tie($h, 'tiescalar');
    $h = [];
    printf "1\n";
    printf "2\n";

    sub main {
    printf "3\n";
    local $h = [sub{printf "9\n"}];
    push(@$h, sub {printf "10\n";});
    printf "4\n";
    {
    local $h = [sub {printf "8\n"; }];
    mysub();
    printf "7\n";
    return;
    }
    }

    sub mysub {
    local $h = [sub {printf "6\n"; }];
    print "5\n";
    }

    main();

    printf "11\n";

    最佳答案

    好吧,如果您使用词法文件句柄(与旧样式的裸字文件句柄相反),您的特定情况已经得到处理。对于其他情况,您始终可以使用对象的 DESTROY 方法,该方法保证在超出范围时会转到零引用:

    #!/usr/bin/perl

    use strict;
    use warnings;

    for my $i (1 .. 5) {
    my $defer = Defer::Sub->new(sub { print "end\n" });
    print "start\n$i\n";
    }

    package Defer::Sub;

    use Carp;

    sub new {
    my $class = shift;
    croak "$class requires a function to call\n" unless @_;
    my $self = {
    func => shift,
    };
    return bless $self, $class;
    }

    sub DESTROY {
    my $self = shift;
    $self->{func}();
    }

    ETA:我更喜欢 brian 的名字,Scope::OnExit 是一个更具描述性的名字。

    关于perl - 延迟 Perl 中范围更改的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/670179/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com