昔の掲示板を設置するMojolicousからCGIを呼ぶ他者のPerlを書き替える他者のPerlを書き替える~2~全ページに告知お手軽XML操作2018-10-06背景サイクリングでGPSロガーが記録した走行記録をgpxとして入手できる。これをプログラムで加工してからGoogleマップにインポートしたい。gpxはXML形式なのでPerlで操作しよう。ライブラリXML::TreePPを使います。metacpan.orgこれで入力の際は1行目のxmlタグを除く行をハッシュリファレンスにするし、出力の際は自動でxmlタグでラップします。$tpp->parsefile($query->tmpFileName($gpx_fh));1行目でTreePPオブジェクトを作る際にテキストにutf8フラグを追加して、gpx内の日本語テキストを適切に扱えるようにします。2行目でCGIにアップロードしたファイルをTreePPが読み込んでハッシュリファレンスにします。不要なタグを削除gpxファイルはタグtrkptが連続していて、不要なタグを削除する処理です。TreePPの読み込みは【デフォルトの設定では】、あるタグが1個だけの場合、ハッシュの値にそのタグのリファレンスが入ります。同じタグが複数ある場合は代わりに配列のリファレンスが入り、配列の要素にタグのリファレンスが入ります。タグの属性名もキーに入っていますが、属性名に「-」を前置してあるので下位のタグと区別できます。配列をforループで回す中で要素を削除すると面倒なので、削除判定したタグにremove属性を付けておき、改めてループを回して削除します。この辺り、任意のフラグや設定を追加できるのがハッシュリファレンスの便利な点です。}}タグの分割、複製Googleマップはタグtrkptが400個を超えると節点を編集できなくなるのでtrkptを400個ずつ分割し、タグtrkを複数にします。タグの階層はtrk→trkseg→trkptです。trkにタグnameがあり、これに名称があるので2個目以降にもコピーします。前述の通り、同じタグが複数並ぶ場合は配列のリファレンスを入れてタグのリファレンスを要素に入れます。trkの末尾と次のtrkの先頭が同じ場所になるようtrkptをラップさせています。元のtrkが持つ別のタグは要がないので無視します。}}書き出しファイルの名前とハッシュリファレンスを渡せば書き出せます。mojolicious。