I ♥ WordPress

[時間割:Perl]『ミニマルPerl』その3
2008/09/16 23:53 posted by kunkichi

月曜日は「Perl」です。今日はこれまで出てきた起動オプションをプログラムのタイプ別にまとめるところから。そのまま写しちゃうのはアレなので多少いじってみました。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 204732
一次オプションクラスタ 用途
-wl 出力 -wで警告表示はお決まりな感じ。-lで行末処理。
# perl -wl -e 'print "Hello, World."'
Hello, World.
#
-wnl 入出力 -nで入力処理のフィルタ。
# echo "Hello,World." | ¥
> perl -wnl -e 's/World/Dolly/g;print;'
Hello,Dolly.
#
-wnla フィールド処理(セパレータは空白文字) -aで空白をセパレータとしたフィールド処理を指定。
# echo "1 2 3" | ¥
> perl -wnla -e 'print $F[2];'
3
個々のフィールドは@Fに入る
-wnlaF’セパレータ文字列 フィールド処理(セパレータは任意文字) -aでフィールド処理を指定、そして-Fでセパレータ文字列を指定。awkっぽい。
# echo "1,2,3" | ¥
> perl -wnlaF',' -e 'print $F[2];'
3
レコード定義クラスタ 用途
-00 段落モード 段落ごとに番号をつけてみる。# cat sample.txt
This is paragraph1.
 
This is paragraph2.
 
This is paragraph3.
# perl -wnl -00 -e 'print "$.: $_";' sample.txt
1: This is paragraph1.
2: This is paragraph2.
3: This is paragraph3.
slapcatしたデータとかこれで処理すればよさげ。
-0777 ファイルモード ファイルごとに番号をつけてみる。# cat sample2.txt
This is paragraph4.
 
This is paragraph5.
 
This is paragraph6.
# perl -wnl -0777 -e 'print "$.: $_";' ¥
> sample.txt sample2.txt
1: This is paragraph1.
 
This is paragraph2.
 
This is paragraph3.
 
2: This is paragraph4.
 
This is paragraph5.
 
This is paragraph6.
 
スイッチクラスタ 用途
-s スイッチで引数による変数処理を追加 例えば-flagで変数$flagを有効化してみる# cat sample.pl
#!/usr/bin/perl -wl -s
 
our( $flag );
 
if( $flag ){
  print "フラグが有効化されました。";
}else{
  print "フラグは無効のままです。";
}
実行すると以下。# ./sample.pl
フラグは無効のままです。
# ./sample.pl -flag
フラグが有効化されました。
モジュールクラスタ 用途
-M’モジュール名 モジュールを有効化する。 モジュールがインストールされているかの確認に使える。# Perl -M'Net::SMTP' -e ''
#
何も出力されなければモジュールはインストールされている。エラーが出力されたら印すt−ルされていない。
プログラムクラスタ 用途
-e ‘実行するPerlのコード コマンドラインから実行したいコードを書く。

上書き編集クラスタってのもあるのだけど、これはまだ出てきていないのでスルー。

でこれらをあらかじめエイリアスとして指定しておけばちょっと便利かも。
# cat .bashrc
alias perl_o='    perl -wl           ' # 出力
alias perl_io='   perl -wnl         ' # 入出力フィルタ
alias perl_iop=' perl -wpl         ' # 入出力フィルタでprintを使う
alias perl_f='     perl -wnla       ' # フィールド処理
alias perl_fp='   perl -wpla       ' # フィールド処理でprintを使う
alias Perl_o='    perl -00 -wl     ' # 段落モードで出力
alias Perl_io='   perl -00 -wnl   ' # 段落モードで入出力フィルタ
alias Perl_iop=' perl -00 -wpl   ' # 段落モードで入出力フィルタでprintを使う
alias Perl_f='     perl -00 -wnla ' # 段落モードでフィールド処理
alias Perl_fp='   perl -00 -wpla ' # 段落モードでフィールド処理でprintを使う

でもスクリプトではこうは行かないのである程度は覚えないと行けない、ということで順序。

