I ♥ WordPress

[時間割:Perl]『ミニマルPerl』その21
2009/03/09 23:00 posted by kunkichi

1週間って早いなぁ、先週の更新から既に一週間、またがんばらないと、汗

ということで月曜日は「Perl」。引き続き組み込み関数編。ファイルのグロブから。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • ファイルのグロブ・・・ファイル名をワイルドカード文字で生成する。FNG(File Name Generation)とかともいう。まあ百聞は一見にしかず。
    $ ls
    GeorgeHarrison.txt  JohnLennon.txt    RingoStarr.txt
    JimmyPage.txt    JohnPaulJones.txt  RobertPlant.txt
    JohnBonham.txt    PaulMcCartney.txt
    $ perl -wl -e '@files=<Paul*.txt>; print @files;'
    PaulMcCartney.txt
  • 複数の条件を指定する場合は括弧でくくって、カンマで区切る。出力セパレータを改行にすればこういう風に出力される。$ perl -w -e '$,="\n";@files=( <*John*.txt>, <*Paul*.txt> ); print @files;'
    JohnBonham.txt
    JohnLennon.txt
    JohnPaulJones.txt
    JohnPaulJones.txt
    PaulMcCartney.txt
  • ファイルグロブでは<>を使うけど、Perlでは他の用途でも同じ記号を使うため、例えば以下のようにFNGパターンを変数に入れてそのまま使うとエラーになる。
    $ perl -wl -e '$pattern = "Paul*.txt"; @files = <$pattern>; print @files;'
    readline() on unopened filehandle at -e line 1.
    ファイルハンドルとして認識されてしまう。この場合は<>内の変数名の前後をスペースで囲む。
    $ perl -wl -e '$pattern = "Paul*.txt"; @files = < $pattern >; print @files;'
    PaulMcCartney.txt
  • FNGで使うメタキャラクタはシェルのワイルドカードっぽい。正規表現ではないので注意。もし正規表現を使ってより厳密・正確にしたい場合は、前にやったgrepでコードブロック内にマッチ演算子を指定するやつと組み合わせる。
    $ perl -wl -e '@files=<*Paul*>; print @files;'
    JohnPaulJones.txtPaulMcCartney.txt
    $ perl -wl -e '$,="\n";@files=grep{/^Paul/}<*Paul*>; print @files;'
    PaulMcCartney.txt
    ファイルグロブでざっくり選んだやつをgrepのフィルタでより厳密にって感じ。
  • ファイルを管理するようなUNIXコマンドと同じような関数も用意されている。(chdir、mkdir、rmdir、umask、chmod、chown、などなど)
  • PerlのchownはUID/GID両方を変更できるので、chgrpは存在しない。
  • chmod、chown、unkinkなどは、成功・失敗を返すのではなく、成功したファイル「数」を返すので注意!
  • 組み込み関数全般で、引数の扱いには注意!
    • 括弧なしでも使えるけど、括弧は指定したほうがトラブルが少なくてすむケースもある。
    • 以下のようなパターンだと引数がどの関数に対して渡されるべきなのかをPerlが判断できない。
      $ perl -wl -e '@files=<*Paul*>; print sort @files, "\n";'
       
      JohnPaulJones.txtPaulMcCartney.txt

      改行が@filesの各要素と並列でsortが実行されてしまっている。ただしくは以下。セパレータも使って指定した方がすっきりします。
      perl -l -e '$,="\n";@files=<*Paul*>; print sort (@files);'
      JohnPaulJones.txt
      PaulMcCartney.txt

さて、組み込み関数もこの辺で。次からはいよいよスクリプトを作成していきます。

[時間割:Perl]『ミニマルPerl』その20
2009/03/03 02:19 posted by kunkichi

どひゃー。ちょっと忙しくてばたばたしている間にもう3月ですよ、トホホ、、、
そろそろ復活しないと〜、ということで月曜日は「Perl」。前回に引き続き、組み込み関数のところ。

