Schrift
[thread]6517[/thread]

Letztes Zeichen aus einem Skalar löschen: Wieviele Methoden mag es dafür geben?



<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
Crian
 2004-08-20 11:38
#49429 #49429
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Gegeben sei eine Zeichenkette der Form

my $text = "xyz123";

Welche verschiedenen Möglichkeiten gibt es, das letzte Zeichen
zu entfernen? Was mir so einfällt:

1) chop $text;

2) $text = join '', (split //, $text)[0..length($text)-2];

3) $text = substr $text, 0, length($text)-1;

4) $text = join '', splice(@{[split //, $text]}, 0, length($text)-1);

5) $text =~ s/.$//;

Genau dann wenn das letzte Zeichen ein Zeilenumbruch ist, kann man als
zusätzliche Variante auch chomp nehmen, aber das zähle ich mal nicht mit.

Das ideomatischste dürfte wohl Variante 1 - chop - sein. Die Idee zu
dieser Frage kam mir, als ich mir die Frage nach der ideomatischsten
Möglichkeit genau dies in einer anderen Programmiersprache (SAS) zu
tun stellte (da fällt mir nur eine substr-Entsprechung ein).

Hier mal mein Testcode:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;

my $text = "xyz123";
print "0) '$text'\n";

chop(my $text1 = $text);
print "1) '$text1'\n";

my $text2 = join '', (split //, $text)[0..length($text)-2];
print "2) '$text2'\n";

my $text3 = substr $text, 0, length($text)-1;
print "3) '$text3'\n";

my $text4 = join '', splice(@{[split //, $text]}, 0, length($text)-1);
print "4) '$text4'\n";

(my $text5 = $text) =~ s/.$//;
print "5) '$text5'\n";


mit der Ausgabe

Code: (dl )
1
2
3
4
5
6
0) 'xyz123'
1) 'xyz12'
2) 'xyz12'
3) 'xyz12'
4) 'xyz12'
5) 'xyz12'


Fallen Euch noch mehr Möglichkeiten ein?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
pq
 2004-08-20 11:52
#49430 #49430
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
substr($text, -1, 1, "");

$text = reverse $text;$text =~ s/.//s; $text = reverse $text;

local $" = ''; $text = "@{[@_ = split//, $text and pop @_ and @_]}";

edit: regex-lösung nach ptks hinweis mit /s\n\n

<!--EDIT|pq|1092996176-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2004-08-20 13:31
#49431 #49431
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
schick =)

Ich hab inzwischen sogar in SAS zwei Möglichkeiten gefunden:
Code: (dl )
1
2
3
4
5
6
7
data menge2;
   format kopie $10.;
   informat kopie $10.;
   set menge;

   kopie = original;
run;

und
Code: (dl )
1
2
3
4
5
6
data menge2;
   format kopie $10.;
   set menge;

   kopie = substr(original,1,10);
run;

(wobei das [tt]original
10 alphanumerische Stellen hat)[/tt]
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-08-20 13:59
#49432 #49432
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Die Regexp-Loesung funktioniert nicht, wenn Newlines im Spiel sind. Richtig muesste es so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
use Data::Dumper;
$foo = "bla\n";
$foo =~ s/.$//;
warn Dumper $foo; # falsches Zeichen entfernt

$foo = "bla\n";
$foo =~ s/.\z//s;
warn Dumper $foo; # ah!
Crian
 2004-08-20 14:16
#49433 #49433
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
stimmt
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
rupe
 2006-10-09 18:56
#49434 #49434
User since
2006-10-02
4 Artikel
BenutzerIn
[default_avatar]
So weil ihr gerade beim Thema seid:
Ich hätte da eine kurze Anfänger-Frage.
Wie kann ich das letzte zeichen eines Strings löschen wenn es ein "/" zeichen ist! (Anführungszeichen zählen nicht)

Also das soll nur gelöscht werden wenn es ein schrägstrich ist und dann auch nur wenn es an der letzten stelle des strings steht!

Schon mal im vorraus danke für die Antwort!
.mike.
 2006-10-09 19:20
#49435 #49435
User since
2006-04-07
26 Artikel
BenutzerIn
[default_avatar]
$string =~ s/\/$//;
pq
 2006-10-09 19:23
#49436 #49436
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
$var =~ s#/$##;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2006-10-09 21:06
#49437 #49437
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=pq,09.10.2006, 17:23]$var =~ s#/$##;[/quote]
Wie auch ptk schon weiter oben, rate ich, hier \z statt $ zu nehmen:
Code: (dl )
$var =~ s#/\z##;
esskar
 2006-10-10 00:30
#49438 #49438
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
chop $text if substr($text, -1, 1) eq '/';

könnte die schnellste lösung sein.
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2004-08-20 11:38.