我有以下代码来替换变量值并将其存储在新变量中并保留原始变量。
#!/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
请帮我修复此代码?
答案 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 strict
和use 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
标记上阅读更多内容。