今日はリスト処理に絡む関数を。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • sort
    • リストの要素をソートする。デフォルトはアルファベット順。$ perl -wl -e '$,=" "; @ary=("c","a","d","b"); print sort @ary;'
      abcd
    • sortの後にコードブロックで明示的に並べ替え規則を書くとその規則に従ったソートが行われる。ちなみにデフォルトの場合は、本来は以下のコードブロックになっている。$ perl -wl -e '$,=" "; @ary=("c","a","d","b"); print sort { $a cmp $b } @ary;'
      a b c d
    • 数値の場合のコードブロックは以下。$ perl -wl -e '$,=" "; @ary=(14,100,20,8); print sort { $a <=> $b } @ary;'
      8 14 20 100
    • ちなみにこれを文字列としてコードブロックを書くとこうなる。$ perl -wl -e '$,=" "; @ary=(14,100,20,8); print sort { $a cmp $b } @ary;'
      100 14 20 8
    • コードブロックの動作は以下。
      • ソートする項目を$a、$bとする
      • $a と $b を比較演算子で評価する。左辺が大きい場合は-1、イコールは0、右辺が大きい場合は+1を返す。
      • 上記をもとに $a と $b を入れ替える。
    • randを使った無作為ソートの例。randのロジックをコードブロックに記述する。$ perl -wl -e '$,=" "; print sort { int((rand 2)+0.5) -1 } 1..10;'
      2 1 5 9 6 7 4 10 8 3
      randで-1、0、+1のどれかを返すようにすれば、リストのソート規則がランダムになることを利用している。上の例でもあるけれど、文字列・数値それぞれの場合の並べ替え規則はきちんと定義しないとダメだし、かつ、こういう風に定義すればいろいろできるということ。
    • \Lとかを使って、並べ替え規則時に大文字か小文字に統一してやれば、大文字・小文字の違いを無視するソートとかもできる。$ perl -wl -e '$,=" "; print sort { $a cmp $b } "a".."Z","A".."Z";'
      A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
      これがこうなる。$ perl -wl -e '$,=" "; print sort { "\L$a" cmp "\L$b" } "a".."Z","A".."Z";'
      a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z Z
  • grep
    • UNIXコマンドのgrepとは異なり、標準入力とかファイルからではなく、リストに対して実実行、コードブロックで条件を記載する$ perl -wl -e '@ary=("John","Paul","George","Ringo");print grep {/^J/} @ary;'
      John
  • join
    • リストの要素を単一のスカラに結合する。$ perl -wl -e 'print join "|", "a".."Z";'
      a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
    • リストに対してマッチングとか置き換えを実施したい場合、個々の要素に対して実施する場合は個別に処理するしかないけど、複数の要素にまたがった状態に対して実施する場合はjoinで結合しちゃうという手が使える。$ perl -wl -e '$str = join "", "apple","monday"; $str =~ /lemon/ and print "Lemon was found!"'
      Lemon was found!
    • -aオプションでフィールド処理した@Fをjoinすると、セパレータの変換的なこともできる。$ cat /etc/passwd | perl -wnlaF":" -e 'print join "|", @F;' | grep -v "^#"
      nobody|*|-2|-2|Unprivileged User|/var/empty|/usr/bin/false
      root|*|0|0|System Administrator|/var/root|/bin/sh
      ・・・
  • map
    • リストを変換するフィルタ。
    • 使い方はgrepと似ているけど、grepはコードブロックの評価に対して各要素を返すのに対して、mapはコードブロックの評価そのもの、つまり変換した結果を返す。$ perl -wl -e '@ary=("John","Paul","George","Ringo"); $,=" "; print map { "\U$_" } @ary;'
      JOHN PAUL GEORGE RINGO
    • ありがちなミス。$ perl -wl -e '$,=" "; print map { s/^(.)/\L$1/g } @ARGV;' 'John' 'Paul' 'George' 'Ringo'
      1 1 1 1
      これはs/〜/〜/gという置換演算子は、置換後の結果を返すsedコマンドとは異なり、置換に成功した数を返す。また、mapのコードブロックで返されるのは、コードブロック内の最後の処理になるため、置換に成功した数として1がかえってきているという訳。これを回避するには、コードブロックの処理の最後に$_をつけてやる。$ perl -wl -e '$,=" "; print map { s/^(.)/\L$1/g; $_ } @ARGV;' 'John' 'Paul' 'George' 'Ringo'
      john paul george ringo

