#!/usr/bin/perl use 5.020; use strict; use warnings; use Sereal; use Fcntl ':flock'; my $cachename = 'validator.cache'; my %validator; sub fetch_validator { if ( open my $CACHE, '<', $cachename ) { binmode $CACHE; my $data = <$CACHE>; close $CACHE or die; my $sereal = Sereal::Decoder->new(); if ( $sereal->looks_like_sereal($data) ) { my $VAR1 = $sereal->decode($data); %validator = %{$VAR1}; } else { warn "No SERAL data"; } return %validator; } } sub put_validator { if ( open my $CACHE, '>', $cachename ) { truncate $CACHE, 0; seek $CACHE, 0, 0; flock $CACHE, LOCK_EX; binmode $CACHE; my $sereal = Sereal::Encoder->new(); my $VAR1 = \%validator; my $data = $sereal->encode($VAR1); print $CACHE $data; close $CACHE or die; return %validator; } } use Digest::MD5 qw(md5_hex); for ( 1 .. 1_000 ) { my $d = $_; $validator{ 1000 + $d }{ time + rand $d } = md5_hex(time); put_validator(); fetch_validator(); }