>>897
分解して考えませう。まず (1) の pack("H2", $1) の理解のため、ためしに pack("H2", "2A") を実行してみれ。
つまり次のコードだ。
print pack("H2", "2A"), "\n";
すると画面には "*" が表示されるね。すなわち上の pack は、'*' という文字のキャラクタコード 0x2a を返したことになる。

この例で、pack の第 2 引数に与えた "2A" というバイト列を、
「上位ニブル-下位ニブルの順に並んだ16 進 2 桁とみなせ」という意味なのが型指定子 "H2"。
pack はそうやって解釈してできた数値を返す。
(正確には本来、数値のリストを返すんだが、この例では型指定子 "H2" が 0x00〜0xff までの数値 1 個しか作り出せないので、'*' 一文字だけが出力された。)

なお "H2" にはこのように 2 文字分の解釈しかしないので、たとえば
print pack("H2", "2Al"), "\n";
だと、末尾の 'l' は単に無視される。サイトがまちがってるにしても、結果は'ミケネコ'。

あとは自力でがんばれ。超がんばれ。