こういうリスト関連処理って、読み込んだファイルの内容をいったんリストに放り込んどいて、まとめてフィルタ、みたいな感じで使えばかなり便利な気がします。

今日はここまで。

[時間割:C言語]『デバッグではじめるCプログラミング』
2009/02/18 23:23 posted by kunkichi

またここ数日忙しくて更新できてないのですが、一応ちゃんとやってるよという報告もかねて(笑)

時間割の達成状況をちょっと見直してみたいと思います。

  • 「Perl」の時間は順調とはいわないまでもある程度こなせてる感じ
  • 「サーバ」は引き続きRADIUSを。一応本は読み終わってるので、知識定着のためのまとめをやってこうかなと。あと、念願のクアッドコアCPUを手に入れたので、いろいろと試していきたいなと。

ということで、問題は「C言語」。

これまで、はじめてのC言語 完全入門に沿ってやってきたのだけど、途中からどうも面白味に欠ける気がしてきて、モチベーション低下&ちょっとサボりがち。ということで、てこ入れのために、書籍を変えました。選んだのはこれ。

デバッグではじめるCプログラミング
山本 貴光
翔泳社
売り上げランキング: 262121

ゲームを作る(なつかしのROGUE系RPG!angbandとかやったなぁ、、、)という目標を設定して、実際に設計しつつ実装していくというなかなか実践的な内容。本の中で紹介されているソースコードはわざとちょこちょこ間違いがあって、それをデバッグしつつ学ぶというところが特徴的で面白い本です。ここ2、3日で一気に8割方読み終えるぐらいに読みやすいし、サンプルプログラムに目標がちゃんとあるのはゴールが見える感があってモチベーションも維持しやすいしね。

ただ、はじめてのC言語 完全入門ほど細かい説明(とはいうもののこれもポインタとか配列のところの説明はやっぱり足りない気がするなぁ、具体的にどういうシチュエーションでどう使ったらどういうメリットがあるか?っていうところまではサンプルプログラムには含まれてるとは思えないし。)があるわけではないので、一気に読み進めれたのははじめてのC言語 完全入門をある程度読んでいたからってのもあるね。そういう意味では無駄にはなってないってことだとプラスに考えるようにしてます。

あと少しで読み終えれそうなので、一通り読み終えたら、サンプルのゲームをカスタマイズしつつ実際に作ってみたいと思ってます。一応Windows環境でのプログラミングを想定しているようなので、UNIXでやるならどうするか?とか、これをPerlで書くならどうするか?ってとこまでできると面白いかも。

ま、あんまり細かく勉強成果を報告できるような感じではなさそうなのですが、なるべくアップできるようにがんばります、汗

Mac にインストールしているアプリ 2009年2月版
2009/02/16 02:12 posted by kunkichi

訳あってちょっとメモ。

フリーウェア・シェアウェア

  • Firefox ・・・ ブラウザ
  • SafariStand ・・・ Safari拡張ツール
  • Parallels ・・・ 仮想環境
  • iTerm ・・・ ターミナル
  • CyberDuck ・・・ FTP/SFTP
  • CotEditor ・・・ エディタ
  • ImageWell ・・・ 画像加工ツール
  • Adium ・・・ チャット
  • Skype
  • RealPlayer ・・・ 動画再生
  • SmartReporter ・・・ HDD監視ツール
  • iStat Menus ・・・ 各種監視ツール
  • HandBrake ・・・ 動画エンコーダ
  • Dropbox ・・・ オンラインストレージ
  • Growl ・・・ 通知ツール
  • Flip4Mac ・・・ WMVコーデック
  • Perian ・・・ 各種コーデック
  • iBackup ・・・ バックアップ
  • SlimBatteryMonitor ・・・ バッテリ監視ツール
  • SnapNDrag ・・・ デスクトップキャプチャ
  • Paparazzi ・・・ Webページキャプチャ
  • HardwareGrowler ・・・ ハードウェア情報をGrowlで通知
  • SpaceSuit ・・・ Spacesの背景を切り替えるツール

