my %users = map { $u => 0 } qw/ list of users to watch /; while (1) { my %curr = map { $_ => 1 } split / /, `users`; for (keys %users) { if ( $users{$_} != $curr{$_} ) { $users{$_} = $curr{$_}; printf "%s: $_ has logged %s\n", scalar localtime, ($users{$_} ? "in" : "out"); } } sleep 2; } #### use Tie::Scalar; @ISA = (Tie::StdScalar); sub TIESCALAR { bless { k => $_[1], v => $_[2] }, $_[0] }; sub FETCH { $_[0]{v} } sub STORE { $_[0]{v} != $_[1] and printf "%s: $_[0]{k} logged %s\n", scalar localtime, ($_[1] ? "in" : "out"); $_[0]{v} = $_[1]; } my (@list, %user) = qw/ list of users to watch/; tie $user{$_}, main => $_, undef for @list; while (1) { my %curr = map { $_ => 1 } split / /, `users`; $user{$_} = $curr{$_} for @list; sleep 2; }