ワンライナーの場合

# perl [スイッチクラスタ] [レコード定義クラスタ] [一次オプションクラスタ] [プログラムクラスタ]

スクリプトの場合

#!/usr/bin/perl [スイッチクラスタ] [レコード定義クラスタ] [一次オプションクラスタ]
〜以下コード〜

基本は一次オプションクラスタがあって、それにいろいろ追加した上で、コード部分を書くって言う流れになると。

こういうオプションを駆使した使い方はあんまりやったことなかったのだけど、僕の日常の作業だとオプションを指定せずに(-wTぐらいはつけます)ベタなスクリプトを書くよりも、こっちのほうが活躍する機会は多いかも。そのうちちょっと試してみよう。

[時間割:Python]『みんなのPython』その5
2008/09/14 21:59 posted by kunkichi

木曜日の『Python』の勉強結果をアップしてなかったので。ファイル処理から。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


ファイル処理

  • openとかcloseとかほとんど他言語と変わらない。
  • ファイルオブジェクト。ファイルハンドルみたいなのと同じ。
  • ファイルオブジェクトに対してメソッドを使っていろいろ処理。
  • 1行づつ処理するには readlines()メソッドが便利。
    f = open("aaa","r")
    for i in f.readlines():
      i
  • ファイルオブジェクト自体をfor の対象にすることもできる。
    f = open("aaa","r")
    for i in f:
      i
  • 全部読み込む場合はread()メソッド、1行だけ読み込む場合はreadline()メソッドもあり。
  • 書き込みの場合はwrite()メソッド、シーケンスとかの場合はwritelines()メソッドもあり。
    f = open("aaa","r")
    f2 = open("bbb","w")
    for i in f.readlines():
       f2.write(i)
    f.close()
    f2.close()

スクリプトファイル

  • 拡張子は「.py」
  • SHEBANG。”#!/usr/bin/env python”とか。
  • pythonでは、関数とかは最初に宣言してmainをあとに書く感じなのね。シェルスクリプトっぽい。
  • ファイルを直接実行した時のみ実行、みたいな特殊なブロックもあり。
    if __name__ == '__main__':
      〜コード〜
  • コマンドライン引数には、sysモジュールを使うと、sys.argvに文字列のリストとして登録される。
    #/usr/bin/env python
     
    import sys
     
    print sys.argv
    # ./aaa.py aaa bbb
    ['./aaa.py', 'aaa', 'bbb']

ちょっとしたツールとして使うために必要な情報が揃ってきた感じです。

[時間割:C言語]『はじめてのC言語完全入門』その4
2008/09/10 01:30 posted by kunkichi

火曜日は『C言語』です。張り切っていってみよう!

今日は11章「変数と定数」から。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 420963


  • Cでは変数の宣言が必要。
    ex) int a とか int a = 1。後者は初期化も一括。
  • sizeof で変数やデータ型のメモリ上のサイズを調べることができる。
  • 定数の場合はconstで宣言する。ちなみに定数は大文字で定義することが一般的
    ex) const int A = 1
  • 列挙型。複数の定数をまとめて宣言。これちょっと今までなかったタイプの型だな。
    enum { a, b, c }
  • 列挙された定数=列挙定数は自動的に0,1,2…と値が割り当てられる
  • 値を指定することもできる。
    ex) enum { a, b=4, c }
    この場合、a、b、cはそれぞれ0、4、5となる。つまり、指定した場合でもその次の値は+1。
  • 列挙に名前を付けることができる。ex) enum DAY { MONDAY, TUESDAY, WEDNESDAY, … }
    これをさらに変数宣言で使用できる。
    ex) enum DAY w;
    でこれに列挙された定数を代入できる。
    ex) w = MONDAY; ・・・上の例だと結局のところ0になる。
  • タグの指定と変数宣言は一括で書ける
    ex) enum DAY { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } var;
  • 型自体を作る感じと言った方がわかりやすいかも。

列挙型ってちょっと使いどころがピンとこなかったのだけど、いろいろ調べてみたところ、以下のサイトでなんとなく雰囲気はつかめた感じ。

