2017-08-30 2 views
1

Ich habe Zeichenfolge, die sowohl Wort, Hexadezimalzahl und Ziffer enthalten, ich möchte die Zahl in der Zeichenfolge übereinstimmen, aber wenn die Hexadezimalzahl enthalten ist, wird es mit meiner Ziffer aus.Übereinstimmende nth Vorkommensnummer in einer Zeichenfolge, die Hexadezimalnummer enthalten

my $string = " aabb is = 35"; #where aabb is hex number 
my $string1 = " abc0 is = 75" ; #where abc0 is hex number 
my (@val1) = $string =~ /(\d+)/g; 
print "$val1[0]\n"; 
@val1 = $string1 =~ /(\d+)/g; 
print " $val1[1]\n"; 

Die oben genannte Skripte kann die Zahl nach = bekommen, was ich will, aber ich muß hart Code $val[0]$val1[1] die Nummer bekommen. Wie auch immer, ich kann die Ziffer anpassen, indem ich die Hex-Zahl ignoriere, falls ich nicht sicher bin, welche Nummer die Nummer erreichen wird, die ich möchte? Also kann ich einfach drucken, um die Nummer zu bekommen, die ich möchte.

30.8 Update Vielen Dank für Toto hinweisen

der Fall sein wird, die erste Hex-Zahl enthalten alle einstelligen 1234 und auch die Nummer, die ich passen wollen notwendig kein letztes Wort in String sein. Die Nummer, die ich will, ist nicht notwendig, die zweite Zahl wird aber nach =

+0

Was ist ' "1234 1234"', wo die erste hexadezimale ist? – Toto

+0

@Toto, ja sie werden der Fall sein, so verwechsle ich, wie man es trennt – Tim

+0

Wollen Sie immer die zweite Zahl in der Zeichenfolge? – Toto

Antwort

1

Da das Hex nur Ziffern enthalten kann (1234) die beiden Zahlen können nicht durch Format unterschieden werden.

Die gezeigten Saiten erlauben positionell (Ende der Zeichenfolge) anzupassen oder auf Basis von = ihm vorhergehenden

my ($num) = $string =~ /([0-9]+)$/; 

my ($num) = $string =~ /=\s*([0-9]+)\b/; 

oder Verwendung eines anderen „Wahrzeichen“ in den Saiten machen, falls abweichend von den gezeigten Proben.

Angesichts der Klarstellung in der Frage der Bearbeitung ist das zweite Beispiel oben geeignet.


Original-Beitrag, vor Kommentare (bearbeitet)

Eine Reihe nicht Buchstaben haben (es sei denn, es handelt Exponenten), so verwenden, um eine Wortgrenze

my ($num) = $string =~ /\b([0-9]+)\b/; 

für ein (vorzeichenlose) ganze Zahl.

Um +/- und/oder ein Gleitkommaformat

my ($num) = $string =~ /([+-]? [0-9]+\.?[0-9]*)/x; 

aber beachten Sie zu erlauben, dass dies für Zahlen verwendet, um einige Formate auslässt. Die looks_like_number von Kern Scalar::Util ist zuverlässiger, und man kann zunächst breiter und dann filtern Sie die Liste mit ihm.

können Sie \d anstelle von 0-9 aber diese Spiele viele zusätzliche Zeichen, wenn es mit /a Modifikator (en), verfügbar seit 5.14 verwendet wird. Beachten Sie jedoch, dass die /a einen breiteren Effekt hat als die Beschränkung auf ASCII-Nummern (\d). Siehe perlre (Suche nach /a).

+0

danke für die Antwort, dann denke ich muss ich mit '=' übereinstimmen – Tim

0

Sie können (\d+$) verwenden, um Zahlen nur dann zu finden, wenn sie sich am Ende der Zeichenfolge befinden.

0

Wie wäre es?

Dies ist die zweite Zahl passender, die in der Zeichenfolge vorhanden ist:

while(<DATA>) { 
    my ($dec) = $_ =~ /.+\b(\d+)\b/a; 
    say $dec; 
} 

__END__ 
hex abc123 dec 456 blah 
hex 123123 dec 789456 blah 

Ausgang:

456 
789456 
Verwandte Themen