左辺値のリスト

左辺値にリストがある場合、右辺値のリストの要素の一部が切り捨てられたり、左辺値に未定義値が入ったり、様々である・・・。

左辺値が配列要素のリストの時、いくつかのパターンでどうなるか見てみる。
どころどころ、配列の初期化がめんどいので、新しい配列にしていたりする。

$ vi list.pl
$ perl list.pl
$x[0] = 1
$x[1] = 2
$x[0] = 1
$x[1] = 2
$x[2] = undef
$y[0] = 1
$y[1] = undef
$y[2] = 2
$a[0] = 1
$a[1] = 2
$y[0] = 3
$y[1] = 4
$y[2] = 5
$

こうなる・・・。

Sample/perl/list/lvalue/src/list at master · bg1bgst333/Sample · GitHub

範囲演算子

リストやfor文などで、範囲演算子を使うと、インクリメントを簡単に表現できる。

perlop - Perl の演算子と優先順位 - perldoc.jp
The Perl5 Manual - 範囲演算子

変数リストは1から3、配列は途中が3から5、for文も1から3を範囲演算子で表している。

$ vi range_operator.pl
$ perl range_operator.pl
$a = 1
$b = 2
$c = 3
$var = 1
$var = 3
$var = 4
$var = 5
$var = 7
1
2
3
$

こうなる。

Sample/perl/range_operator/range_operator/src/range_operator at master · bg1bgst333/Sample · GitHub

xmlNewTextReaderFilename

いろんなところで使われているlibxmlについて扱う。

The XML C parser and toolkit of Gnome

なぜlibxml"2"なのか・・・。

http://www.fifi.org/doc/libxml1/README

まあ、現在はlibxml2となっているのでしょうがない・・・。

Module xmlreader from libxml2

今回は、xmlNewTextReaderFilenameでXMLファイルを読み込んでリーダを生成する。
まずはインストール。

$ sudo yum install libxml2-devel
[sudo] bg1 のパスワード:
メタデータの期限切れの最終確認: 0:07:13 時間前の xxxx年xx月xx日 xx時xx分xx秒 に実施しました。
依存関係が解決しました。
================================================================================
 パッケージ             アーキテクチャー
                                      バージョン           リポジトリ     サイズ
================================================================================
インストール:
 libxml2-devel          x86_64        2.9.8-5.fc29         updates        1.0 M
アップグレード:
 libxml2                x86_64        2.9.8-5.fc29         updates        647 k
 python3-libxml2        x86_64        2.9.8-5.fc29         updates        223 k
依存関係をインストール中:
 xz-devel               x86_64        5.2.4-3.fc29         fedora          56 k

トランザクションの概要
================================================================================
インストール    2 パッケージ
アップグレード  2 パッケージ

ダウンロードサイズの合計: 1.9 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード中です:
(1/4): xz-devel-5.2.4-3.fc29.x86_64.rpm          25 kB/s |  56 kB     00:02
(2/4): libxml2-2.9.8-5.fc29.x86_64.rpm          279 kB/s | 647 kB     00:02
(3/4): libxml2-devel-2.9.8-5.fc29.x86_64.rpm    363 kB/s | 1.0 MB     00:02
(4/4): python3-libxml2-2.9.8-5.fc29.x86_64.rpm  315 kB/s | 223 kB     00:00
--------------------------------------------------------------------------------
合計                                            343 kB/s | 1.9 MB     00:05
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                        1/1
Upgrade: libxml2-2.9.8-5.fc29.x86_64
  アップグレード中 : libxml2-2.9.8-5.fc29.x86_64                            1/6
Upgrade: libxml2-2.9.8-5.fc29.x86_64
Installed: xz-devel-5.2.4-3.fc29.x86_64
  インストール中   : xz-devel-5.2.4-3.fc29.x86_64                           2/6
Installed: xz-devel-5.2.4-3.fc29.x86_64
Installed: libxml2-devel-2.9.8-5.fc29.x86_64
  インストール中   : libxml2-devel-2.9.8-5.fc29.x86_64                      3/6
Installed: libxml2-devel-2.9.8-5.fc29.x86_64
Upgrade: python3-libxml2-2.9.8-5.fc29.x86_64
  アップグレード中 : python3-libxml2-2.9.8-5.fc29.x86_64                    4/6
Upgrade: python3-libxml2-2.9.8-5.fc29.x86_64
Upgraded: python3-libxml2-2.9.8-4.fc29.x86_64
  整理             : python3-libxml2-2.9.8-4.fc29.x86_64                    5/6
Upgraded: python3-libxml2-2.9.8-4.fc29.x86_64
Upgraded: libxml2-2.9.8-4.fc29.x86_64
  整理             : libxml2-2.9.8-4.fc29.x86_64                            6/6
Upgraded: libxml2-2.9.8-4.fc29.x86_64
  scriptletの実行中: libxml2-2.9.8-4.fc29.x86_64                            6/6
  検証             : libxml2-devel-2.9.8-5.fc29.x86_64                      1/6
  検証             : xz-devel-5.2.4-3.fc29.x86_64                           2/6
  検証             : libxml2-2.9.8-5.fc29.x86_64                            3/6
  検証             : libxml2-2.9.8-4.fc29.x86_64                            4/6
  検証             : python3-libxml2-2.9.8-5.fc29.x86_64                    5/6
  検証             : python3-libxml2-2.9.8-4.fc29.x86_64                    6/6

