2010-08-03 4 views
2
#!/usr/bin/perl 

my $str = "abc def yyy ghi"; 

print substr($str, 0 , index($str,' ')); 

Je veux substr imprimer def yyyperl substr pour obtenir une sous-chaîne

print substr ($str, index ($str, ' '), rindex($str, ' ') does not work? 

Toute idée?

Répondre

4

Vous n'avez pas spécifié EXACTEMENT ce que vous voulez pour la logique mais la meilleure estimation est que vous voulez imprimer des caractères entre le premier et le dernier espace.

Votre exemple de code imprime trop de caractères car il imprime # de caractères avant le dernier espace (dans votre exemple, 10 au lieu de 7). Pour corriger, vous devez ajuster le nombre de caractères imprimés en soustrayant le nombre de caractères avant le premier espace.

En outre, vous devez un caractère à droite de votre valeur « index » pour éviter d'imprimer le premier espace - ce « +1 » et « -1 » dans l'exemple ci-dessous

$cat d:\scripts\test1.pl 
my $str = "abc def yyy ghi"; 

my $first_space_index = index ($str, ' '); 
my $substring = substr($str, $first_space_index + 1, 
          rindex($str, ' ') - $first_space_index - 1); 
print "|$substring|\n"; 


test1.pl 
|def yyy| 
1

franchement , substr/index/rindex ne sont vraiment pas le moyen d'y aller. Vous êtes mieux de faire quelque chose comme:

my $str = "abc def yyy ghi"; 
my @row = split ' ', $str; 
pop @row and shift @row; 
print "@row"; 

Ce qui est plus inefficace, mais capture l'intention réelle mieux

+0

bon point, si vous êtes flottant vers « et maintenant vous avez deux problèmes » zone :) – DVK

+0

@DVK non, non, voir comment j'éludé soigneusement l'expression régulière, il – ivancho

+0

Meh ... simple formalité. .. vous étiez là en esprit;) – DVK

3

Le troisième argument est la longueur, ne compensera pas. Mais il peut être négatif pour indiquer les caractères de la fin de la chaîne, qui est facilement obtenu à partir rindex et de la longueur, comme suit: (. Remarque ajouter 1 pour obtenir le décalage après le premier espace)

my $str = "abc def yyy ghi"; 
print substr($str, 1 + index($str, ' '), rindex($str, ' ') - length($str)); 

2

Si vous voulez imprimer du texte entre le premier et le dernier espace, cela ne serait-il pas plus facile avec regex?

print $1 if "abc def yyy ghi" =~/(.*)/
Questions connexes