有没有办法从数组中删除最后一个字符?
为了清楚起见,我并没有要求数组中的每个条目都删除了它的最后一个字符,只有最后一个进入数组的条目才能删除它的最后一个字符。
我看过chop / chomp / push / pop等,但很多都与从字符串中删除值有关。
任何帮助都会很棒
由于
答案 0 :(得分:9)
chop
是正确的工具,但需要一系列参数。如果你传递一个数组,所有元素都将被切断。相反,只需使用索引-1
。这总是给你最后一个元素。
my @foo = qw(foo bar baz);
chop $foo[-1];
print Dumper \@foo;
# ['foo', 'bar', 'ba']
来自doc:
如果你砍一个清单,每个元素都会被砍掉。只返回最后一个印章的值。
答案 1 :(得分:2)
pop
和push
命令添加或删除数组上的最后一个条目。这些(及其合作伙伴unshift
和shift
)不会对个别角色采取行动。
chomp
命令仅删除\n
。它是在Perl 4.0中添加的,用于替换chop
命令,作为从文件中读取一行时删除\n
字符的标准方法。这是因为chomp
如果最后一个字符不是\n
,则不会删除任何字符。这意味着,即使您不确定最终是否有chomp
,您也可以安全地\n
字符串。
chop
命令完全符合您的要求。无论该角色是什么,它都会移除最后一个角色。在早期版本的Perl中,您可能需要检查chop
返回的内容以确保它是\n
个字符。这就是你想要的。
您遇到的问题是chomp
和chop
不仅会在标量上下文中运行,还会在阵列和哈希上下文中运行。在散列和数组上下文中,它们处理所有标量数据(但不是散列中的键)。毕竟,如果我读完整个文件,这就是我想要的:
my @file_data = <$file_fh>; #Reads in the entire file into an array
chomp @file_data; #Removes all `\n` in one fell swoop
所以,当你这样做时:
chop @my_array;
它正在做Perl认为你想要的而不是你真正想要的东西 - 只删除数组中最后一个条目的最后一个字符。
你想要做的只是指定该数组中的最后一个条目,然后选择它。有两种方法可以做到这一点:
$my_array[ $#my_array ];
$my_array[ -1 ];
第一个使用$#my_array
等于数组中最后一个条目的索引的事实。第二个采用Perl快捷方式,其中负数条目反映数组的结尾:
$my_array[-1]; #Last entry of the array
$my_array[-2]; #Second to the last entry
您将在Perl脚本中看到两种方式。现在,您可以在数组的最后一个条目上使用chop
:
chop $my_array[-1];
chop $my_array[ $#my_array ];