商用ソフトウェア

  • iWorks
  • iLife
  • Parallels ・・・ 仮想化ソフトウェア

Core2Quad Q9550買ってきた。
2009/02/15 01:58 posted by kunkichi

お蔵になってる ML110 G5 に乗せてみる予定。動くのか?

Q9550s は動くらしいので、多分大丈夫なのではないかと思ってるのだけど、あっちはまだちょい高いかな。

2009/03/30追記
Q9550動きました。
ただし、うちのML110G5の場合、BIOSのファームウェアのバージョンが古くて、最初はファンが全開で回ってたのですが、こちらはファームウェアをバージョンアップしたところ、改善しました。思いのほか静かでいい感じです。

最近のWindows PCについて
2009/02/15 01:55 posted by kunkichi

ちょっと衝撃的だったので、エントリ。

うちの家族がPCを買いました。機種はVAIO。あと、無線LANやらプリンタやらも、一通り買ったので、今日はそのセットアップ作業員と化してました。

で、個人的に初Vistaだったのですが、感想としては、

普通の人間が普通の神経で使える道具じゃないです。

もうねぇ、何がどこにあるか全然ピンとこないし、設定一つとっても、妙に親切だったり、逆にそうじゃなかったり、っていうレベルが統一されてないし、、、ウィジェットもいらねぇ、、、

最近の若い子はこんなのガンガン使いこなしてる訳?単に僕がオールドタイプなだけ?ってかこれ使いこなせるってある意味すごいよ、、、

あとね、昔からメーカー製PCってそうなのだけど、プリインストールされてるアプリ多すぎ。最初から常駐しまくってて、起動時に山ほど初期設定しないといけない、ってそれだけで萎える。

しかも、VAIOの場合、OSの標準機能をラップしてあるようなアプリが動いてて、これがまたわかりにくい。

なんていうかね、ほんとうに、

これ、マジで売るつもりなの?

とまで思った、衝撃的な一日でした。

[時間割:Perl]『ミニマルPerl』その19
2009/02/13 02:08 posted by kunkichi

木曜日は「Perl」です。引き続き、組み込み関数いろいろ。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • chomp
    • おなじみchomp。これまでは-n や -p に併せて -l オプションを使ってきたので自動的にchompしていたようなもの。
    • ただし、以下のような場合は、-lオプションが聞かないのでchompしないとダメ。$input = <STDIN>;ユーザからの入力内容を標準入力で受け付けるような場合は、最後の改行をchompしてやる必要がある。
    • 配列をchompすると、すべての要素に対してchompできる。
    • chomp の引数に「複数」の引数を指定する場合は、()が「必要」。chomp ( $a, $b );
  • rand
    • 乱数生成。引数なしだと、1以下のものすごく細かい浮動小数点数を返す。$ perl -w -e '$num = rand; print $num;'
      0.179432431775243;
    • 普段はここまではいらないので、引数で倍率を指定する。100だと、100以下の浮動小数点数ということになるので、多少大きくなる。$ perl -w -e '$num = rand 100; print 97.8164008892239
    • 整数で計算したければ(というかこれが一番よく使われるはず)、intで整数にキャストして小数点以下を切り落として使う。$ perl -w -e '$num = int (rand 100) + 1 ; print $num;'
      75
      この例だと、1〜100の間でランダムな数字が選ばれる。

ちょっと短いけど今日はここまで。

