Perl 如何在程序执行期间保持标量值?
代码示例Perl 如何在程序执行期间保持标量值?,perl,Perl,代码示例var\u inc1.pl: #!/usr/bin/perl -w my $x = 0; $x++; print "value : ".$x."\n"; 输出: 第一次:perl var\u inc1.pl value : 1 value : 1 value : 1 value : 2 value : 3 第二次:perl var\u inc1.pl value : 1 value : 1 value : 1 value : 2 value : 3 但我希望
var\u inc1.pl
:
#!/usr/bin/perl -w
my $x = 0;
$x++;
print "value : ".$x."\n";
输出:
- 第一次:
perl var\u inc1.pl
value : 1
value : 1
value : 1
value : 2
value : 3
- 第二次:
perl var\u inc1.pl
value : 1
value : 1
value : 1
value : 2
value : 3
- 第一次执行:
perl var\u inc1.pl
value : 1
value : 1
value : 1
value : 2
value : 3
- 第二次执行:
perl var\u inc1.pl
value : 1
value : 1
value : 1
value : 2
value : 3
- 第三次执行:
perl var\u inc1.pl
value : 1
value : 1
value : 1
value : 2
value : 3
…以此类推,其中标量值在每次程序执行时递增。问题是在程序调用之间记住一个值 我想到了两种技巧:
一旦Perl程序结束,RAM中的所有内容都会消失。如果希望在程序运行之间保留一个值,则需要某种形式的持久存储。您需要哪种类型的存储取决于您对环境的约束以及您需要哪种形式的持久性(如果不同的用户看到相同的值并能够更改它,它应该使用多长时间,等等) 在Perl 5中获得持久性的最简单(但不是最佳)方法是使用函数创建/打开与哈希关联的DBM文件:
#!/usr/bin/perl
use strict;
use warnings;
dbmopen my %storage, "/tmp/foo.db", 0666 #anyone can write to it
or die "could not open /tmp/foo.db: $!";
my $x = ++$storage{x};
print "$x\n";
通常,dbmopen
已被替换为,这是将代码与变量关联起来的一种更通用的方法。对于上述代码,更现代的方法是:
#!/usr/bin/perl
use strict;
use warnings;
use DB_File;
tie my %storage, "DB_File", "/tmp/bar.db"
or die "could not open /tmp/bar.db: $!";
my $x = ++$storage{x};
print "$x\n";
有时您不想依赖外部资源,在这种情况下,您可以编写一个自修改脚本:
#!/usr/bin/perl
use strict;
use warnings;
my $pos = tell DATA;
my $x = <DATA>;
$x++;
open DATA, "+<", $0
or die "could not open $0 in read/write mode: $!";
seek DATA, $pos, 0
or die "could not seek to $pos in $0";
print DATA "$x\n"; #save the current value
print "$x\n";
__DATA__
1
您可以查看哪个可以将数据库绑定到变量。您可以像使用常规Perl标量散列或数组一样使用它,但它会使用平面文件数据库自动存储和检索值。编辑:标量显然不包括在内
下面是一个使用哈希来模拟示例的示例
#!/usr/bin/env perl
use strict;
use warnings;
use DBM::Deep;
my %x;
tie %x, 'DBM::Deep', 'test.db';
$x{'x'}++;
print "value : ". $x{'x'} ."\n";
+对于基于文件的存储,1可能是一个易于使用的选项。@Mike:比单个数字容易吗?:)@jrockway:是的,但是一个计数器在对其脚本的调用之间保持不变。我认为可存储可能是一个合理的选择,因为可存储包为包含标量、数组、哈希或REF对象的Perl数据结构带来了持久性。尽管其他一些建议的解决方案可能更合适,例如
tie
。可存储是一个特别糟糕的选择吗?关于Perl,我还有很多需要学习的地方……Storable将数据结构转换为字符串,然后放入文件中,如YAML或JSON序列化程序。当你谈论数字时,“打印$x”也会做同样的事情。这就是我要说的。