スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
固定幅データの作り方とそのばらし方
5バイト、6バイト、7バイトで形成されるデータを作ってみよう。
use strict;

my @cs = ('aaa', 'bb', 'c');
my $str = '';
$str .= "A" . $_ for (5,6,7);
print pack "$str", @cs;

結果:
aaa  bb    c      



では、これを1データごとに改行して表示してみる。
use strict;

my $c     = 'aaa  bb    c      ';
my $str ='';
$str  .= 'A' . $_ for (5,6,7);
print "'$_'", "\n" for unpack $str, $c;

結果:
'aaa'
'bb'
'c'



ワンライナーなら、

パック
print pack "@{[do{ join 'A', ('',5,6,7) }]}", ('aaa', 'bb', 'c');

解凍
print $_, "\n"
      for unpack "@{[do{ join 'A', ('',5,6,7) }]}", 'aaa  bb    c      ';


参考資料:
http://itpro.nikkeibp.co.jp/article/Reference/20081008/316471/
http://itpro.nikkeibp.co.jp/article/Reference/20080930/315791/
スポンサーサイト
再帰的に ファイルの中身にある文字列が含まれてるか調べる
use strict; と書かれているかファイル名を表示させる

Perlなら、
use strict;
use File::Find;

find(
     sub {
          return if ! -f $_;
          open my $f, "$_";
          while(<$f>){
            if( $_ =~ /use strict;/ ){
                print $File::Find::name, "\n"; 
                last;
            }
          }
          close $f;
     },
     '.'
   );       


grepコマンドを使うなら、
$ grep -r 'use strict' . | sort | uniq | awk -F: '{ print $1 }'




.pl と書かれたソースだけからfindコマンドを使って見つけるなら、
$ find . -name '*.pl' | xargs grep 'use strict' | awk -F: '{ print $1 }' | sort | uniq
コマンドの意味
mv    カット アンド ペースト
cp     コピー アンド ペースト
find    ファイル検索
grep    ファイル中身検索
ダックタイピング
package Duck;
sub new { bless {} }
sub say { print "ガーガー" , "\n" }

package Dog;
sub new { bless {} }
sub say { print "ワンワン" , "\n" }

package main;
every_say( Duck::new, Dog::new ); # 引数の型はなんでもよい

sub every_say {
 $_->say() for @_; # そのように振る舞う
}


結果:
ガーガー
ワンワン



型はなんでもいいですよー 継承もしてませんよー という意味のようだ。 「アヒルがどうした」という話は単にややこしい気がする。 Perl的にはあたりまえすぎることがら。
Perlの本 読む順番
僕が読んできて、感じたことなので、
みなさんに、あてはまるとは限りませんが、参考までに


[内容]
初めてのPerl
    超基本的な内容はここを押さえておけばOK

CGIハッカーズプログラミング
    動くプログラムが作れる楽しみを味わえる

Effective Perl
    より深く重要な内容が豊富に収録されている

続・初めてのPerl
    リファレンスに関する内容がたくさん載っている Perlを使いこなす上での必須知識

Perlベストプラクティス
    すばらしい参考資料 どう書けばPerlらしいかがわかる

すぐわかる オブジェクト指向 Perl
    非常によくまとまっていてわかりやすい



[できるようになること]
初めてのPerl
    思い通りではないにしろ、
    文法にそってPerlのプログラムを書けるようになる

CGIハッカーズプログラミング
    CGIの仕組みをわかり、
    思い通りにないにしろCGIプログラムが書ける

Effective Perl
    はまりやすいところを理解し、
    初めてのPerlではPerlの一部しか学べていないことに気づく

続・初めてのPerl
    リファレンスを使えばなにかもっと便利になるようだと気づく

Perlベストプラクティス
    どういった場面で、どのように書けば、わかりやすいのか
    どうすれば気持ちよくコーディングできるのかがわかる

すぐわかる オブジェクト指向 Perl
    別のファイルのソースはどのようにすれば呼び出せるのか
    オブジェクト指向Perlはどのように書けばよいかが、
    きっちりわかる
this
this というのは、よく「自分自身」と表現される。

たまに、「自分自身のクラス」という表現をみる。
それは間違いで、「自分自身のインスタンス」という表現が正しいだろう。

