use strict; use warnings; my $data =<<'END'; x = 10; y = 12; z = 100; END sub parse { my $data_ref = shift; my $rgx = qr/(\w+)\s*=\s*(\d+)\s*;\s*/; my @m = $$data_ref =~ /\G$rgx/gc; return \@m; } while (my @matches = @{parse(\$data)}) { while (my $var = shift @matches) { my $val = shift @matches; print "I got variable ($var) set to value ($val)\n"; } print "Trying next parse...\n"; } #### I got variable (x) set to value (10) I got variable (y) set to value (12) I got variable (z) set to value (100) Trying next parse... #### I got variable (x) set to value (10) Trying next parse... I got variable (y) set to value (12) Trying next parse... I got variable (z) set to value (100) Trying next parse...