ポイントをまとめると、

  • enum を用いると、 複数の数字に一意な「名前」を 付ける事が出来る。つまり、「名前」で判断すればよいということ。
  • フラグをたてるような場合に、フラグ名と値の関連を考えずにフラグ名だけで考えれるので便利。defineとかだとそれを意識しないといけない
  • switch文とか特に便利。
  • 配列とそろえると連想配列的な使い方も可能。
  • 値は整数のみ
  • 基本的な手順は以下。
    1. 列挙型の定義・・・タグを使ってenum型を定義する
    2. 変数宣言・・・定義された列挙タグを使って変数として定義
    3. 変数を使う・・・変数に列挙定数を代入したり。

簡単なスクリプトを試しに作ってみた。
#include <stdio.h>
 
enum weekday { MONDAY,
               TUESDAY,
               WEDNESDAY,
               THURSDAY,
               FRIDAY,
               SATURDAY,
               SUNDAY } w;
 
main()
{
  w = WEDNESDAY;
 
  switch(w){
  case MONDAY:
       printf("月曜日です。\n");
       break;
  case TUESDAY:
       printf("火曜日です。\n");
       break;
  case WEDNESDAY:
       printf("水曜日です。\n");
       break;
  case THURSDAY:
       printf("木曜日です。\n");
       break;
  case FRIDAY:
       printf("金曜日です。\n");
       break;
  case SATURDAY:
       printf("土曜日です。\n");
       break;
  case SUNDAY:
       printf("日曜日です。\n");
       break;
  }
  
  return 0;
}

内部的には整数だけど確かにこれだと値は意識しなくていいね。

[時間割:Perl]『ミニマルPerl』その2
2008/09/08 22:50 posted by kunkichi

月曜日は「Perl」です。今日はdieとwarnについて。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 204732
  • warnでSTDERRへの出力が可能。print STDERR “〜”と同じ。
  • dieはデフォルトで255を返す。
  • dieやwarnの出力内容に”¥n”をつけると、エラー情報(発生した行番号とかスクリプト名とか)が抑止される。
  • and/orを使った論理演算子は、if/then、if/elseを簡潔に書ける。
  • andはorよりも優先される点に注意。必要な場合はカッコをつける。
    ex) A or B and C ⇒ A or ( B and C)
    なので、AとBの結果、Cを実行したい場合は、
    ex) ( A or B ) and C
  • 逆にAの結果、BとCを実施するようなケースをwarnとexitでうまく使う。
    ex) A or warn “〜” and exit 255;
  • PerlでもawkみたいなBEGIN、ENDが使える!
  • BEGINは初期化とかチェックとかで使える。例えば、とあるスイッチが指定されている場合はBEGINブロックの中で特別な処理を含めた初期化を行い、ENDでサマリ的な内容を出力するとか。
  • $,で配列を出力する場合のセパレータというか文字列を指定可能。デフォルトは”"。配列を”"で括るとスペースになる。”"で括った場合のデフォルト値も$”で指定可能。

やっぱりPerlは特殊変数多いなぁ、こんなの使ったことないや。この辺はチートシート作っておくと便利かも。

次は、ここまで出てきた起動オプションをいろいろなプログラムのタイプ向けにパターン化・標準化したオプションクラスタの予定。

[時間割:Python]『みんなのPython』その4
2008/09/05 00:56 posted by kunkichi

木曜日は『Python』です。ループの続きから。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


ループの続き

  • breakとかcontinueとかおなじ。
  • シーケンスは何でもforで使える。リストやら文字列やら。
  • 辞書とかの組み込み型メソッドにはシーケンスを返すようなメソッドとかがあるのでこの辺と組み合わせて。
  • whileもだいたい同じ。でもdo〜whileはない。do〜while的なのはbreakを使う。

