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脚本。这就是在web应用程序中维护状态的方式。如果有不同的调用者调用同一个程序,每个调用者将维护自己的计数器

  • 您可以向/从持久性存储(例如文件)写入和读取值。如果有多个不同的调用者调用Perl程序,这将有助于调用总数,但如果可能同时尝试多个调用,则必须注意打开存储以进行写入,这样,只有一个调用可以同时打开存储;如果要使用文件,请参阅


  • 一旦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”也会做同样的事情。这就是我要说的。