アップグレード済み:
  libxml2-2.9.8-5.fc29.x86_64        python3-libxml2-2.9.8-5.fc29.x86_64

インストール済み:
  libxml2-devel-2.9.8-5.fc29.x86_64         xz-devel-5.2.4-3.fc29.x86_64

完了しました!
$

test.xmlを作成する。

<?xml version="1.0" encoding="UTF-8"?>
<top>
  <listitem>
    <itemname>
      First
    </itemname>
    <itemnumber>
      10
    </itemnumber>
  </listitem>
  <listitem>
    <itemname>
      Second
    </itemname>
    <itemnumber>
      20
    </itemnumber>
  </listitem>
</top>

こんな感じ・・・。

main.cで、

読み込めたらポインタが返ってくるのでそれを出力。

$ ls
main  main.c  test.xml
$ cat test.xml
<?xml version="1.0" encoding="UTF-8"?>
<top>
  <listitem>
    <itemname>
      First
    </itemname>
    <itemnumber>
      10
    </itemnumber>
  </listitem>
  <listitem>
    <itemname>
      Second
    </itemname>
    <itemnumber>
      20
    </itemnumber>
  </listitem>
</top>
$ gcc main.c -o main -I/usr/include/libxml2 -lxml2
$ ./main
reader = 0x00cac980
$

読み込みは出来たみたい。

Sample/libxml/xmlNewTextReaderFilename/xmlNewTextReaderFilename/src/xmlNewTextReaderFilename at master · bg1bgst333/Sample · GitHub

jpeg_start_decompress

超久しぶりにlibjpeg・・・。
ずっとやれなかった逆変換(Jpeg to Bitmap)をやる・・・。

$ ls
bitmap.c  bitmap.h  license.txt  test.jpg
$

前回のコンポーネントを使いつつ、main.cは、

ポイントは、ビットピクセルを後ろから入れていかないといけないところと、ワード境界のロジックかな・・・。
ちょっと酷いので、今後改善しないと。

http://refspecs.linuxbase.org/LSB_3.1.0/LSB-Desktop-generic/LSB-Desktop-generic/libjpeg.jpeg.start.decompress.1.html

jpeg_start_decompressで、JpegからBitmapに逆変換。

$ vi main.c
$ ls
bitmap.c  bitmap.h  license.txt  main  main.c  test.jpg
$ gcc -o main main.c bitmap.c -ljpeg
$ ./main
$ ls
bitmap.c  bitmap.h  license.txt  main  main.c  test.bmp  test.jpg
$

test.jpgからtest.bmpを生成。

test.jpgからtest.bmpの生成
test.jpgからtest.bmpの生成

ビットマップ画像が出来てる。
色がおかしくなったり、上下反転したり、SEGVしたりいろいろあったけど・・・。

とりあえず大丈夫かな
とりあえず大丈夫かな

とはいえ、サイズによってはちゃんと動くかは怪しい・・・。

Sample/libjpeg/jpeg_start_decompress/jpeg_start_decompress/src/jpeg_start_decompress at master · bg1bgst333/Sample · GitHub

配列のコピー

@で始まる配列オブジェクトに、@で始まる配列オブジェクトを代入するだけでコピーできる。

配列をコピーする - Perl - とあるエンジニアの闇歴史帳

参照渡しではなく、値渡しなので、まるごとコピー。
そうなっているかチェックするために、コピー後に$ary1[0]と$ary2[2]の値を変更して影響が出ないかどうかをみている。

$ perl array.pl
10
20
30
10
20
30
40
20
30
10
20
50
$

変更したからもう一方に影響されることはなかった。
ちゃんとコピーになっている。

Sample/perl/array/copy/src/array at master · bg1bgst333/Sample · GitHub

配列の最後の要素番号

配列名の頭に"$#"とすることで、配列の最後の要素番号を取得できる。

配列の最後のインデックス - リストと配列 - Perl入門

@aryの最後の要素番号を取得。
それに+1を足すと要素数なのでそれと、本来の配列の要素数(@aryの値)とも比較。

$ perl array.pl
4
5
5
$

最後の要素番号は4、1足して要素数は5。
('.'の前後に空白入れないとエラーになるので注意。)

Sample/perl/array/last_index/src/array at master · bg1bgst333/Sample · GitHub

負の値の添字

Perlは、負の値の添字を使うことができる。

[Perl] 配列の処理 その1 - 開発の覚書

どこまで負の値が使えるか、どういう挙動になるか、試した。

$ perl array.pl
ABC
JKL
GHI
DEF
ABC

JKL

$

負の値-1で配列の最後の要素を指し、そこから前の要素に戻っていく。ただし、-5は2周目になるかとおもいきや、ここは要素無し。
ちなみに、正の値だと要素の範囲を超える4で、要素無しという一貫性のない結果となった。

Sample/perl/array/negative_index/src/array at master · bg1bgst333/Sample · GitHub