我正在阅读一个包含各种长度字符串的文件,我必须在不同的开始和结束位置(从左到右)剪切。有时起始位置大于结束位置,这告诉我从右到左剪切字符串。
我有以下代码。如果$ 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);
}
答案 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.