usr/bin/perl

sub uri_decode{
my $str = shift;
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
return $str;
}

このpack('H2', $1)の意味がわかりません。教えてください。
検索してみたんですが'H'が意味する「ニブル」ってどういうものですか?
'$1'ってところも記述ミスな気がするんですが