[時間割:サーバ]『RADIUS - ユーザ認証セキュリティプロトコル』その2
2009/02/11 22:53 posted by kunkichi

水曜日は「サーバ」の時間。前回に続いて『RADIUS』を読み進めていきます。今日はRADIUSプロトコルの仕様。

RADIUS―ユーザ認証セキュリティプロトコル
Jonathan Hassell アクセンス・テクノロジー
オライリー・ジャパン
売り上げランキング: 193762
  • RADIUS認証プロトコル。RFC2865。
  • ただし、アカウンティングについては、RADIUSアカウンティングプロトコル。こちらはRFC2866。
  • UDPを使用する。理由は以下。
    • 通常、RADIUSはプライマリ、セカンダリで構成する。従って、片方から応答がない場合にもう片方に送信しなおす「再送信タイマ」処理が必要。TCPの再送信は「別のサーバに送信し直す」ということではないので、UDPのほうがよい。
    • また、利用者の使い勝手を考えると、確実性のために時間がかかるTCPを使う必要がない。UDPで一定時間応答がなければ、別の認証サーバにつないで、早くサービス開始できるほうがよい。
    • クライアント・サーバ間の接続が確立されていないといけない「ステートフル」なTCPよりも、クライアント・サーバ・ネットワークに問題があっても、最初の一度だけ初期化して、必要なときにデータのやり取りを行える、「ステートレス」なUDPのほうが手間を省ける。
    • 複数の認証を同時に受けるような場合には、UDPの方がシンプルに実装できる。

    ただし、逆にデメリットもある。

    • TCPなら再送信処理は元から組み込まれているが、UDPの場合は自分で実装する必要がある。
  • 標準では1812番ポートを使用する。アカウンティングプロトコルは1813番。ただし、昔の名残で、1645番、1646番をデフォルトで使おうとする実装も多いので注意。
  • 基本的な動作の流れは以下。
    1. クライアントが、認証に必要な情報を含めたアクセス要求パケットを、サーバに送信する。
    2. サーバは、アクセス要求パケットを受け取ったら、以下のどれかの応答パケットを返す。
      • アクセス許可
      • アクセス拒否
      • アクセスチャレンジ
    3. 一定時間内にサーバからの応答パケットが返ってこない場合は、クライアントは再送信する。
  • パケットの形式は以下。構造はアカウンティングプロトコルも同じ。
    種別コード 識別子 パケット長 認証符号
    属性データ(可変サイズ)
    • 種別コード。パケットの種類を表す。主なものは以下。
      • 1: Access-Request(アクセス要求)
      • 2: Access-Accept(アクセス許可)
      • 3: Access-Reject(アクセス拒否)
      • 4: Accounting-Request(アカウンティング要求)※アカウンティングプロトコル
      • 5: Accounting-Response(アカウンティング応答)※アカウンティングプロトコル
      • 11: Access-Challenge(アクセスチャレンジ)
    • 識別子。要求パケットと応答パケットの対応を行う。
    • パケット長。パケットの長さを表して、実際のパケットとチェックするために使う。
    • 認証符号。データ(特にパスワード)の暗号化・解読のために使う。
  • パケットの種類について。以下、認証・承認に関する部分。
    • アクセス要求
      ユーザID、ネットワークサービスを提供する機器のIPアドレス、暗号化されたパスワードが含まれ、サービスの利用開始を要求する。
    • アクセス許可
      許可された、利用可能なサービス情報が含まれ、サービスの利用を許可する。
    • アクセス拒否
      主に拒否された理由等の文字列が含まれれ、サービスの利用を拒否する。Reply-Message属性とProxy-State属性のみ指定可能。
    • アクセスチャレンジ
      利用者に再度何らかの情報入力を求め、アクセス要求パケットを再送信させる場合に使用する。ワンタイムパスワードとかかな?Reply-Message属性とState属性のみ指定可能。このパケットを受け取ったクライアントはState属性に同じ文字列を指定する必要がある。