関数

  • def 関数名 ([引数]):
  • もちろんインデント!
  • 関数の定義は呼び出しより前。ここはシェルっぽい。
  • 関数では変数のスコープが関数内のローカルとなる。
  • 関数呼び出し時に引数を変数名でキーワード指定すると順番を気にしなくてもよい。
  • デフォルト値の定義も普通。
  • 返り値も普通。リストや辞書も返せる。

まあこの辺はどの言語もだいたい一緒かな。

次回はいよいよファイル操作。

[時間割:C言語]『はじめてのC言語完全入門』その3
2008/09/02 22:48 posted by kunkichi

火曜日は『C言語』です。8〜10章を終えました。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 420963


書式付き文字列

  • printfみたいなフォーマット出力の話。この辺は他言語でもほぼ同じなのでスルー。

算術演算

  • いわゆる四則演算。printfと絡めて。ここも目新しくはない。
  • 『等差数列の和』とかって学校で習ったっけ?ちゅうか数学の知識なさ過ぎを痛感。「3n歳からの数学嫌い克服」フラグ発動。

いろいろなデータ型

  • ビットとかバイトとか。1バイト=256種類、2バイト=65536種類、4バイトの整数=たくさん、とか。1バイト整数だと0〜256と-128〜127、いわゆる符号あり/なしとか、ここもまあ普通。
  • データ型(文字型、文字列型、整数型、浮動小数点型)とリテラル。
  • 文字型を整数として出力するとASCIIコードが出力される。
  • 16進で出力。こういうのは意識してやったことないなー。
    ex) printf( “%#02x”, ‘A’); → “0×41″が出力される。
    • %x・・・16進で出力
    • #・・・16進であることを示す”0x”が先頭に追加される。
    • 02・・・最低2桁で出力、1桁の場合は先頭に0を追加。っていうか、0をつけるような文字列って制御文字しかなくって、いろいろ試してみたのだけど、printfの第2引数にどうやって指定するかがわかりませんですた。
    • ASCIIコード表開いてみたり(笑)

それほど目新しいところってあんまりなかったのだけど、数学の知識が明らかに足りないことがわかったのは収穫でした。16進とかもちょっと苦手意識あるし。でも、コンピュータが話す言葉にほんの少しでも近づいた感がしてちょっと嬉しい。目指せバイナリアン。

[時間割:Perl]『ミニマルPerl』
2008/09/02 00:30 posted by kunkichi

月曜日は『Perl』の時間。元々はPHPで開発とかもやっていたんだけど、運用の仕事ではPerlをメインで使っていて(ちょこっとしたスクリプトとか)、いつのまにやら一番長く使ってたりします。

なので、それなりにはわかってるつもりなんだけど、ここいらでちゃんと基礎的な勉強をしておこうかなと。選んだのはこれ↓

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 151300


テーマ的にはぴったり(笑)。先週・先々週とちゃんとやっていたのだけど、ふとtaintモードについて改めて調べてたら横道それまくってたので、今週は立ち戻ってちゃんとアップ。基本的にはわかってるところはすっ飛ばして気になるところだけまとめ。

  • ワンライナーで便利なPerlの起動オプション
    • 行末処理(改行する)場合は-lオプション。
    • -nオプションでテキストを1行ずつ処理。フィルタみたいな感じで使える。
      perl -wnl -e ‘print;’ aaa.txt
    • -pオプションでテキストを1行ずつ処理して「表示」も。これだとフィルタ処理だけですむ
      perl -wnl -e ” aaa.txt
    • printfは-lの効果を受けない。あと、printfは%を使う場合は解釈されるので注意。
    • -nや-pだとデフォルトの入力レコードのセパレータは行になるけど、-0数字でセパレータの単位を変更。–00で段落モード。-0777でファイルモード
  • 便利な特殊変数
    • $.で行番号
  • スクリプトで実行
    • スクリプトの場合、-nと-pオプションの場合、もしくは<>(空の入力演算子)の場合はファイル名が引数として取られる。
    • ワンライナーの場合、-eはシングルもダブルもOK。入れ子もOK。シェルはシングルの入れ子はダメ。
    • -sオプションの場合は、-変数名=値が自動的に渡される。
    • Perlの真偽はシェルと逆なので注意。数値だと0、文字列だとNULLやゼロは偽、それ以外は真。
    • -sオプションの場合は、-変数名=値が自動的に渡される。-変数名だけだとこれれが真になる。オプションをトグルで指定する場合なんかに便利そう。
    • -sで-変数名を指定する場合は、ourで宣言しておけば、”used only once”のエラーが出ない、つまりオプション指定となる。
    • -sで-変数名=値を指定する場合は、逆にourで宣言せずに、定義がないことを警告として出すほうがよい。

-sオプションはいいなぁ、ちょっとしたスクリプトのオプションとしては使いやすいし。次はdieとwarnのとこからの予定。

[時間割:C言語]『はじめてのC言語完全入門』その2
2008/09/01 00:25 posted by kunkichi

今日は復習ということで、火曜日にアップできていない『C言語』の復習とまとめをアップ。

はじめてのC言語 完全入門 (標準プログラマーズライブラリ)
塚越 一雄
技術評論社
売り上げランキング: 420963


5〜7章まで進みました。

  • 単に外部ファイルを読み込むだけでなく、標準関数のエラーなども出力してくれるのでデバッグがしやすくなる。
  • 関数には、型と引数の定義が必要。
  • 引数を指定しない場合は、(void)。()内に何も指定しない場合は引数のチェックをスキップするという意味でちょっと異なる。
  • ただし、mailに限っては、通常3つの引数を取るので、引数を使わない場合は()を指定する。
  • 関数が返すデータ型を指定するのが型。値を返さない場合はvoidを指定する。
  • 型を省略するとintになる。
  • mainはintを返す。これがリターンコードになる。
  • エスケープシーケンスは二つ。
    • 文字列エスケープシーケンス
      • エスケープ文字列は\。文字列の中で解釈される。タブとか改行とか
    • 端末エスケープシーケンス
      • ANSIエスケープシーケンス。対応している端末ならOK。
      • エスケープ文字列はESC。よって、指定する場合はこれを16進で指定するので、”\x1b”となる。
      • 文字を修飾する場合は、”\x1b[パラメータm”。複数のパラメータを指定する場合は;で区切って”\x1b[パラメータ;パラメータ:パラメータm”とする。
      • 例えばputsで黄色で出力するなら
        puts(”\x1b[33m黄色です。”);
      • 一旦変更するとずっとそのままになってしまうので戻す場合は、
        puts(”\x1b[0m”);
      • 輝度とかも指定できる。1で高輝度。デフォは低輝度。

やっぱりCの場合、関数の定義の仕方というか、型とか引数の指定とか、その辺がきっちりしてる印象。

[時間割:Python]『みんなのPython』その3
2008/08/29 01:36 posted by kunkichi

木曜日は「Python」。

ちょうど WEB+DB PRESS vol.46で『[速習]Python』の特集があったので、まずはそれをさらっと読んでみました。

WEB+DB PRESS Vol.46
WEB+DB PRESS Vol.46
posted with amazlet at 08.08.28
技術評論社
売り上げランキング: 103


内容は、Javaとか経験のある開発者向けのPython紹介記事という感じで、Pythonの記法で他言語と違うところとか、あといきなりO/Rマッパー、テンプレートエンジン、フレームワークをさらっと紹介してあったり、とちょっと初心者には難し目の内容。

でもデータベースへ接続して一通りの作業をやってみたり、MVCな即席アプリ開発とか、初心者向けの本だとカバーできないような実践的なところまでざっくりまとめてあるので、なんとなく雰囲気がわかるのはいいね。

Pythonをある程度使えるようになった頃の自分が想像できたところで、続き。

みんなのPython
みんなのPython
posted with amazlet at 08.08.28
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 26951


条件分岐・比較演算子・論理演算子

  • 中カッコとかではなくて、
    • インデントでブロック定義。これぞPython
    • 条件にカッコはいらない
    • 分岐の記述の最後は:
  • switchないのか。Perlとおなじ。でも elsif じゃなくて elif
  • インタラクティブシェルの場合は、ブロックの最後は空行。でもネストされたifブロックの最後は空行いらないみたいだから、多分インタラクティブシェルだけのような気がする。あとで調べる。
  • &&とか||とかは使えない。and と or を使う。
  • 組み込み型(リストとか文字列とか)の比較もできる。リストの場合は要素も完全一致する場合のみTrue。
  • &&とか||とかは使えない。and と or を使う。
  • 文字列検索にはfind()メソッド。
    ex) if a.find(”STRINGS”) != -1:
  • 上の例にあるように、ifで指定する条件は「式」である必要がある
  • &&とか||とかは使えない。and と or を使う。
  • find()メソッド以外にもinとか使える。こっちのほうが良さげ
    ex) if “STRINGS” in a:
  • 文字列の”2″と数値の2は比較してもイコールにはならない。型キャストする。PHPerだとちょっと嵌りそう、これ。

ループ

  • インデントとか:はif文と同じ。
  • $i++とかない。Perlのforeachとかシェルスクリプトのforとかっぽい。
  • カウンタを指定するような場合はrange()関数。

インデントってやっぱり新鮮だなー。ちょっと長めのスクリプト書けるようになったら見やすさを味わってみたい。

[時間割:Python]『みんなのPython』その2
2008/08/21 23:02 posted by kunkichi

まだChapter1の途中です。数値、文字列ときて、そろそろプログラミングらしいデータの持ち方である、リストから。

みんなのPython
みんなのPython
posted with amazlet at 08.08.21
柴田 淳
ソフトバンククリエイティブ
売り上げランキング: 50252


リスト

  • いわゆる配列
  • 文字列も数値も一緒にリストに入れれる
  • スライス重要
  • 角カッコで定義。ex) a=[1,2,”aaa”,”bbb”]
  • インデックスにマイナスを使うと後ろから。
  • スライスは開始位置と終了位置+1で指定。ex) a[1:3] で [1,2]が返る。
  • スライスで返るのはリストなので注意
  • リスト同士を足すと連結。あと、リストに数値/文字列は足せない。足す時はリストで足す。append()メソッドで要素を追加、extendメソッドでリストを連結
  • リスト同士をかけると繰り返し。
  • リストは文字列と同じシーケンス型だけど、要素の置き換えは代入で可能。
  • del文で要素を削除
  • max()関数で最大、min()関数で最小の要素を取る。
  • sort()メソッドで照準ソート、reverse()メソッドで降順ソート。このメソッドはリストの並び自体を書き換える
  • 多次元配列は普通にOK

辞書

  • ハッシュと同じ
  • 中カッコで定義。コロンでキーと値を組み合わせる。ex) a = {”key1″:”value1″,”key2″:”value2″ }
  • 取り出す時は角カッコ ex) a[’key1′]
  • 要素の削除とか追加はリストと同じっぽい
  • キー一覧を取得するにはkeys()メソッド。
  • キーの存在確認はhas_key()メソッド。

タプル

  • リストとの違いは書き換え不可ということだけ?
  • 丸カッコで定義
  • 取り出しはリストと同じ。
  • スライスでタプルとして取り出せる
  • タプル同士の足し算は可能。ただし新しいタプルに。
  • タプルの利点は辞書のキーとして使える。リストは無理。

組み込み型まとめ

  • コレクション型・・・複数の要素をまとめるもの。
    • シーケンス型(文字列、リスト、タプル)
    • マップ型(辞書)
  • 変更可否
    • 文字列、タプル → 不可
    • リスト、辞書 → 可能
  • これらの型キャストもできる。

うーん、なんとなく、リストとか辞書とか、あとそれを取り出すときとかの囲み記号がPerlとかと違うのがちょっと覚えにくい。そう考えるとPHPって単純なんだけどパッと見ではわからんってのがなー。

でも個人的にプログラミングのキモの一つは、リストとか辞書みたいな、「配列」「ハッシュ」の使い方だと思ってるので、ここはしっかり覚えないと。

このページの先頭へ