2017年1月8日日曜日

Perlの復習

Perlの復習
Perl入学式のサイトを参考にさせてもらいました。

2017/01/15 再開!


メモ

localeをjaにする
$ sudo apt-get install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
Ubuntuだったのでupdate-localeを使ってja_JP.UTF-8に設定する。
LAUNGUAGEとLC_ALLだけunsetだったので、手動で設定
$ export LC_ALL="ja_JP.UTF-8"
$ sudo export LANGUAGE="ja_JP.UTF-8"

perl -v
v5.18.2

nautilus
Ubuntuのファイルマネージャ
Ubuntuのデスクトップは使わないので、縁がない。。。

open
Mac OS XのFinderを開くコマンド

Encodeモジュール
文字列のエンコードを処理するモジュール

Perl5のバージョニング
5.nが偶数=安定版、奇数=開発版

サポート対象
最新版の1つ前の安定板までが基本的にサポート対象

Ubuntuのバージョン確認
lsb_release -r

CPANの読み込みでメモリ不足でuntarできない
$ sudo cpan
cpan[1]> upgrade

Running install for module 'Digest::SHA'
Running make for M/MS/MSHELOR/Digest-SHA-5.96.tar.gz
Fetching with HTTP::Tiny:
http://ftp.neowiz.com/CPAN/authors/id/M/MS/MSHELOR/Digest-SHA-5.96.tar.gz
Fetching with HTTP::Tiny:
http://ftp.neowiz.com/CPAN/authors/id/M/MS/MSHELOR/CHECKSUMS
Checksum for /home/vagrant/.cpan/sources/authors/id/M/MS/MSHELOR/Digest-SHA-5.96.tar.gz ok
Uncompressed /home/vagrant/.cpan/sources/authors/id/M/MS/MSHELOR/Digest-SHA-5.96.tar.gz successfully
Using Tar:/bin/tar xf "Digest-SHA-5.96.tar":
Couldn't untar Digest-SHA-5.96.tar: 'メモリを確保できません'
Package seems to come without Makefile.PL.
  (The test -f "/home/vagrant/.cpan/build/MSHELOR-ENMFP5/Makefile.PL" returned false.)
  Writing one on our own (setting NAME to DigestSHA)
  Had problems unarchiving. Please build manually
Running make test
  Make had some problems, won't test
Running make install
  Make had some problems, won't install

vagrant上のUbuntuへのメモリ割り当ての増加
Vagrantfileのvb.memory = "1024"の行のコメントアウトを外す
$ free
             total       used       free     shared    buffers     cached
Mem:       1017772     236296     781476        988      11732     104264
-/+ buffers/cache:     120300     897472


$  cat /proc/meminfo | grep MemTotal
MemTotal:        1017772 kB
設定する前のメモリ容量を確認し忘れていましたが、
とりあえず解決した。

perldoc モジュール
モジュールのヘルプを見れる

#!/usr/bin/env perlについて考える
自分の環境だと/usr/bin/perlなので、なんで/usr/bin/envなんだったかと調べた。
「env コマンド」で環境変数でコマンドを実行
/usr/local/binや/usr/bin/に固定すると汎用性が下がるからということですね。

use strict;
文法を「厳しく」チェックする

use warnings;
不適切なコーディングに対して警告を出す。

use Data::Dumper;
Dumperモジュールの使用
print Dumper $var;

Ubuntuでのperlアップグレードに手こずる
CPANでのupgaredeに失敗し、最終的にperlbrewというツールでアップグレードできました。
作者に感謝。こちらのサイト(perlbrewで構築するモダンなPerl環境)を参考にさせてもらいました。
$ curl -kL http://install.perlbrew.pl | bash
$ echo "source ~/perl5/perlbrew/etc/bashrc" >>  ~/.bashrc 
$ source ~/.bashrc 
$ perlbrew available # 利用可能バージョンの確認
$ perlbrew install  perl-5.24.0 # 5分ぐらいかかった
システムperlを上書いてしまうみたいです。

Perlの変数
知っているつもりだけど、改めて記載
  1. スカラ変数:$
  2. 配列:@
  3. 連想配列:#
my $hoge;
$hoge = "hoge";
# my $hoge = "hoge";

**
ベキ乗数の計算。左結合 3**4 => 3 * 3 * 3 * 3 => 81

インクリメント
後置も前置もオッケー

STDINのいい感じの処理
my $stdin = &let;STDIN>;
  chomp($stdin);
  @stdin = split(/,/,$stdin);
また、「すぐわかるPerl」深沢千尋さん著には次のいい感じのコードがあった。
while( <STDIN> ) {
  print ;
}
$_が省略されている。$_には最後に評価したものが入るみたいです。

数値と文字列の比較演算子が違う
==(数値), eq(文字列)
逆で覚えていた。。。

