【perl】pop関数とdefined関数〜配列の一番最後の要素を取り出す・変数が未定義かどうか調べる

#! /usr/bin/perl

use strict;
use warnings;

my @array = qw(45 777 111 222 333);
my $array = @array;

print "@array\n";          #出力結果 => 45 777 111 222 333 =>@arrayの要素を出力。
print "$array\n";          #出力結果 => 5 =>@arrayの要素数を出力。
print "$array[$#array]\n"; #出力結果 => 333 =>@arrayの一番最後の要素を出力。
print "$#array\n";         #出力結果 => 4 =>@arrayの一番最後の添え字を出力。

print "\n";


#◎pop関数を用いて、配列の一番最後の要素を取り出しましょう。
my $item = pop(@array);
$array = @array;

print "$item\n";           #出力結果 => 333 =>@arrayの一番最後の要素を取り出して出力。
print "@array\n";          #出力結果 => 45 777 111 222 =>@arrayの要素を出力。333が取り除かれている。
print "$array\n";          #出力結果 => 4 =>@arrayの要素数を出力。
print "$array[$#array]\n"; #出力結果 => 222 =>@arrayの一番最後の要素を出力。
print "$#array\n";         #出力結果 => 3 =>@arrayの一番最後の添え字を出力。

print "\n";

#◎pop関数で配列の要素を全部取り出すとどうなるの?
$item = pop(@array);
print "$item\n";#出力結果 => 222

$item = pop(@array);
print "$item\n";#出力結果 => 111

$item = pop(@array);
print "$item\n";#出力結果 => 777

$item = pop(@array);
print "$item\n";#出力結果 => 45

$item = pop(@array);
print "$item\n";#出力結果 => エラー

print "\n";

#◎defined関数で、本当に配列が未定義(undef)になったのか確認してみよう。
if (defined($item)){
	print "$item\n";
}else{
	print "undef\n";
}
#出力結果 => undef =>配列arrayはホントに未定義になっちゃった。


=head
#◎空の配列にpop関数を使うとどうなるの?
my @array2 =();
my $item1 = pop(@array2);

print $item1; #$item1が初期化されていないと警告される。
=cut

まとめは以下。

(1)pop(@要素を削り取りたい配列名)
例)my $item = pop(@array);
→@arrayの一番最後の要素を削り取って$itemに代入。@arrayには、削り取られた要素以外が残っている。

(2)defined(EXPR)
EXPRを未定義か定義済みかを判定する。
・定義済みのとき→「真」を返す
・未定義のとき→→「偽」を返す

※未定義とは…変数が文字も数値も持たないNULLのとき

cf)if文やwhile文
未定義と空文字、0の区別をつけずに、「偽」として返す。
→「未定義・定義済み」と「空文字・0」を区別したいときにdefinedを使う。