忍者ブログ
  • 2024.03
  • 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
  • 2024.05
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/04/24 23:09 】 |
Perlの配列
「リスト」とは、スカラーの集合のこと。データ。
「配列(array)」とは、リストを格納する変数のこと。

$fred
$fred[0]
$fred[1]
はすべて別物。紛らわしいけど。

インデックスが末尾より大きいときは、undefを返す。(未初期化スカラー変数にアクセスしたのと同じと考えればよい)
末尾のインデックス値は、$#fred で取得できる。(サイズ100の配列なら、$#fredは99)
インデックスは負値も指定できる。-1 は$#fredと同じ位置を指す。インデックスが負の方向にはみ出すとundefを返す。値を格納しようとすると致命的エラーになる。

リストリテラルの書き方は
(0, 1, 2)
("a", "b", "c")
qw (a b c) #上と同じ意味。シングルクォート文字列扱いであることに注意。
qw #これも同じ。デリミタは何の記号文字でもいい
qw !a b c! #これも同じ。

代入には
($a, $b, $c) = qw(a b c);
とする。
($lhs, $rhs) = ($rhs, $lhs);
とすればswapできる。
左右の要素数が合わないときは、黙って捨てられるか、undefが代入される。(元々値が入っていても、undefで上書きされる)

@記号を使うと、配列全体を表す。
($ary[0], $ary[1], $ary[2]) = qw(x y z);
@ary = qw(x y z); #上と同じ
@ary2 = (@ary, 3, @ary); #こんな書き方も

ただし、スカラーコンテキストでは、@ary は配列の要素数を返す。

インデックスを使わない書き方。
末尾に追加、削除する
@ary = (1, 2, 3);
push @ary, 0 # @ary == (1,2,3,0)
push @ary, @ary #@ary==(1,2,3,0,1,2,3,0)
push @ary, 5..7 #@ary == (1,2,3,0,1,2,3,0,5,6,7)
pop @ary #@ary == (1,2,3,0,1,2,3,0,5,6)

先頭に追加、削除する。shift(=pop),unshift(=push)

ソートする
@ary = sort @ary;
これはスカラーコンテキストはない(常にundefを返す)

要素を逆順にする
@ary = reverse @ary;
スカラーコンテキストでは、文字列の全文字を逆に並べる
$rev = reverse @ary; #@ary == (10,20,30) なら $rev = "030201"
どっちとも取れるコンテキストだと、リストコンテキストと見なすようだ
print reverse @ary; # 302010 と表示される
print scalar reverse @ary; # 030201 になる。スカラーコンテキストを強制
$rev = reverse @ary; #030201
@rev = reverse @ary; #30 20 10

リストコンテキストを強制するには、カッコをつける。
($a) = reverse @ary; # 実際reverseはリストコンテキストなので不要だが

その他の例

スカラーコンテキストでは、次の1行を返す
while () {...}
リストコンテキストでは、残りの行を配列にして返す
@lines = ;
PR
【2012/03/10 23:28 】 | perl | 有り難いご意見(0)
Perlの実行
警告を出すには

- 実行時引数で指定する場合
$ perl -w test.pl

- コードに埋め込む方法
#! /usr/bin/perl -w
Unix以外なら、パスを書く必要がないので
#!perl -w

- プラグマを使う方法(Perl5.6以降)
use warnings;


より詳しいメッセージが見たいときは
use diagnostics;


【2012/03/10 22:26 】 | perl | 有り難いご意見(0)
Perlのスカラー変数
リャマ本を読んで知ったことをつらつらと。

数値は内部ですべて倍精度浮動小数点数で扱われる。
その型は、PerlをコンパイルしたCのコンパイラのdouble型。

頭に0をつけると8進数、
0xだと16進数、
0bだと2進数。このあたりはCと同じ。
アンダースコアをカンマ代わりに入れられる。

バイナリデータも文字列として扱える。なぜならPerlは文字列にあらゆる文字が使えるから。そこに「組み込まれた制限は存在しない」。

