use 5.010; use strict; use warnings; sub make_counter { my $end = shift; return sub { my $aktion = shift; state $wert = 0; state $gestartet = 1; defined $aktion and $gestartet = $aktion; my $name = "Z$end"; if ($wert >= $end) { say "$name: Wert = $wert (beendet)"; } elsif ($gestartet) { $wert++; say "$name: Wert = $wert"; } else { say "$name: Wert = $wert (angehalten)"; } } } my $funktion1 = make_counter(3); my $funktion2 = make_counter(2); $funktion1->(); # Z3: Wert = 1 $funktion1->(); # Z3: Wert = 2 $funktion2->(); # Z2: Wert = 1 $funktion1->(0); # Z3: Wert = 2 (angehalten) $funktion2->(); # Z2: Wert = 2 $funktion1->(); # Z3: Wert = 2 (angehalten) $funktion1->(1); # Z3: Wert = 3 $funktion2->(1); # Z2: Wert = 2 (beendet) $funktion1->(); # Z3: Wert = 3 (beendet) $funktion1->(0); # Z3: Wert = 3 (beendet)