1

Is there a way of removing the very last character from an array?

Just to be clear, I am not asking for every entry in the array to have its last character removed, only the very last entry into the array should have its last character deleted.

I have looked at chop/chomp/push/pop etc but alot is related to removing values from strings.

4

2 に答える 2

9

chopは適切なツールですが、パラメーターのリストが必要です。配列を渡すと、すべての要素が切り刻まれます。代わりに、単に index を使用して-1ください。これにより、常に最後の要素が得られます。

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

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

ドキュメントから:

リストをチョップすると、各要素がチョップされます。最後のチョップの値のみが返されます。

于 2013-05-03T13:17:17.723 に答える
2

popおよびコマンドはpush、アレイの最後のエントリ全体を追加または削除します。これら (およびそのパートナー、unshiftおよびshift) は、個々のキャラクターには作用しません。

このchompコマンドは のみを削除し\nます。ファイルから行を読み取るときに文字chopを削除する標準的な手段としてコマンドを置き換えるために、Perl 4.0 で追加されました。\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 が必要だと考えていることを実行しています。つまり、配列の最後のエントリから最後の文字だけを削除します。

あなたがしたいことは、その配列の最後のエントリだけを指定し、それをむさぼり食うことです。これを行うには、次の 2 つの方法があります。

$my_array[ $#my_array ];
$my_array[ -1 ];

$#my_array1 つ目は、配列内の最後のエントリのインデックスと等しいという事実を使用します。2 つ目は、負のエントリが配列の末尾を反映する 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 ];
于 2013-05-03T14:40:04.013 に答える