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);
}
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));
}
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
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.
Vielen Dank für den Vorschlag wie Du es angehen würdest und das erläutern deiner Sichtweise.