数値と文字列を比較した場合
数値の比較演算子(==, >=など)で、数値と文字列を比較した場合、
文字列は数値として扱われる。その文字列の左から数字が続いている範囲の数値とする。
'1234五'などの場合、1234として扱われる。左側に数字がなければ('一2345'など)、ゼロとして扱われる。
「−1234 + 5 = 5」となります(※−は「マイナス」を変換した記号で、文字のため、−1234がゼロと認識されてしまう)
また、実行時に警告が出ます。
(Argument "hoge" isn't numeric in addition (+) at calc3.pl line 10, line 2.)

一方、文字列の比較演算子で、数値と文字列を比較した場合は、
警告も出ず、数値を文字列に自動変換して比較できます。

Perlの偽値
  • undef
  • 空のリスト
  • 数値のゼロ
  • 文字列の0と""(空文字)

Perlの真値
Perlの偽値「以外」

elsif
elsifなんです。switchないそうです。
調べてみると、5.18からgivenという構文が使えるそうですね。
参考:[[Switch]] メモとかメモのようなものとか(By ルーキーの中のひと)
ただ、今の所givenはexperimental(試験中)扱いで使用時に警告が出ます。

say関数
最後に改行をつけて標準出力する関数。
use feature ':5.18';のようにfeatureプラグマをつけないと使用できない。

chomp()
端のスペースを除く。
値を返すのかと思っていて、$var = chomp();と間違った使い方をしてた。

and, &&, or, ||
全て短絡評価する。違いは優先順位。&&,||は、and, orより優先度が高い。
代入や分岐構文として使うときに注意

評価式の左項に、変化する値を、右項に(変化することが少ない)評価基準を置く
リーダブルコードに載っていて知っていたけど、逆で書き出した自分がいました。

@
arrayのa

配列の要素を取得したらスカラー変数です
一意に決まるので。

my @nums = ( 1, 2, 3 );
配列の初期化。各要素は文字列と数値を混ぜてオッケー。 配列を入れてもオッケー。

my @nums = ( 1..3);
範囲演算子..により簡潔に書けます。
小さい方から左に書く。逆に書くと要素は空になる。

for my $num ( @nums )
foreachがあっさり書ける。

my @nums = qw(1 2 3 4 5);
空白文字で区切り、配列に格納する
デリミッター(区切り文字)は、他の記号文字に変更可能。
qw@1 2 3 4 5@も有効
区切り文字を変えることで、qw内の途中にカッコが含まれていても問題なくなる。
もしくはエスケープすることで、不本意な区切りを回避できる。

split($str, $target);
$strで$targetを区切った配列を返す。

join($str, @array)
@arrayを$strで連結させた文字列を返す

シジル(sigil)
変数の前につく記号のこと

sort
文字列ソート:sortのみ, あるいはsort { $a cmp $b } @array
数値ソート :sort { $a <=> $b } @array
※ $a, $bはsortのために予約されているので、「他の部分で使ってはいけない」

=>
ファットコンマ演算子、というらしい

$hash{name}
ハッシュの値の取り出し、nameキーの値を取り出す。

my %hash = ('key1', 'value1', 'kye2', value2);
key, value,...と言うように配列と同じように仮想配列を初期化することもできる

ダックタイピング
weblio辞書
あるインターフェースの実装を宣言していなくても、そのインターフェスのメソッドを
全て実装しているクラスは、そのインターフェスを実装しているとみなす。

リファレンス
変数の参照のこと
スカラー変数に格納する。
既存の変数、配列、連想配列の前に\(バックスラッシュ)をつけることで、リファレンスを作成できる

["a", "r", "r", "a", "y"]
配列の実体を作らずに連想配列のリファレンスだけ作る方法
無名配列とも言う。

{ key => value};
連想配列の実体を作らずに、連想配列のリファレンスだけ作る方法
無名ハッシュとも言う。

配列リファレンスを、配列として使う
@array = ("hoge", "fuga" );
$array_ref = \@array;
print ${$array_ref}[0]; # hoge
{$array_ref}で配列して扱うことができるようになる
print $arra_ref->[0] # hoge
ともかける

要素数の取得
@array, %hashでもコンテキストによっては要素数を取得できる
scalar @arrayで確実
$#arrayで最後の添え字を取得

grep { /regex/ } @array;
パターンマッチしたものを配列で返す

ハッシュのforeach
foreach my $key(keys(%array)){

デリファレンス
戻すデータ構造に対応するシジルを付与する
$$ref
@$ref
%$ref

ハッシュへの追加
$hash{key} = value;
配列と混同してしまし、pushしている自分がいました。。。

ハッシュの値のソート
foreach my $key (sort { $ranks{$b} <=> $ranks{$a} } keys %ranks){

0 件のコメント:

コメントを投稿