将perl中的字符串截断为带有尾随省略号的子字符串
我正在尝试使用perl截断select输入选项中的字符串,如果该字符串长于一个设置值,尽管我无法使其正常工作将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
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的语法非常复杂(另请参见),但归结起来如下:
使用严格;
使用警告;
我的$value='1234567890'x 10;
我的$maxValueLength=50;
如果($value.length>$maxValueLength){
$value=substr$value,0,$maxValueLength+'…';
}
打印$value;
现在让我们看看他们的意思
运算符是一个串联。您不能使用它来调用方法,length
不是字符串上的方法。Perl认为您在使用(函数,而不是方法)时没有参数,这使得它默认为$\ucode>。大多数内置程序都会这样做,以缩短一行程序。但未定义$\uuu
。现在,
尝试将undef
的长度连接到$value
。在字符串操作中使用undef
会导致此警告
正确的方法是length$value
(如果您喜欢,可以使用括号,length$value
)
+
运算符不是串联运算符(我们刚刚了解到
是串联运算符)。这是一个数字加法。Perl非常擅长在字符串和数字之间进行转换,因为实际上没有任何类型,所以说1+“5”
会给您带来6
,没有问题,但对于字符串中的几个点,它无法做到这一点。因此,它抱怨加法中的非数值
您需要具有给定长度的子字符串,然后要附加三个点。由于运算符的关联性(或粘性),您需要为substr
调用使用括号()
$value=substr($value,0,$maxValueLength)。“…”;
您的代码有几个语法错误。启用
使用严格
和使用警告
(如果您没有),然后阅读它告诉您的错误消息。这有点棘手,因为Perl的语法非常复杂(另请参见),但归结起来如下:
使用严格;
使用警告;
我的$value='1234567890'x 10;
我的$maxValueLength=50;
如果($value.length>$maxValueLength){
$value=substr$value,0,$maxValueLength+'…';
}
打印$value;
现在让我们看看他们的意思
运算符是一个串联。您不能使用它来调用方法,length
不是字符串上的方法。Perl认为您在使用(函数,而不是方法)时没有参数,这使得它默认为$\ucode>。大多数内置程序都会这样做,以缩短一行程序。但未定义$\uuu
。现在,
尝试将undef
的长度连接到$value
。在字符串操作中使用undef
会导致此警告
正确的方法是length$value
(如果您喜欢,可以使用括号,length$value
)
+
运算符不是串联运算符(我们刚刚了解到
是串联运算符)。这是一个数字加法。Perl非常擅长在字符串和数字之间进行转换,因为实际上没有任何类型,所以说1+“5”
会给您带来6
,没有问题,但对于字符串中的几个点,它无法做到这一点。因此,它抱怨加法中的非数值
您需要具有给定长度的子字符串,然后要附加三个点。由于运算符的关联性(或粘性),您需要使用括号