で、Perlでは、この thisにあたるものを、毎回、引数として受け取る。


てか、どの言語でもいいけど、
$c = new Hoge;

の動きをちゃんと理解するの すげーむずかしいと思うが。

# $c = Hoge->new(); の書き方が好き。

相手の名前空間を汚染するには
AAA.pm
package AAA;
use base('Exporter');
@EXPORT=qw(a);
sub a{
 print "a" . "\n";
}

1;

このようにすればよい。


呼び出す方は、
use strict;
use AAA;

a();
これでOK。

汚染したくなければ、
use base('Exporter');
@EXPORT=qw(a);
を書かなければよい。

呼び出す方は、
use strict;
use AAA;

AAA::a();

とすれば、呼び出せる。


ここでは、あえて「汚染」とマイナスイメージを持つ言葉を使ったが、
これは、関数を「エクスポート」する、立派なプログラミングテクニックである。
インストール
1. ソースからのインストール

・ソースからインストールしたいとき
  ./configure; make; make install;
  を使う

  ./configure && make && make install
  なんてのもアリ(むしろ推奨)
     ; だと前のコマンドが成功しても失敗しても実行される。
     && だと前のコマンドが失敗したらその時点で実行が中断される


・拡張子 .tar.gz
  .tar.gzはファイルをネットワーク経由で送るときの一般的な拡張子
  ソースは .tar.gz拡張子で配布されていることが多い


・解凍したら
  READMEかINSTALLを探そう
    READMEかINSTALLにインストール方法は書いてある

    でも、細かくなるので、まず
    ./configure; make; make install;
    を覚えよう


・configureについて
  解凍しても、configureがないときがある orz
  昔はconfigureなんてなくて、自分でMakefileを書き換えてた
  めんどくさいので環境を自動で検出してMakefileを自動生成しよう
  というのがconfigureスクリプト


・autoconfなんてのも
  configureスクリプト書くのもめんどくさくなった
  configureを自動生成するautoconfができた
  autoconfはconfigure.acからconfigureを生成する


・makeについて
  ビルドとインストール
  ビルド
    所定の位置に置くためのファイルをつくり出すこと

  インストール
    ファイルを所定の位置に置くこと

  makeというのは作業の自動化ツールで割となんでもできる
    例)makeがgccを呼び出すならビルドの役目になるし、
     cpを呼び出すならインストールの役目になる


・make install について
  make; はコンパイル(ビルドの役目)に専念しよう
  make install; はインストールの役目に専念することにしよう






2. Linuxのパッケージ

・パッケージとは
  プログラムや設定ファイルを一つにまとめたもの
  Linuxではバイナリパッケージが配布されている
    バイナリとは、「コンパイル済み」の意味

・パッケージをダウンロードしたい
  apt もしくは yum
    apt (Debian派生)もしくはyum(RedHat派生)
    aptコマンドはない apt-getコマンドはある
    yumコマンドはある

・パッケージをインストールしたい
  dpkgもしくはrpm
    dpkg(Debian派生)もしくはrpm(RedHat派生)

  実は、apt-get install package-nameでよかったりする

・apt と yum に関する小話
  rpm対応Distributionは長らくネットワーク経由での
  パッケージインストール機能がなかったため
  apt-getが移植された

  yumというaptみたいなものが作成され、
  Fedora派生のDistributionだとyumが使われることが多い

  yumはpythonで書かれてて遅かったため
  Fedoraでもaptを使いたがる人もいる

・atpとyumは内部でdpkg,rpmを呼び出す
  apt(ネットワーク担当)は内部でdpkg(インストール担当)を、
  yum(ネットワーク担当)は内部でrmp(インストール担当)を呼び出している






3. FreeBSDのパッケージについて

・ports
  ソースのダウンロードとビルドを自動化するツール

・package
  pkg_add -r packagename
    ネットワーク経由でインストール

  pkg_add filename
    ローカルのファイルをインストール

  package というコマンドはない
  pkg_add というコマンドはある


