在Windows上实时编辑当前脚本

时间:2014-09-24 20:47:25

标签: perl

我想在Windows上直播编辑当前脚本的源代码。

以下脚本在OSX上自行编辑,以填充每行直到__DATA__部分为64个字符。

use strict;
use warnings;

use open IO => ':raw';

# Convert every line of source file to 64 characters long
{
    local @ARGV = $0;
    local $^I   = '.bak';
    while (<>) {
        if ( 1 .. /^__DATA__/ ) {
            s{(\h*#*)(?=\R|\z)}{
                (' ' x (63 - length($_) + length($1))) . '#'
            }e;
        }
        print;
    }
    unlink "$0$^I";    # Delete backup
}

__DATA__
Hello World

在darwin上运行一次后的源代码:

use strict;                                                   #
use warnings;                                                 #
                                                              #
use open IO => ':raw';                                        #
                                                              #
# Convert every line of source file to 64 characters long     #
{                                                             #
    local @ARGV = $0;                                         #
    local $^I   = '.bak';                                     #
    while (<>) {                                              #
        if ( 1 .. /^__DATA__/ ) {                             #
            s{(\h*#*)(?=\R|\z)}{                              #
                (' ' x (63 - length($_) + length($1))) . '#'  #
            }e;                                               #
        }                                                     #
        print;                                                #
    }                                                         #
    unlink "$0$^I";    # Delete backup                        #
}                                                             #
                                                              #
__DATA__                                                      #
Hello World

然而,当在Strawberry Perl 5.18.2中运行时,我收到以下错误:

Can't do inplace edit on selfedit.pl: File exists at selfedit.pl line 10.

这只是一个概念验证,但有没有办法在Windows上实时编辑当前脚本的源代码?使用$INPLACE_EDIT

1 个答案:

答案 0 :(得分:3)

在Windows上,除非使用允许此标记(FILE_SHARE_DELETE)的标志打开,否则无法删除或重命名已打开的文件。 Perl在打开文件时不使用该标志。当您到达<>时,它会尝试将$0重命名为$0.bak,但它会失败,因为Perl仍将文件打开为DATA。添加close(DATA);超出了该错误(并使您对行结尾处理不当)。