Perl 在Windows上实时编辑当前脚本

Perl 在Windows上实时编辑当前脚本,perl,Perl,我想在Windows上实时编辑当前脚本的源代码 下面的脚本在OSX上编辑自己,将每行填充到_DATA________________________________ use strict; use warnings; use open IO => ':raw'; # Convert every line of source file to 64 characters long { local @ARGV = $0; local $^I = '.bak'; w

我想在Windows上实时编辑当前脚本的源代码

下面的脚本在OSX上编辑自己,将每行填充到_DATA________________________________

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

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

无法删除或重命名打开的文件,除非该文件是使用允许此操作的标志打开的(
文件共享\u删除
)。Perl在打开文件时不使用该标志。当您到达
时,它尝试将
$0
重命名为
$0.bak
,但失败了,因为Perl仍将文件作为
数据打开。添加
close(数据)超出了该错误范围(并导致错误处理行尾)。

听起来像是windows文件权限问题。。。该脚本是一个“正在使用的文件”,因此不能由其他内容编辑。。。除非草莓Perl有“以读/写模式运行脚本”的标志,否则添加
关闭数据修复了该问题。但是没有错误处理行尾,因为我希望
length
报告
:raw
而不是
:crlf
值。在我使用的
(?=\R |$)
脚本的早期版本中,在CR和LF之间放置空格和
会产生垃圾,但在调试另一个bug时简化了正则表达式。如果我重现你所说的内容,我将进行一些测试并编辑我的问题,我怀疑我现在会这样做。
键入file.pl
是我注意到问题的方式。最终我能够将windows笔记本电脑从壁橱中取出并确认。修正了使用原始正则表达式的问题。
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
Can't do inplace edit on selfedit.pl: File exists at selfedit.pl line 10.