※間違い等ありましたら、ご指摘いただけると幸いです。
printf のフラグについて
printf "%03o  \n" , 10;     # 3桁で0を付けてねオクトでね
printf "%3o   \n" , 10;     # 3桁でオクトでね
printf "%3x   \n" , 10;     # 3桁で小文字ヘキサでね
printf "%3X   \n" , 10;     # 3桁で大文字ヘキサでね
printf "%#3o  \n" , 10;    # 進数を示すモノを付けて3桁でオクトでね
printf "%#3x  \n" , 10;    # 進数を示すモノを付けて3桁で小文字ヘキサでね
printf "%#3X  \n" , 10;    # 進数を示すモノを付けて3桁で大文字ヘキサでね


結果:
012 
 12  
  a  
  A  
012  
0xa  
0XA  
今まででよく打ったコトを調べる
.bash_historyからトップ10を抽出してみよう。

$ cat .bash_history | sort | uniq -c | sort -nr | head -10
 120 vi aaa
 117 perl aaa
  31 vi dd
  28 perl dd
  21 vi p
  20 perl p
  20 ls
  15 bash b
  13 vi b
  13 cd_today 

うは、ブログ書く為のちっこいソース書いてるだけだ。
maxを求めるいろいろな方法
なんか色々書いてみたくなった。

Perl
use List::Util qw(max);
print max map { chomp $_; $_ } <DATA>

__DATA__
1
3
2


シェル
$ echo "
1
3
2" | sort -nr | head -1


シェル
$ echo '1 2 3' | tr ' ' '\12' | sort | tail -1
リダイレクトとか
リダイレクトとか標準入力が ということはひとまず置いておいて、
少し整理しよう

シェルにおいて、

<  ファイルからの入力
>  ファイルへの出力
|   出力を後続のコマンドへの入力に変える

と覚えれば、ひとまずよいのではないだろうか?

< と > はファイル用なんだよ
| は、コマンド用





知識がこれでものたりないなら、
> は 1> の略だ。標準出力だからな。
Perlの配列の大きさはどうやって取得してますか?
Perlの配列の大きさなんですが、みなさんはどうやって取得されてるでしょうか?
僕は、初学のうちは $#c という感じで、 $# を使ってました。

しかしこれって、 #$ だったけ? あれ、 $# だったけっとなったりしてうっとうしい。
スカラーを得たい訳ですから、頭が$の$#が正解なわけですが、なんとも紛らわしい。

しかも、$#は、配列の最後のインデックスの値を返します。
配列のインデックスは0から始まりますから、配列の大きさより1少ないわけです。

あー、なんとも覚えないといけないことが多い。
そこで、次の法則を思い出しましょう。
配列はスカラーコンテテキストで評価されると、配列の大きさを返す。

次のソースを見てみてください。
use strict;

my @c = 1..3;
my $d = @c;

print $d     , "\n";
print $#c    , "\n";
print int @c , "\n";


結果:
3
2
3

そうそう、こうやって、スカラーで取得してしまえばいいんです!
ヤッター!

おっと、スカラー変数に配列の大きさを入れて、後で使おうという
次のようなソースはいけてません。

use strict;

my @c = 1..3;
my $d = @c;

# なんか処理

for(my $i=0; $i<$d; $i++){
 # 配列を処理
}


forは、配列分だけ勝ってに回ってくれます。
for(@c){
  #配列を処理
}

こうしましょう。どうしても、処理の都合上、
$i をインクリメントしていく必要があるならば、
for(my $i=0; $i<int @c; $i++){
 # 配列を処理
}

というように、毎回 int で確認しましょう。
え、なんで $d というように配列の大きさを持っちゃいけないんだですって?
それは、「配列の大きさという情報」が「配列そのもの」から分離されてしまったからです。これでは、プログラマはソースを読むときに、余計な変数をひとつ覚えねばなりませんし、配列の大きさが変わったときに、$dの値も更新されているか確認しないといけないし、 まさにどうでもよいことに注意をしなければなりません。
配列の大きさ
配列の大きさは、配列に聞く。

配列に聞けないのはC言語まで。

配列に聞けない言語とか ここまで高級言語が育った中ならイケてなさすぎ。

int @a
a.length

もしくは 配列分だけ勝ってにループする機構があってしかるべき。

そして、それが備わった言語では、それを積極的に使おう!
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

10 | 2008/11 | 12
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

ブロとも申請フォーム

この人とブロともになる

| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。