#!/usr/bin/perl -- use strict; use warnings; use Path::Tiny qw/ path /; use Tk; GoTk( @ARGV ); exit( 0 ); sub GoTk { my( $file ) = @_; my %vars = ( pack => [qw/ -expand 1 -fill both /], label => 'the label '.gmtime. ' ', text => 'the text '.gmtime. ' ', LoadSaved( $file ), ); my $mw = tkinit; $mw->Label( -text => $vars{label} )->pack( @{ $vars{pack} } ); $mw->Entry( -text => $vars{text} )->pack( @{ $vars{pack} } ); $mw->protocol('WM_DELETE_WINDOW', sub { eval { SaveLoaded( $file, { %vars, label => Chaild($mw, 'label')->cget(-text), text => Chaild($mw, 'Entry')->cget(-text), }); 1 } or warn $@; Tk::exit; }); $mw->MainLoop; } sub Chaild { my( $w, $class ) = @_; for my $kid ( $w->children ){ return $kid if ref($kid) =~ /\Q$class\E/i; } return; } sub SaveLoaded { my( $file , $vars ) = @_; path( $file )->spew_raw( map { my $k = $_; my $v = $vars->{$k}; $v = sprintf "qw' %s '", join ' ' , @$v if ref $v; "$k=$v\n" } keys %$vars ); } sub LoadSaved { my %stuff; local $@; for my $line ( eval { path(@_)->lines_raw } ){ $line =~ s/[\r\n]+$//; my( $key, $val ) = split /=/, $line, 2; next unless $key and $val; $val = [split ' ', $1] if $val =~ m{qw'(.*)'}; $stuff{$key}=$val; } warn $@ if $@; return %stuff; } __END__