代码之家  ›  专栏  ›  技术社区  ›  7beggars_nnnnm

从Perl脚本PowerSet Generator停止的位置运行它

  •  0
  • 7beggars_nnnnm  · 技术社区  · 3 年前

    我正在研究一种中断以下Perl脚本执行的方法,这种方法可以保存交互发生的时间,并且可以从该交互开始运行下一次。 我正在查看脚本内部,试图了解如何提取交互编号并打印到文件中,然后重新插入脚本作为下一次开始运行的初始索引。

    use strict;
    use warnings;
    sub powerset(&@) {
        my $callback = shift;
        my $bitmask = '';
        my $bytes = @_/8;
        {
           my @indices = grep vec($bitmask, $_, 1), 0..$#_;
           $callback->( @_[@indices] );
           ++vec($bitmask, $_, 8) and last for 0 .. $bytes;
           redo if @indices != @_;
        }
    }
     
    powerset { print "[@_]\n" } 1..5;
    my $i = 0;
    

    [1 2 3 4 6 7 8 11 12 13 15 16 17] . 然后,在脚本执行的第二次启动时,我只想对行的各个标记进行迭代 我不想重做已经在第一次运行Perl文件时打印了结果的迭代。

    我的目标是能够开始第一次跑步 file.pl 然后以 out.txt perl file.pl > out.txt ,然后移动 顺序文件 [1 2 3 4 6 7 8 11 12 13 15 16 17] 已经印好了。

    注: 我知道:“要挂起程序,请在程序运行时键入^z(=ctrl-z)1。然后键入BG以在后台发送(已停止)进程。要再次恢复,请键入FG(或FG,以防有严重的后台作业要列出它们)。”但这并不是我所期望的。

    0 回复  |  直到 3 年前
        1
  •  2
  •   Polar Bear    3 年前

    也许您正在寻找的东西可以通过下面的代码片段来演示 checkpoint 方法

    stage data_set

    如果代码在执行过程中被中断,则后续运行将在完成后继续启动。 阶段 数据集 .

    exit 之后 store_checkpoint($data) 在…的结尾 STAGE2 然后再次运行脚本。

    use strict;
    use warnings;
    use feature 'say';
    
    use YAML;
    use Data::Dumper;
    
    my $checkpoint = 'checkpoint.dat';
    my $data;
    
    restore_checkpoint() if -e $checkpoint;
    
    STAGE1:
    $data->{data_set} = [ title => 'scientist', age => 27, address => '123 street, NY 12345 USA' ];
    $data->{next_stage} = 'STAGE2';
    store_checkpoint($data);
    
    STAGE2:
    $data->{data_set} = [ title => 'professor', age => 45, address => '234 street, WA 98230 USA' ];
    $data->{next_stage} = 'STAGE3';
    store_checkpoint($data);
    
    STAGE3:
    $data->{data_set} = [ title => 'doctor', age => 53, address => '345 street, OK 56789 USA' ];
    $data->{next_stage} = 'STAGE4';
    store_checkpoint($data);
    
    STAGE4:
    $data->{data_set} = [ title => 'CEO', age => 38, address => '456 street, MA 54321 USA' ];
    $data->{next_stage} = 'STAGE5';
    store_checkpoint($data);
    
    STAGE5:
    say 'Done';
    
    
    sub store_checkpoint {
        my $data = shift;
        say 'INFO: save_checkpoint ' . $data->{next_stage};
        
        open my $fh, '>', $checkpoint
            or die "Couldn't open $checkpoint";
            
        say $fh Dump($data);
            
        close $fh;
    }
    
    sub restore_checkpoint {
    
        say 'INFO: restore_checkpoint';
        
        open my $fh, '<', $checkpoint
            or die "Couldn't open $checkpoint";
            
        my $yaml = do { local $/; <$fh> };
        
        close $fh;
        
        $data = Load($yaml);
        say Dumper($data);
        
        say 'INFO: continue stage ' . $data->{next_stage};
        
        goto $data->{next_stage};
    }