2010-12-10 8 views
0

J'ai ci-dessous le code pour remplacer la valeur de la variable et le stocker dans une nouvelle variable et laisser la variable d'origine intacte.remplacer la valeur de la variable et le stocker dans la nouvelle variable

#!/usr/bin/perl 
$hdisk="hdisk361"; 
($newdisk) = ($hdisk =~ s/(hdisk\D*)(\d+)/(($1 eq "hdiskpower"?"prw":"dsk").$2)/ei); 
print "hdisk: $hdisk"."\n"; 
print "newdisk: $newdisk"."\n"; 

Il donne cette sortie:

hdisk: dsk361 
newdisk: 1 

Je veux la sortie comme ceci:

hdisk: hdisk361 
newdisk: dsk361 

S'il vous plaît aidez-moi à résoudre ce code?

+1

Veuillez * toujours * inclure 'use strict; utiliser des avertissements; 'en haut de votre code. Il va attraper beaucoup d'erreurs, en fait souvent tellement que vous n'avez même pas à poster ici. – Ether

Répondre

3

Ou un peu plus court:

#!/usr/bin/perl 
$hdisk="hdisk361"; 
($newdisk = $hdisk) =~ s/(hdisk\D*)(\d+)/(($1 eq "hdiskpower"?"prw":"dsk").$2)/ei; 

Sinon, comme vous l'avez vu, vous obtenez 1, ce qui signifie une opération réussie. Dans le code que vous avez fourni, vous avez capturé la valeur de retour au lieu du résultat.

Mais ne pas oublier d'utiliser use strict et use warnings;)

+0

cool, c'est ce que je cherche. merci – sfgroups

3

Utilisez

$hdisk = "hdisk361" 
$newdisk = $hdisk; 
$newdisk =~ s/(hdisk\D*)(\d+)/(($1 eq "hdiskpower"?"prw":"dsk").$2/ 
+0

Très simple, mais il a besoin d'un autre point-virgule ou deux. – Narveson

3

La substitution s/// œuvres de côté effet. Sa valeur de retour est rarement ce que vous voulez. Vous ne voulez surtout pas utiliser s ici, quand vous ne voulez pas que $hdisk change.

Capturez les pièces de $hdisk avec m au lieu de s.

use strict; 
use warnings; 
my $hdisk="hdisk361"; 
my ($word, $number) = $hdisk =~ m/(hdisk\D*)(\d+)/i; 
my $newdisk = ($word eq "hdiskpower"?"prw":"dsk").$number; 
print "hdisk: $hdisk"."\n"; 
print "newdisk: $newdisk"."\n"; 
+1

Juste par curiosité, pourquoi cette approche est préférable à ce que wickie79 ou j'ai suggéré? Ou est-ce juste une alternative tout aussi valable? – canavanin

+1

@canavanin, j'ai trouvé que nommer mes captures (ici, '$ word' et' $ number' au lieu de '$ 1' et' $ 2') est un bon moyen d'aider les lecteurs de mon code à comprendre ce que j'essaie faire. Cela pourrait être des collègues, ou ce pourrait être moi-même dans six mois. Pour ce qui est de scinder la capture et l'assignation en deux déclarations, je sais qu'il y a une façon intelligente de le faire dans une seule déclaration, mais au moment où je me suis souvenu comment le faire (il y a des pièges, pourrait avoir tapé les deux déclarations avec confiance et a continué à faire quelque chose d'autre. – Narveson

+0

Merci d'avoir élaboré un peu, vous avez un point là-bas! Tu m'as aussi appris quelque chose dans ton post, alors merci pour ça aussi. – canavanin

2

Cette réponse est un peu superflu, mais de toute façon, si vous utilisez une assez version moderne de Perl (5.13+), vous pourriez avoir le code d'origine de travail en ajoutant simplement le drapeau r:

use 5.013; 
($newdisk) = ($hdisk =~ s/(hdisk\D*)(\d+)/(($1 eq "hdiskpower"?"prw":"dsk").$2)/rei); 

Vous pouvez même laisser aller des parens:

use 5.013; 
my $newdisk = $hdisk =~ s/(hdisk\D*)(\d+)/(($1 eq "hdiskpower"?"prw":"dsk").$2)/rei; 

Vous pouvez en savoir plus sur le drapeau /r à Use the /r substitution flag to work on a copy.

+0

@Hugmeier Merci d'avoir mentionné cette fonctionnalité, et d'ailleurs: merci pour le lien vers cette page web très utile! – canavanin

Questions connexes