2010-12-10 2 views
0

У меня есть код ниже, чтобы заменить значение переменной и сохранить его в новой переменной и оставить исходную переменную неповрежденной.замените значение переменной и сохраните его в новой переменной

#!/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"; 

Это дает этот результат:

hdisk: dsk361 
newdisk: 1 

Я хочу выход так:

hdisk: hdisk361 
newdisk: dsk361 

Пожалуйста, помогите мне исправить этот код?

+1

Please * always * include `use strict; используйте предупреждения, `вверху вашего кода. Это поймает много ошибок, на самом деле часто так много, что вам даже не нужно публиковать здесь. – Ether 2010-12-10 17:24:12

ответ

3

Или немного короче:

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

В противном случае, как вы видели, вы получаете 1, что означает успешную операцию. В коде, который вы предоставили, вы взяли возвращаемое значение вместо результата.

Но не забудьте использовать use strict и use warnings;)

+0

круто, это то, что я ищу. спасибо – sfgroups 2010-12-10 17:38:52

3

Использование

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

Очень просто, но ему нужна другая точка с запятой или две. – Narveson 2010-12-11 03:10:47

3

Замена s/// работ по побочному эффекту. Его возвращаемая стоимость вряд ли когда-нибудь будет вам нужна. Вы особенно не хотите использовать s здесь, когда вам кажется, что не нужно $hdisk изменить.

Захват кусков $hdisk с m вместо 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

Просто из любопытства, почему этот подход предпочтительнее того, что wickie79 или я предложил? Или это не менее подходящая альтернатива? – canavanin 2010-12-10 16:20:14

+1

@canavanin, я обнаружил, что имена моих захватов (здесь `$ word` и` $ number` вместо `$ 1` и` $ 2`) - хороший способ помочь читателям моего кода понять, что я пытаюсь делать. Это могут быть коллеги, или это может быть я через шесть месяцев. Что касается разделения захвата и присваивания на два утверждения, я знаю, что есть умный способ сделать это в одном выражении, но к тому времени, когда я вспомнил, как это сделать (есть подводные камни, как только заметили sfgroups), я мог бы уверенно напечатать два заявления и продолжить делать что-то еще. – Narveson 2010-12-11 03:08:42

2

Этот ответ немного superflous, но в любом случае, если вы используете достаточно современную версию Perl (5.13+), вы могли бы иметь исходный код работает, просто добавив г флаг:

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

Вы могли даже отпустить из скобок:

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

Вы можете прочитать на /r флаг в Use the /r substitution flag to work on a copy.

Смежные вопросы