1
2
3
4
5
6
7
8
^ # Zeilenanfang
(\D)? # keine Ziffer, wenn vorhanden
(
\d+ # Mehrere Ziffern
(
\.\d+ # gefolgt von Punkt und Ziffern
)? # wenn vorhanden
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#!/usr/bin/perl use strict; use warnings; use 5.024; while (my $id = <DATA>) { if ($id =~ /^(\D)?(\d+(\.\d+)?)/ ) { # neues Format, falls Timestamp aus Time::HiRes my ( $flag, $i ) = ($1, $2); say "$flag|$i" ; } } __DATA__ IDS follow now: +1123311.11 !1A23311 -1A23311-11 -123311.2211 !123311A !123311 __END__
1
2
3
4
5
6
7
8
9
10
(\D)? # ist erstmal gierig, greift das "+" ab, und ist damit erfüllt
(
\d+ # schnappt sich die "123" direkt nach dem "+", ist damit auch erfüllt
(
\.\d+ # Punkt und Ziffern können hier jetzt nicht passen, weil da steht das "A" im Weg
)? # Dank des "A" wird getestet, ob es ohne das optionale .\d+ denn passen würde
# und das tut es; das optionale .\d+ ist "quasi" der Leerstring zwischen "+123" und "A"
)
# Regex Ende ohne Ende-Anker.
# Und ohne Ende-Anker ist der Regex somit erfüllt.
2024-02-06T18:31:15 barneyMit dem Modifier a kann man das wieder einschränken.
Quoteund als Modifier gibt es das dort gar nicht.Match a single character present in the list below [\a]
\a matches the bell character (ASCII 7)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#!/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"; }
1 2 3 4 5
print "12345.777", "\n"; print unpack "d", pack "d", +12345.777; 12345.777 12345.777
2024-02-02T09:45:33 GwenDragonSicher ist das ein netter Trick, um zu prüfen, ob es ein valides float ist.
1
2
3
4
if ($id =~ /^(\D)?(\d+(\.\d+)?)$/ ) {
my ( $flag, $i ) = ($1, $2);
say "$flag|$i" ;
}
2024-02-02T15:40:57 GwenDragonJetzt mach hier nicht auf Nikolaus Wirth ;-)
2024-02-02T07:47:03 rostiJa, aber kaum lesbar für andere später, was das Ganze soll – typisch Perl-Programmierer würden manch andere schimpfen. ;-)Hin- und Rückrechnung