#!/usr/bin/perl use warnings; use strict; sub lstrip { my ($s, $a) = @_; my $alen = length($a); if ($alen >= length($s)) { return ""; } return substr($s, $alen); } sub matched { my $s = shift; my %h = (); if ($s =~ /(^\D)/) { $h{prefix} = $1; $s = lstrip($s, $h{prefix}); } if ($s =~ /(^\d+)/) { $h{firstnums} = $1; $s = lstrip($s, $h{firstnums}); } if ($s =~ /(^\.\d+)/) { $h{pointandnums} = $1; $s = lstrip($s, $h{pointandnums}); } if ($s eq "") { return 1; } else { return 0; } } my @b = qw(+12345.777 !1234 +123A1234.11 !12X1234.987); my $i; for $i (@b) { print "$i\t" . matched($i) . "\n"; }