Here's an example module for saved state between script runs. Save it as STATE.pm in one of your Perl library directories...
{
package STATE;
use strict;
use warnings;
use Storable qw( retrieve store );
use constant FILENAME => sprintf '%s.state', $0;
sub import {
no strict 'refs';
my $p = caller;
*{"$p\::STATE"} = (${^STATE}{$p}||={});
}
sub BEGIN {
%{^STATE} = %{ -f FILENAME ? retrieve FILENAME : {} }
}
sub END {
store \%{^STATE} => FILENAME;
}
}
1;
Now you can load that module with use STATE. Once loaded, there will be a global hash called %{^STATE} which all modules have access to. Also, within any packages that call use STATE there will also be a hash called %STATE which acts as an alias for %{${^STATE}{(__PACKAGE__)}}.
So you can write a script like this:
#!/usr/bin/perl
use STATE;
print $STATE{counter}++, "\n";
... and it will retain state between runs, the counter being incremented each time.
It does this in a rather simplistic way, using a state file with the same name as the script, just with ".state" tacked onto the end of the filename.
This is not necessarily how you'd want to do things in a major project (often the permissions of the directory where you keep the script would preclude you from storing the state there!) but serves as a good simple example I think.
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
|