シングルクォート文字列は、文字列をそのまま出す。例外はシングルクォート自身とバックスラッシュのみで、それらは2つ続けて書くことで表す。
ダブルクォート文字列は、バックスラッシュがエスケープになり、また変数展開が行われる。$の前にバックスラッシュをつけると展開されない。
@の前にもつけておく。でないと配列変数と見なそうとして警告が出る。
また、配列の添字と思われないように、[の前にもつけておく。

文字列の足し算はドット。+ ではない。型がないので、数値としての加算なのか文字列としての加算なのかを区別するために演算子が別になっていると思われる。
小文字のxだと文字列の乗算(文字列の繰り返し)。"a" x 3 が "aaa"になる。

文字列の比較演算子は
eq, ne, lt, le, gt, ge,
を使う。>や==を使うと、文字列を数値に変換して比較した結果を出す。このとき警告が出る(use warnings;のとき)。

末尾の改行を削除するには
chomp($text);
chomp $text; #でもいい
chomp($text = ); #よくある形
末尾以外の改行は削除しない。

未初期化変数には undef が格納されている。
これは数値とも文字列とも違うスカラー値であるが、数値では0、文字列では空文字列として振る舞う。初期化せずに使える(それがPerlのプラクティスとしてどうなのかは知らない)
defined関数を使うとundefかどうか判別できる。


【2012/03/10 22:20 】 | perl | 有り難いご意見(0)
perlで入出力
入力引数は
<>
で表せる。これは、

を省略したもの。

入力引数がファイル名であれば、<> はそのファイルの中身になる。

以下のようにプログラミングし、

print <>;


以下のコマンドで実行すると、data.txtの中身が出力される。
% perl test.pl data.txt


ファイルを開くには

my $ret = open INFILE, "


INFILEがファイルハンドル。 "<***" で入力とするファイル名を指定。">***"だと書き込み、">>***"だと追加書き込み。
使うときは

とする。各行を表示するには

while () {
print $_;
}

となる。

【2012/03/10 20:47 】 | perl | 有り難いご意見(0)
MacでPerlで
MacでPerlプログラミング。
必要なものは全部入っている。

例えば、ファイル名test.plとして以下のようなPerl 文を書いたら、

#! /usr/bin/perl/
print "Hello,world¥n";


コンソールから
% perl test.pl
でもう実行できる


モジュールの追加(CPAN)
解説ページ
http://y-kit.jp/saba/xp/cpan.htm

==コマンド
- プロンプトを出す
# perl -MCPAN -e shell
- インストールする
cpan> install [モジュール名]
- 設定をみる
cpan> o conf


モジュールを使うには、以下のように書く
use Module1;
同一フォルダ内にModule1.pm という名前でモジュールファイルがある。

カレントにあるsubというフォルダの中にある場合は、
use sub::Module1;
とすればよい。

では全然別の場所にあるモジュールの場合は?
@INC 変数にあるフォルダが対象となっている
例えばこんな感じになる

/Library/Perl/5.12/darwin-thread-multi-2level
/Library/Perl/5.12
/Network/Library/Perl/5.12/darwin-thread-multi-2level
/Network/Library/Perl/5.12
/Library/Perl/Updates/5.12.3
/System/Library/Perl/5.12/darwin-thread-multi-2level
/System/Library/Perl/5.12
/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level
/System/Library/Perl/Extras/5.12
.


参考
http://pp-perl.blogspot.com/2007/06/cpan.html

CPANで
install JSON
ってやったけど、失敗する
どうやら、makeが入っていないかららしい

/usr/bin/make
というのが確かにない。

調べてみると、XCodeをインストールしたらmakeも同時にインストールされるらしい。
が、XCode4入れたのに入ってないぞ・・・

どうしよう。
単独でインストールってできないのか。
調べても出てこない。

Leopard時代なら、インストールディスクに入っているようだけど、Lionでそれをやるってどうなのか。

とはいえ、結局Leopard時代のMacbookに入ってたmakeをコピーして持ってきてみる。
makeは別名(リンク)で、本名はgnumakeだった。

/usr/bin には普通のユーザじゃコピーできないようなので、suで入ってみる。

macコンソールでsuになって入るには
http://okwave.jp/qa/q616749.html

% sudo passwd root
これでパスワードを設定してから
% su
で入る。

su のホームディレクトリ は/var/rootなので、普通のユーザのホームディレクトリにいくには
/User/***/
とする。
で、コピーした。

だけどやっぱりこれじゃダメのようだ。



使い方とか書いてあるページ
http://poccori.com/blog/wp/archives/90

モジュールがインストールされているか調べる
$ perldoc モジュール名
モジュールがインストールされているパスを得る
$ perldoc -ml モジュール名

特定のモジュールのおいてある場所
find `perl -e 'print "@INC"'` -name '***.pm' -print


【2012/02/26 00:48 】 | perl | 有り難いご意見(0)
| ホーム |