将perl中的字符串截断为带有尾随省略号的子字符串

将perl中的字符串截断为带有尾随省略号的子字符串,perl,substring,Perl,Substring,我正在尝试使用perl截断select输入选项中的字符串,如果该字符串长于一个设置值,尽管我无法使其正常工作 my $value = defined $option->{value} ? $option->{value} : ''; my $maxValueLength = 50; if ($value.length > $maxValueLength) { $value = substr $value, 0, $maxValueLen

我正在尝试使用perl截断select输入选项中的字符串,如果该字符串长于一个设置值,尽管我无法使其正常工作

    my $value = defined $option->{value} ? $option->{value} : '';
    my $maxValueLength = 50;

    if ($value.length > $maxValueLength) {
        $value = substr $value, 0, $maxValueLength + '...';
    }

要查找字符串的长度,请使用
length(string)


下面是如何修改脚本的代码片段

#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

my $string = "abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz";
say "length of original string is:".length($string);

my $value = defined $string ? $string : '';
my $maxValueLength = 50;

if (length($value) > $maxValueLength) {
    $value = substr $value, 0, $maxValueLength;
    say "value:$value";
    say "value's length:".length($value);
}
输出:

length of original string is:80
value:abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvw
value's length:50

要查找字符串的长度,请使用
length(string)


下面是如何修改脚本的代码片段

#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

my $string = "abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz";
say "length of original string is:".length($string);

my $value = defined $string ? $string : '';
my $maxValueLength = 50;

if (length($value) > $maxValueLength) {
    $value = substr $value, 0, $maxValueLength;
    say "value:$value";
    say "value's length:".length($value);
}
输出:

length of original string is:80
value:abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvw
value's length:50

另一个选择是正则表达式

$string =~ s/.{$maxLength}\K.*/.../;
它匹配给定次数的任何字符(
)(
{N}
,此处为
$maxLength
),在
$string
中的第一个
$maxLength
字符是什么;然后
\K
使其“忘记”以前的所有匹配项,以便以后不会替换这些匹配项。然后将匹配的字符串的其余部分替换为

有关
\K
,请参阅


这确实会为一个简单的任务启动正则表达式引擎,但它不需要任何条件——如果字符串短于最大长度,正则表达式将不匹配,并且什么也不会发生。

另一个选项是正则表达式

$string =~ s/.{$maxLength}\K.*/.../;
它匹配给定次数的任何字符(
)(
{N}
,此处为
$maxLength
),在
$string
中的第一个
$maxLength
字符是什么;然后
\K
使其“忘记”以前的所有匹配项,以便以后不会替换这些匹配项。然后将匹配的字符串的其余部分替换为

有关
\K
,请参阅


这确实会为一个简单的任务启动正则表达式引擎,但它不需要任何条件——如果字符串短于最大长度,正则表达式将不匹配,并且什么也不会发生。

您的代码有几个语法错误。启用
使用严格
使用警告
(如果您没有),然后阅读它告诉您的错误消息。这有点棘手,因为Perl的语法非常复杂(另请参见),但归结起来如下:

  • 在第7行的串联(.)或字符串中使用未初始化的值
  • 参数“…”不是第8行的数字加法(+)
  • 我使用了下面对代码的修改来生成这些

    使用严格;
    使用警告;
    我的$value='1234567890'x 10;
    我的$maxValueLength=50;
    如果($value.length>$maxValueLength){
    $value=substr$value,0,$maxValueLength+'…';
    }
    打印$value;
    
    现在让我们看看他们的意思

  • Perl中的
    运算符是一个串联。您不能使用它来调用方法,
    length
    不是字符串上的方法。Perl认为您在使用(函数,而不是方法)时没有参数,这使得它默认为
    $\ucode>。大多数内置程序都会这样做,以缩短一行程序。但未定义
    $\uuu
    。现在,
    尝试将
    undef
    的长度连接到
    $value
    。在字符串操作中使用
    undef
    会导致此警告

    正确的方法是
    length$value
    (如果您喜欢,可以使用括号,
    length$value

  • +
    运算符不是串联运算符(我们刚刚了解到
    是串联运算符)。这是一个数字加法。Perl非常擅长在字符串和数字之间进行转换,因为实际上没有任何类型,所以说
    1+“5”
    会给您带来
    6
    ,没有问题,但对于字符串中的几个点,它无法做到这一点。因此,它抱怨加法中的非数值

    您需要具有给定长度的子字符串,然后要附加三个点。由于运算符的关联性(或粘性),您需要为
    substr
    调用使用括号
    ()

    $value=substr($value,0,$maxValueLength)。“…”;
    

  • 您的代码有几个语法错误。启用
    使用严格
    使用警告
    (如果您没有),然后阅读它告诉您的错误消息。这有点棘手,因为Perl的语法非常复杂(另请参见),但归结起来如下:

  • 在第7行的串联(.)或字符串中使用未初始化的值
  • 参数“…”不是第8行的数字加法(+)
  • 我使用了下面对代码的修改来生成这些

    使用严格;
    使用警告;
    我的$value='1234567890'x 10;
    我的$maxValueLength=50;
    如果($value.length>$maxValueLength){
    $value=substr$value,0,$maxValueLength+'…';
    }
    打印$value;
    
    现在让我们看看他们的意思

  • Perl中的
    运算符是一个串联。您不能使用它来调用方法,
    length
    不是字符串上的方法。Perl认为您在使用(函数,而不是方法)时没有参数,这使得它默认为
    $\ucode>。大多数内置程序都会这样做,以缩短一行程序。但未定义
    $\uuu
    。现在,
    尝试将
    undef
    的长度连接到
    $value
    。在字符串操作中使用
    undef
    会导致此警告

    正确的方法是
    length$value
    (如果您喜欢,可以使用括号,
    length$value

  • +
    运算符不是串联运算符(我们刚刚了解到
    是串联运算符)。这是一个数字加法。Perl非常擅长在字符串和数字之间进行转换,因为实际上没有任何类型,所以说
    1+“5”
    会给您带来
    6
    ,没有问题,但对于字符串中的几个点,它无法做到这一点。因此,它抱怨加法中的非数值

    您需要具有给定长度的子字符串,然后要附加三个点。由于运算符的关联性(或粘性),您需要使用括号