Es gibt außer substr() noch andere Möglichkeiten zur Begrenzung, die sind jedoch byte-orientiert. substr() ist zeichenorientiert, interessant wird das Thema bei utf-8, wo also Zeichen mehr als 1 byte lang sind, hierzu hilft das Pragma utf8;
no utf8;
print length('€'); # 3use utf8;
print length('€'); # 1
Es kann sein, dass ich "noch nicht gelernt habe mit utf-8 kodierten Zeichen umzugehen". Aber du ebenso wenig.
Das Pragma use utf8 wirkt, wie es auch in der Doku steht nur auf den Perl Quelltext, nicht auf das was von Aussen kommt.
Aber das ganze scheint noch wesentlich vertrackter zu sein.
Hier ein Skript, dessen Quellcode in utf-8 ist:
http://jstruebig.de/cgi-bin/utf.pl
Wie du siehst, wird die Länge des Input (also das was von aussen kommt) in keinem Fall richtig berechnet.
Merkwürdig, ist dass das 'ä' mit use utf8 als ISO Zeichen ausgegeben wird.
Jetzt das gleich Skript, in dem ich die 'ä' durch ein '€' Zeichen ausgetauscht habe, sonst hat sich nichts geändert.
http://jstruebig.de/cgi-bin/utf_mit_euro.pl
Auch hier wieder, keine Länge wird richtig berechnet und mit use utf8 wird der Input so umgewandelt, dass er nicht mehr in der HTML Seite dargestellt wird.
Wie auch immer, dein Rat use utf8 zu verwenden, ist mit großer Vorsicht zu geniessen, da er zu falschen Ausgaben führt. Es steht ja auch in der Doku use utf8 ist lediglich dazu da, dass Perl sagst, dass der Quellcode in utf8 vorliegt. Du scheinst diese Aussage ignorieren zu wollen.
Struppi.