замените значение переменной и сохраните ее в новой переменной - PullRequest
0 голосов
/ 10 декабря 2010

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

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

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

Ответы [ 4 ]

3 голосов
/ 10 декабря 2010

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

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

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

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

3 голосов
/ 10 декабря 2010

Подстановка 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"; 
3 голосов
/ 10 декабря 2010

Используйте

$hdisk = "hdisk361"
$newdisk = $hdisk;
$newdisk =~ s/(hdisk\D*)(\d+)/(($1 eq "hdiskpower"?"prw":"dsk").$2/
2 голосов
/ 10 декабря 2010

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

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 можно прочитать на Используйте флаг замены / r для работы с копией .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...