使用Perl反转字符串中的数字

时间:2012-10-28 17:13:08

标签: perl reverse

我有一串数字。比如说:“234615”。现在我应该在第一个最低位和第二个最低位之间翻转数字。

从上面的字符串开始,第一个最低位是“1”,第二个最低位是“2”。第一个最低位数和 第二个最低位是“346”。现在,这个“346”应该写成“643”。

希望我能清楚说明问题。

这是我试过的代码,

my $a = "234615";
my @g = split("", $a);
@g = sort(@g);
my $first  = $g[0];
my $second = $g[1];
print "$first \t $second\n\n";

for(my $i = 0; $i < $#g; $i++) {

    if ($g[$i] == $first) {

    }

    if ($g[$i] == $second) {

    }
}

我上面的代码可以找到第一个最低位和第二个最低位。但我不确定反面部分。

有人可以帮助我吗?

提前致谢!!

4 个答案:

答案 0 :(得分:2)

另一种方式:

my $a = "234615";
my @g=split("",$a);
@g=sort(@g);
my $first=$g[0]; my $second=$g[1];

my @ar = split(/($first|$second)/,$a);

$ar[2] = reverse($ar[2]);

print join("",@ar)."\n\n";

也会返回264315

在我更新后编辑:

use Data::Dumper;

my $a = "234615";
my @g=split("",$a);
@g=sort(@g);
my $first=$g[0]; my $second=$g[1];

my @ar = split(/($first|$second)/,$a);
my @result;
push(@result,
    $ar[0],
    $ar[1].$ar[2].$ar[3],
    $ar[4]);
$result[1] = reverse($result[1]);

print join("",@result)."\n\n";

返回164325

答案 1 :(得分:2)

如果我理解你的问题,你可以这样做:

perl -lwe '$_ = 234615; 
           @a = /\pN/g; 
           my ($n1,$n2) = (sort @a)[0,1]; 
           s/$n2.*?$n1/reverse $&/e; 
           print;'

产生输出164325。该oneliner的完整代码是:

use strict;
use warnings;

$_ = shift;                           # first arg is the number
my @digits = /\pN/g;                  # extract digits
my($n1, $n2) = (sort @digits)[0, 1];  # take the two lowest
s/$n2.*?$n1/reverse $&/e;            # reverse digits using /e
print;

正如您所看到的,它取决于$n1$n2按指定顺序出现,例如2 ... 1.这当然可以逆转,但是硬编码。如果您需要它是灵活的,例如1 ... 2或2 ... 1,它变得更复杂。

你可以这样做:

if (/$n2.*?$n1/ {                # if $n2 appears first
    s/$n2.*?$n1/reverse $&/e;
else {                          
    s/$n1.*?$n2/reverse $&/e;
}

使用正则表达式而不是拆分来提取数字的好处是,您不会冒险在输入中使用任何非数字。通过匹配整个字符串23461并将其反转,使用替换(reverse()选项内的评估内部的/e函数来完成相反的过程。排序是默认排序,在处理单个数字时将起作用。

答案 2 :(得分:1)

只要字符串中的数字不会出现多次,下面的程序就可以满足您的需要。如果最低值中的任何一个出现多次,那么您需要定义哪个省略了必须反转的子字符串。

首先将排序的数字列表放入@sorted,就像您自己的程序一样。然后它使用前两个数字,使用带有map的{​​{1}}将它们转换为字符串中的一对偏移量,对它们进行排序,使得第一个最早是第一个,然后执行更换。

index可以避免两次调用for。它将所需的子字符串与substr混淆,然后就地将其反转。

$_

<强>输出

use strict;
use warnings;

my $str = '234615';

my @sorted = sort split //, $str;
my @indices = sort { $a <=> $b } map { index $str, $_ } @sorted[0,1];

for (substr $str, $indices[0] + 1, $indices[1] - $indices[0] - 1) {
  $_ = reverse $_;
}

print $str;

答案 3 :(得分:-1)

  print "Enter the String to be reversed : ";
  $name = <STDIN>;
  chomp $name;
  @array = split(undef,$name);
  $len = length($name);
  for($i=$len; $i>=0;  $i--)
     {
        print "@array[$i]";
      }