替换变量值并将其存储在新变量中

时间:2010-12-10 15:56:44

标签: perl

我有以下代码来替换变量值并将其存储在新变量中并保留原始变量。

#!/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 个答案:

答案 0 :(得分:3)

使用

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

答案 1 :(得分:3)

或者更短一些:

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

否则,如您所见,您获得1,意味着成功的操作。在您提供的代码中,您捕获了返回值而不是结果。

但请不要忘记使用use strictuse warnings;)

答案 2 :(得分: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"; 

答案 3 :(得分:2)

这个答案有点夸张,但无论如何,如果您使用相当现代版本的Perl(5.13 +),您可以通过添加r标志来使原始代码正常工作:

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

你甚至可以放开那些parens:

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

您可以在Use the /r substitution flag to work on a copy上的/r标记上阅读更多内容。