2009-06-11 6 views

Répondre

5

index() trouve une chaîne dans une autre et renvoie l'index ou la position de cette chaîne.

substr() retournera la sous-chaîne d'une chaîne entre 2 positions (à partir de 0).

En regardant ce qui précède, je soupçonne que la méthode d'index est mal utilisé (puisque sa définition est index STR, SUBSTR), et il devrait être

index($var, ".") 

pour trouver le « » dans les « abc.de » et déterminer une sous-chaîne de « abc.de »

+0

ah, donc le code original est une façon élégante de dire chop ($ convar = $ var); :) – ysth

+0

Inélégant, sûrement :-) –

+0

La chose "intelligente" à propos de substr() est qu'il peut également être utilisé comme une lvalue. – Beano

2

L'utilisation de substr implicite ici est -

substr EXPR,OFFSET,LENGTH 

Depuis le décalage est 0, l'opération retourne la chaîne jusqu'à, mais non compris le premier '.' position (comme renvoyé par index (".", $ var)) dans $ convar. Jetez un oeil aux fonctions substr et index de perldoc pour clarifier davantage les choses.

0

La fonction Perl substr a le format suivant:

substr [string], [offset], [length] 

qui renvoie la chaîne à partir de l'indice de décalage de l'indice de décalage + longueur

index a le format suivant:

index [str], [substr] 

qui renvoie le indice de la première occurrence de substr dans str.

ainsi que substr ('abc.de', 0, index (".", $ Var)); retournera la sous-chaîne commençant à l'index 0 (c'est-à-dire 'a') jusqu'au nombre de caractères à la première occurrence de la chaîne "."

Donc $ convar aura "abc" dans l'exemple que vous avez

edit: putain, les gens sont trop vite: P Edit2: et Brian a raison sur l'index utilisé incorrectement

0

Pourquoi pas et trouve?

 
#!/usr/bin/perl 
my $var = $ARGV[0]; 
my $index = index(".",$var); 

print "index is $index.\n"; 

my $convar = substr($var, 0, $index); 
print "convar is $convar.\n"; 

Exécutez cela sur un tas de mots et voyez ce qui se passe.

En outre, vous pouvez taper:

 
perldoc -f index 
perldoc -f substr 
0

Fabuleusement, vous pouvez écrire des données dans un sous-chaîne en utilisant substr comme le côté gauche d'une affectation:

$ perl -e '$a="perl sucks!", substr($a,5,5)="kicks ass"; print $a' 
perl kicks ass! 

Vous n'avez pas même besoin de coller à la même longueur - la chaîne s'élargira pour s'adapter.Techniquement, cela est connu comme l'utilisation de substr comme une lvalue.