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