ちょっと細かすぎたかな。も少しシンプルにまとめていきたいなー。

今日のところはここまで。

[時間割:Perl]『ミニマルPerl』その18
2009/02/10 01:24 posted by kunkichi

何事もなかったかのように進めます(笑)月曜日は「Perl」の時間。引き続き、組み込み関数をいろいろ見ていきます。

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 96883
  • statを使っていろいろファイルの情報を取ってみる。
    • 一般的な使い方my @stats = stat "sample.txt";
      0 ファイルシステムのデバイス番号
      1 i ノード番号
      2 ファイルの権限
      3 ファイルへのハードリンク数
      4 ファイル所有者のユーザID
      5 ファイル所有者のグループID
      6 デバイス識別子
      7 ファイルのサイズ(バイト)
      8 最終アクセス時刻
      9 最終変更時刻
      10 最終 i ノード変更時刻
      11 標準ブロックサイズ
      12 ファイルに割り当てられているブロック数
    • 括弧で括ってそれに対して添字でアクセスすることもできる。print (stat "sample.txt")[7];
  • シェルの”-nt”をPerlで書く。っていうか”-nt”って知らなんだ、ファイルのmtimeを比較する演算子(newer thanの略)。これは便利だね。
    まずはシェルの場合。ls -lt sample*txt
    -rw-r--r--  1 kunkichi  staff  48  1  9 00:07 sample.txt
    -rw-r--r--  1 kunkichi  staff  62  9 16 23:04 sample2.txt
    $ [[ "sample.txt" -nt "sample2.txt" ]] && echo "sample.txt"
    sample.txt
    次にPerl。$ perl -e '(stat "sample.txt")[9] > (stat "sample2.txt")[9] and print "sample.txt\n";'
    sample.txt
  • ただし、statは実行ユーザの権限に従うので、ファイルの権限がない場合等を考慮して、ファイル単位で処理するほうがよい。$! で OSエラーメッセージを取ってみる。$ perl -e '$mtime1 = (stat "sample3.txt")[9] or die "cannot stat \"sample.txt\": $!";'
    cannot stat "sample.txt": No such file or directory at -e line 1.
  • lsをPerlで書いてみる。僕のMacだとこんな感じに表示される。$ ls -lt sample.txt
    -rw-r--r--  1 kunkichi  staff  48  1  9 00:07 sample.txt
    Perlで書く場合は、Stat::lsModeを使って、パーミッションの表示をlsコマンドと同じにしてみる。#!/usr/bin/perl -w
     
    use strict;
    use Stat::lsMode;
     
    my $filename = $ARGV[0];
     
    my @stats = stat $filename;
    my $mode  = format_mode $stats[2];
    my $nlink = $stats[3];
    my $uid   = getpwuid $stats[4];
    my $gid   = getgrgid $stats[5];
    my $size  = $stats[7];
    my $mtime = localtime $stats[9];
     
    printf"%s %d %s %s %d %s %s\n", $mode, $nlink, $uid, $gid, $size, $mtime, $filename;
    実行結果は以下。$ ./ls.pl sample.txt
    -rw-r--r-- 1 kunkichi kunkichi 0 Mon Feb  9 23:27:26 2009 sample.txt
    getpwuid、getgrgidは組み込み関数で、UID、GID
    からユーザ名、グループ名に変換する。format_mode でls風の出力に変換。
  • シェルでファイル演算子を使う場合、ファイル演算子は引数にファイル名を取るので、条件節で同じファイルにいろんな条件チェックをする場合は以下となる。[[ -f "sample.txt" && -r "sample.txt" && -s "sample.txt" ]]これでは面倒なので、Perlではstatやファイル演算子で使用された、「最後」のファイル名を”_”(アンダースコア)で参照できる。ただし同じブロック内のみ。-f "sample.txt" and -r _ and -s _statの場合はこんな感じ。(stat "sample.txt")[9] == (stat _)[10]
  • statを使うときは perldoc -f statを実行して、コピペして楽しよう。($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);

