Perlの復習
Perl入学式のサイトを参考にさせてもらいました。
2017/01/15 再開!
メモ
- localeをjaにする
-
$ sudo apt-get install language-pack-ja $ sudo update-locale LANG=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の変数
-
知っているつもりだけど、改めて記載
- スカラ変数:$
- 配列:@
- 連想配列:#
$hoge = "hoge";
# my $hoge = "hoge"; - **
- ベキ乗数の計算。左結合 3**4 => 3 * 3 * 3 * 3 => 81
- インクリメント
- 後置も前置もオッケー
- STDINのいい感じの処理
-
また、「すぐわかるPerl」深沢千尋さん著には次のいい感じのコードがあった。my $stdin = &let;STDIN>; chomp($stdin); @stdin = split(/,/,$stdin);
$_が省略されている。$_には最後に評価したものが入るみたいです。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 件のコメント:
コメントを投稿