如何从数组中删除最后一个字符?

时间:2013-05-03 13:13:12

标签: perl chop

有没有办法从数组中删除最后一个字符?

为了清楚起见,我并没有要求数组中的每个条目都删除了它的最后一个字符,只有最后一个进入数组的条目才能删除它的最后一个字符。

我看过chop / chomp / push / pop等,但很多都与从字符串中删除值有关。

任何帮助都会很棒

由于

2 个答案:

答案 0 :(得分:9)

chop是正确的工具,但需要一系列参数。如果你传递一个数组,所有元素都将被切断。相反,只需使用索引-1。这总是给你最后一个元素。

my @foo = qw(foo bar baz);
chop $foo[-1];
print Dumper \@foo;

# ['foo', 'bar', 'ba']

来自doc

  

如果你砍一个清单,每个元素都会被砍掉。只返回最后一个印章的值。

答案 1 :(得分:2)

poppush命令添加或删除数组上的最后一个条目。这些(及其合作伙伴unshiftshift)不会对个别角色采取行动。

chomp命令仅删除\n。它是在Perl 4.0中添加的,用于替换chop命令,作为从文件中读取一行时删除\n字符的标准方法。这是因为chomp如果最后一个字符不是\n,则不会删除任何字符。这意味着,即使您不确定最终是否有chomp,您也可以安全地\n字符串。

chop命令完全符合您的要求。无论该角色是什么,它都会移除最后一个角色。在早期版本的Perl中,您可能需要检查chop返回的内容以确保它是\n个字符。这就是你想要的。

您遇到的问题是chompchop不仅会在标量上下文中运行,还会在阵列和哈希上下文中运行。在散列和数组上下文中,它们处理所有标量数据(但不是散列中的键)。毕竟,如果我读完整个文件,这就是我想要的:

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 ];