今日はここまで〜。

[時間割:Perl]『ミニマルPerl』その17
2009/02/02 23:23 posted by kunkichi

2月になりました。今月もがんばりすぎないようにがんばります。それが長く続けるコツ。

それはそうと、今日仕事帰りに本屋に寄ったら、こんなんが出てました。

さすが!と言わせる Plagger徹底攻略術
蒲生 睦男
シーアンドアール研究所
売り上げランキング: 42881

流行ってたのって一昨年ぐらいじゃなかったっけ?(笑)でもまあ書籍としてまとめられたものはないので、とりあえず買っときました。『ミニマルPerl』早く終わらせて次はこれだな。

ということで続き。今回まではワンライナー的なものや、grep や awk とかを Perl で実装してみる、って感じでしたが、少しプログラミング寄りになっていきます。

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

組み込み関数

  • 評価コンテキスト
    式の使われ方によって、スカラーコンテキストで評価するのか、リストコンテキストで評価するのか。
    例1: 配列をリスト変数、すなわち、配列のコピーとなる。(リストコンテキスト)@list = @F;例2: 配列の要素数をスカラーで代入(スカラーコンテキスト)$num = @F;例3: 配列の各要素をスカラーに代入。(リストコンテキスト)($num1, $num2) = @F;例4: 配列の各要素を順に表示する。(リストコンテキスト)print @list;例5: scalarを使って意図的にスカラーで出力する。(スカラーコンテキスト)print scalar @list;例6: スカラーとして使用される演算子を式で使う。(スカラーコンテキスト)if( @ARGV > 3 ){ ・・・ };例7: 配列の要素を指す場合の添字として使う。$F[@list] = "added";つまり、これだと配列の最後に新しい要素を追加したのと同じになる。
  • リストからスカラーの変換
    • 上で上げたscalarを使うmy @list = ("John","George","Paul","Ringo");
      print scalar @list;
      結果:4この場合は要素数になる。
    • ダブルクォートする。my @list = ("John","George","Paul","Ringo");
      print "@list";
      結果:John George Paul Ringoこちらの場合は各要素をスペースでつなげた一つの文字列となる。
    • joinを使う。これは後ほど。
  • スカラーからリストへの変換
    • splitを使う。my $str = "John Paul George Ringo";
      my @member = split /\s+/, $line;
      一つ以上のスペースで文字列を区切って、各要素に代入。
      引数の順序に注意。最初の引数は区切りとする正規表現の指定。なければ「語」単位。2番目の引数で分割対象となる文字列を指定する。なければ$_。
    • これまでにやってきた、-wnlaとか-wplaとか。
  • localtimeを使って結果をスカラーとリストで取ってみる。
    • スカラーに代入すると、dateコマンドと同じようなフォーマットになる。my $str = localtime();
      print $str;
      結果:Mon Feb  2 23:07:37 2009scalarを使うともっと単純に書ける。print scalar localtime;
    • 単純にprintするだけだと、リストコンテキストで区切り文字がなく出力されるのでわかりにくいです。。。print localtime;結果:231123211091320この場合はリストに出力してやる。my ($sec,$min,$hour,$dayofmonth,$month,$year,$dayofweek,$dayofyear,$dst) = localtime;
      print $year + 1900 . "/$dayofmonth/$dayofmonth $hour:$min\n";
      結果:2009/2/2 23:16もしくは配列の添字でアクセスする。my $hour = (localtime)[2];
      print "This is $hour o'clock.\n";
      結果:This is 23 o'clock.
    • 上のをいちいち入力するのも覚えるのも面倒なので、perldocで調べるとコピペできる。# perldoc -f localtime・・・
      #  0    1    2     3     4    5     6     7     8
                         ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                                                                     localtime(time);
      ・・・

ま、この辺は日常のスクリプトでも結構使うので普通だね。とりあえず今日はここまで。

このページの先頭へ