Frage zur Funktion substr()

Begonnen von TomLee, 07 Juni 2020, 18:56:01

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

möchte ein Reading auf 30 Zeichen begrenzen, das klappt auch mit:

(substr(ReadingsVal("devicename","readingname","no title"),0,32))

Das man erkennt das das Reading überlang war will ich dem Reading drei Punkte anhängen, aber nicht immer:

(substr(ReadingsVal("devicename","readingname","no title"),0,32)."...")

sondern nur wenn das Reading auch grösser x war.

Kann vielleicht substr das schon selbst ?

Gruß

Thomas

Sowas soll ja gehen :

$t="Mein Name ist Hase";
substr($t,14,4,"Wolf");
print $t;

Ausgabe:
Mein Name ist Wolf


Klappt aber nicht wie ich mir das gerne vorgestellt hätte mit regexp zu nutzen :

substr($t,14,.*,"...");

Hat jemand einen Tipp, ohne großen Aufwand das umzusetzen.


Wzut

#1
use strict;

my $kurz = "das ist nicht so lang";
my $lang = "und hier ist so ein Monster mit Überlänge";

sub trim30 { return length($_[0]) < 31 ? $_[0] : substr($_[0],0,27).'...'; }

print trim30($kurz)."\n";
print trim30($lang)."\n";

Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

TomLee

Danke, mit großem Aufwand war if gemeint, ich werds dann wohl so machen. :P

TomLee

#3
Ich kann kein Perl, aber etwas belesen bin ich, was mich interessiert, weshalb ich hier nie was von say lese ?

Wenn du schon use strict angibst warum nicht auch die Minimalversion ? und dann natürlich mind. use 5.010; weil ab da say geht.

Wenn ich say in FHEM verwenden will bekomm ich die Meldung Can't locate object method "say" via package ...

Ist das so in FHEM, gibts diese Minimalangabe überall wo ich in FHEM Perl verwenden kann nicht ?

Wär doch einfacher, wie umständlich noch ne neue Zeile anzuhängen ?

Gruß

Thomas


Wzut

was ich dir da gepostet habe ist ein mini Perl Programm damit du die Funktion trim30 mal ausserhalb von FHEM auf die Schnelle testen kannst.
Innerhalb von FHEM wird i.d.R. weder print noch say usw. benutzt da Ausgaben in readings oder Logfiles  etc. erfolgen.
Die Zeile
sub trim30 { return length($_[0]) < 31 ? $_[0] : substr($_[0],0,27).'...'; }
war gedacht als Erweiterung für deine 99_myUtils um einfach und jederzeit  (userReadings, notify, ... ) deine langen Strings zu kürzen.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

TomLee

Zitatdamit du die Funktion trim30 mal ausserhalb von FHEM auf die Schnelle testen kannst

na genau darum bin ich ja auf meine Frage gekommen.




Eine Frage direkt, weitere 1-2 werden vermutlich noch folgen.

Kann ich die Minimalversion in der 99_myUtils angeben, sprich say nutzen ?

Wzut

was soll print oder say in der 99_myUtils ?
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

TomLee

Ich mag auch daneben liegen ->Verrenkungen die Beta-User hier in diesem Thread kurzeitig anstellt, Html-Code in stateformat zu vermeiden, einfacher zu gestalten, dann halt in einer 99_myUtils.

Und der Grund für kein bzw. weniger HTML in STATE sind User die einen Screenreader nutzen müssen.


Beta-User

?
War das mit "my $trim30 = sub {}" und hinterher "$trim30->..." statt des sub-Aufrufs nicht ok?
(Evtl. in anderen Punkten nicht funktionierende Vollversion: https://forum.fhem.de/index.php/topic,111711.msg1062906.html#msg1062906)

(Danach hattest du mal "Misch-Code" gezeigt, war wohl etwas viel gestern ;) )
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors