【问题标题】:Substr function not working with IF statementSubstr 函数不适用于 IF 语句
【发布时间】:2014-02-03 21:42:27
【问题描述】:

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

我有以下代码。如果 $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);
 }

【问题讨论】:

  • 您的预期输出是什么?
  • 我希望$len = 5 后面缺少的分号只是复制/粘贴错误。

标签: perl


【解决方案1】:
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);

【讨论】:

  • 在 IF/ELSE 块之外声明 $slice 并不能解决它。
  • @user2674514 你能举例说明你的预期输出是什么吗?
  • 这似乎行得通。但是,如果 $start > $end,除了 substr 之外,我还需要做其他事情。例如,如果 $start > $end,我还需要反转字符串。如果满足条件,我将如何实现您的语法以允许我对 $slice 执行其他操作?
  • @user2674514 ? reverse substr($string, $end, $len)
【解决方案2】:

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

编辑:mpapec 说的,他比我快。

【讨论】:

    【解决方案3】:

    在现代 Perl 中,大多数变量是词法作用域。这意味着它们将根据定义的位置进出定义。 block 内定义的变量将不再在该块外定义。将块想象成一对花括号。因此,您的 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 2023-01-10
      • 2023-04-03
      • 1970-01-01
      • 2021-09-28
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多