如果循环不在perl中工作

pra*_*ant -4 perl if-statement

请查看此脚本并提供可能的解决方案..

my $otext = 'ABCDEABCDEABCDEABCDEABCDE'; 
my $len   = length($otext);
print "length of string is:\n".$len;
$n = 1;

if ($n == 1) {

    if (substr($otext, -1, 1) eq "E") {

        if ($len >= 3) {

            if ($len == 3) {

                $len1 = 2 * $len - 1; 
                $len2 = 3 * $len - 2; 
            }
            else {

                $len1 = 2*$len-1; 
                $len2 = 3*$len-3;
            }
        }
        else {

             $len1 = 0;
             $len2 = 0;     
        }   
        print "Length-1 is:". $len1;
        print "Length-2 is:" .$len2;
    }
}
else { 

    print "\n It's else loop ";
}
Run Code Online (Sandbox Code Playgroud)

amo*_*mon 5

除了其他答案之外,我还建议您对代码进行一些改进

消除死代码

my $n = 1;
if ($n == 1) {
  # Code 1
} else {
  # Code 2
}
Run Code Online (Sandbox Code Playgroud)

始终运行代码1.

避免C-isms

substr($otext,-1,1) eq "E"
Run Code Online (Sandbox Code Playgroud)

测试最后一个字符是否为E.在Perl中,这可以用正则表达式编写得更好:

$otext =~ /E$/
Run Code Online (Sandbox Code Playgroud)

$表示在正则表达式的字符串的末尾.

简化您的逻辑

你有这个结构:

if ($len >= 3) {
  if ($len == 3) {
    # Code 1
  } else {
    # Code 2
  }
} else {
  # Code 3
}
Run Code Online (Sandbox Code Playgroud)

这完全等于

if ($len == 3) {
  # Code 1
} elsif ($len > 3) {
  # Code 2
} else {
  # Code
}
Run Code Online (Sandbox Code Playgroud)

声明你的变量

始终my在使用它们的最外层范围内声明变量.唯一的例外是(a)当你写一个快速班轮或(b)你有一个非常好的理由使用全局.

把Newlines放在他们所属的地方

我相信这段代码

  print "Length-1 is:". $len1;
  print "Length-2 is:" .$len2;
Run Code Online (Sandbox Code Playgroud)

旨在产生类似的输出

Length-1 is: 0
Length-2 is: 0
Run Code Online (Sandbox Code Playgroud)

并不是

Length-1 is:0Length-2 is:0
Run Code Online (Sandbox Code Playgroud)

我插你的变量$len1$len2成字符串,追加新行,并包括一个空间:

  print "Length-1 is: $len1\n";
  print "Length-2 is: $len2\n";
Run Code Online (Sandbox Code Playgroud)