在Perl中写入数据部分

在Perl中写入数据部分,perl,Perl,在Perl中,从数据部分\uuuuu data\uuuu读取数据非常容易。 以下代码使用先前存在的数据句柄: foreach (<DATA>) { print("- $_"); } __DATA__ 1 2 The End of The End 然而,我还没有找到任何将数据写入该部分的简洁方法。 例如,我尝试了以下方法: use feature say; say STDERR 'Some Error'; say STDOUT 'Some Messag

在Perl中,从数据部分
\uuuuu data\uuuu
读取数据非常容易。 以下代码使用先前存在的
数据
句柄:

foreach (<DATA>) {
    print("- $_");
}

__DATA__
1
2
The End of The End
然而,我还没有找到任何将数据写入该部分的简洁方法。 例如,我尝试了以下方法:

use feature say;

say STDERR 'Some Error';
say STDOUT 'Some Message';
say DATA   'Some Data';

__DATA__
foo bar
打印到
STDOUT
STDERR
的效果与预期一致:

perl write.pl 2> /dev/null 
Some Message
但是打印到
数据
根本不起任何作用:

tail -2 write.pl 
__DATA__
foo bar
我还研究了CPAN中的几个模块,但我总是发现只支持读,而不支持写。
谢谢你的提示和帮助

如果想法是向数据可以输出的内容添加内容,则可以关闭它,然后在引用包含其他文本的变量时重新打开它,如下所示:

#!/usr/bin/perl

use strict;use warnings;

while(<DATA>) {
    print("- $_");
}

close DATA;

my $additional_text = 'test2';
open DATA, '<', \$additional_text;
$additional_text .= "\ntest3";
while(<DATA>) {
    print("- $_");
}

__DATA__
test
#/usr/bin/perl
严格使用;使用警告;
while(){
打印(“-$”);
}
封闭数据;
my$additional_text='test2';

打开数据,您可以使用文本编辑器写入数据部分


其他的都是。将输入和程序状态存储在单独的文件(或数据库)中。

写入数据会更改脚本。这是一个坏主意,因为数据在脚本本身上是开放的,可以读取。这个程序说明了为什么这是一个坏主意

#!/usr/bin/perl

use strict;
use warnings;

seek DATA, 0, 0;
while( <DATA> ){
    print;
}

__DATA__
1
2
3
#/usr/bin/perl
严格使用;
使用警告;
寻找数据,0,0;
而(){
印刷品;
}
__资料__
1.
2.
3.

这样做可能没有充分的理由,但下面是如何做到的:

#!/usr/bin/env perl

use strict;
use warnings;

seek DATA, 0, 2; # go to the end of the source file
my $offset = tell(DATA); # remember where that is

open my $f, '>>', $0 # open source file for appending
    or die $!;       # of course, you could use DATA instead of $f here

seek $f, $offset, 0; # go to the previously recorded position

print $f "This is a test\n"; # put something there

__DATA__

从脚本中修改Perl脚本是一个非常非常糟糕的主意。使用一个单独的数据文件代替。这可能是一个坏主意,但它(也许,直到现在还不能测试它)对于一些花哨的噱头工具来说很方便。我正在寻找一种理智的方法(如果有理智的方法存在的话)。疯狂的方法可能是在自己的脚本上打开一个文件句柄。。。如果这是可能的,您不能“写入”数据文件句柄。您可以“打开”
$0
-并对其进行查找/写入。但这不是一个好主意。现在有一个展示这个被认为是坏主意的CPAN:在这种情况下,我不介意黑魔法!我会尽快检查的。谢谢你的提示。如果它按预期的方式工作,那么一个实际的答案和实现将是简洁的。@BorisDäppen你可能不介意黑魔法,但在你之后必须维护你的软件的人会非常介意它。@BorisDäppen有一天,有人可能会因为你采用这样的解决方案而对你大喊大叫,而有人可能就是你。另一方面在这里“复制并粘贴”代码而不是仅仅链接不是一件好事吗?实际上,删除链接可能是一件更好的事情。据我所知,这在文件中并不持久。也许我对这个问题还不够清楚。但我正在寻找一些持久性的东西。通过运行脚本,我不清楚您所指的并试图用脚本显示的“为什么”到底是什么。你能更详细地解释一下吗?数据文件句柄在整个脚本上是开放的,可以读取。您可以重新打开它进行编写,然后更改整个脚本。这使得它容易受到代码注入的攻击。此解决方案总是附加在文件的末尾。我也在研究如何替换数据。我想有了你的解决方案和暴徒的“黑魔法”,我就能做我想做的事了。谢谢你的回答!
#!/usr/bin/env perl

use strict;
use warnings;

seek DATA, 0, 2; # go to the end of the source file
my $offset = tell(DATA); # remember where that is

open my $f, '>>', $0 # open source file for appending
    or die $!;       # of course, you could use DATA instead of $f here

seek $f, $offset, 0; # go to the previously recorded position

print $f "This is a test\n"; # put something there

__DATA__