Substr函数不适用于IF语句

时间:2014-02-03 10:45:44

标签: perl

我正在阅读一个包含各种长度字符串的文件,我必须在不同的开始和结束位置(从左到右)剪切。有时起始位置大于结束位置,这告诉我从右到左剪切字符串。

我有以下代码。如果$ start大于$ end,则不会创建子字符串。 substr函数仅在$ end大于$ start时才有效。不知道为什么会这样。 如果我删除了IF / ELSE语句,即使$ start大于$ end,substr也能正常工作。任何帮助将不胜感激。

 $start = 20;
 $end = 10;
 $len = 5
 $string = "THISISALONGSTRINGTHATWILLNOTSPLICEUNLESSIREMOVETHEIFSTATEMENT";

 if ($start > $end){
   my $slice = substr($string, $end, $len);
 }
 else{
   my $slice = substr($string, $start, $len);
 }

3 个答案:

答案 0 :(得分:2)

my $slice;
if ($start > $end){
  $slice = substr($string, $end, $len);
}
else{
  $slice = substr($string, $start, $len);
}

或者

my $slice = ($start > $end) 
  ? substr($string, $end, $len) 
  : substr($string, $start, $len);

答案 1 :(得分:2)

my $slice似乎是错误的,它会超出下一个}的范围,这意味着$slice条件后不会设置if/else。将my $slice;放在if前面,然后移除my语句中的substr

编辑:mpapec说什么,他比我快。

答案 2 :(得分:0)

在现代Perl中,大多数变量都是词法范围。这意味着它们将根据定义的位置进出定义。在内定义的变量将不再在该块外部定义。把一块视为一对花括号。因此,您的if语句是一个块:

if ( ... )  {  # Beginning of a block
    ....
    ....
}              # End of a block

这意味着此块中定义的任何变量(通过my)将不再在if语句之外定义。

要解决此问题,请在if语句的外定义变量,然后更改值:

my $slice;          # Variable is defined here
if ( $start > $end ) {
    $slice = substr($string, $end, $len);
}
else {
    $slice = substr($string, $start, $len);
}
say $slice;         # Variable is still set here.