Telefonnummern aus dem (Werbung-)Telefonbuch der Fritzbox kommasepariert

Begonnen von TomLee, 06 September 2023, 13:59:02

Vorheriges Thema - Nächstes Thema

TomLee

Ich möchte mir in Zukunft die Nummern der Rückgabe eines get <callmonitordevicename> showPhonebookEntries 1
->
Phonebook: Werbung / Id: 1

   Number          Name
   -----------------------------
   04042236852   - Lichtblick
   039155721230  - Magdeburg
   073598407944  - Microsoft
   085631477662  - Microsoft2
   028616879965  - Microsoft3
   089452054228  - Nervt
   06920023399   - Nervt2
   020189067704  - Swedex
   021732651045  - Swedex
   04085599911   - Werbung
   0721509531027 - Werbung1
   039155721386  - Zimmersuche24
kommasepariert in das Attribut sip_filter einer SIP-Definition schreiben.

Ist es OK die Telefonnummern so zu ermitteln:

sub getPhonebookEntrieswritesip() {
my $string = fhem('get cm_bla showPhonebookEntries 1',1);
my @numbers;
for (split /\n/, $string) {
$_ =~ /(0|[1-9]\d+)+/ ? push(@numbers, $1): next;
}
return join (',',@numbers);
}

TomLee

Korrektur, weil mir nicht aufgefallen war das die 0 plötzlich "geschluckt" wird.

So, mit dem regexp /([0-9]\d+)+/:

sub getPhonebookEntrieswritesip {
my $cmdev = shift;
my $sipdev = shift;
my $strnrs = fhem("get $cmdev showPhonebookEntries 1",1);
my @numbers;
for (split /\n/, $strnrs) {
#$_ =~ /(0|[1-9]\d+)+/ ? push(@numbers, $1) : next;}
$_ =~ /([0-9]\d+)+/ ? push(@numbers, $1) : next;}
return join (',',@numbers);
#fhem("attr $sipdev sip_filter ".join (',',@numbers));
}

betateilchen

#2
Einfache Lösungen sind nicht so dein Ding, oder?

my $t = "Phonebook: Werbung / Id: 1

   Number          Name
   -----------------------------
   04042236852   - Lichtblick
   039155721230  - Magdeburg
   073598407944  - Microsoft
   085631477662  - Microsoft2
   028616879965  - Microsoft3
   089452054228  - Nervt
   06920023399   - Nervt2
   020189067704  - Swedex
   021732651045  - Swedex
   04085599911   - Werbung
   0721509531027 - Werbung1
   039155721386  - Zimmersuche24";

return join(",",$t =~ m/(0\d+)/gm);

ergibt:

04042236852,039155721230,073598407944,085631477662,028616879965,089452054228,06920023399,020189067704,021732651045,04085599911,0721509531027,039155721386
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#3
Mal wieder ein schönes Beispiel, in dem es jemand nicht geschafft hat, die tatsächliche Aufgabe auf das absolut einfachste zu reduzieren.

Die Aufgabe lautet "extrahiere aus einem String alle Ziffernfolgen, die mindestens zwei Stellen lang sind und mit 0 beginnen und gib die gefundenen Zahlen kommasepariert zurück".

Von Schleifen oder zeilenweiser Verarbeitung kommt in der Aufgabe nix vor, weil es völlig irrelevant ist.

Nochwas: das next; in Deinem (überflüssigen) for() Konstrukt ist dort relativ nutzlos. Das macht for() nämlich am Ende eines Durchlaufs automatisch.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Vielen Dank für den Vorschlag wie Du es angehen würdest und das erläutern deiner Sichtweise.