perlで困ったら

perl 注意点


条件式

条件式で || & && がおかしな動き> or and で統一しましょう
	& && で無事に動くことが多いようですが、 and が確実です

文字列操作

行末の改行文字削除
	$_ = $str; chomp $_; s/\r//; $str = $_;	# 行末の改行文字削除

はまりました

  1. eachを while する途中で last すると、次回の参照時に途中から取り出すハメになる
  2. eachを while したとき、取り出される順番は保証されない

C言語 経験者のための perl 注意点

  1. 変数は必ず "$" か "@" で始める
  2. コメントは "/*" "//" でなく、"#" で始まり行末までとなる
  3. 複数の条件比較は & ではなく &&
  4. "else if" と書いてしまいがち、"elsif" であることに注意
  5. strlen( $str); ...で悩んだことあり> length( $str); なのだ...
  6. わり算結果( a = b / c ; )に注意 小数点以下もどっさり付いてくる a = int( a); で整数にできる
  7. switch 文はない
  8. break continue ではなくlast next を使う( ただし do { } while では使えない )
  9. if while の中括弧は、省略できない
  10. なかなか覚えられない while からの脱出 while(1){ break; last; }
  11. ループの先頭に戻るには、continue ではなくて next
  12. システムコールが、成功時 ( * 0でなく* )、0 以外を返す ( link(), unlink(), rename() etc. )
  13. printf() の、"*" ( フィールド長を展開 )は組み込まれていない ( "$var" とすれば同様に可能である )
  14. 物理アドレスは取得できない ( Perl 5 に同様の演算子はバック・スラッシュがあるが、これはリファレンスを生成するだけである )
  15. ARGV は大文字でなければならない
  16. シグナルハンドラの指定には数字でなく名称を渡す( SIG_PIP etc.
  17. 配列要素の代入と参照
    	C Language
    		array[] = { "a:", "b:", "c:", "d:", "e:"};
    		↓
    	perl
    		@array = ( "a:", "b:", "c:", "d:", "e:");
    
    	* ={} でなく =() であることに注意
    	* 取り出し例 : foreach $value ( @array){ ; }
    	* shift で取り出すこともできるが、配列要素が削除されることに注意
    

javascript 経験者のための perl 注意点

  1. 変数定義は存在しない、var i = 1; は $i=1;
  2. 変数の型は、使用時に必要な型で扱われる $s = 100; も $s = "100"; も同義
  3. 変数の比較には型を意識する必要がある 数値比較なら == 、文字列比較なら eq
  4. 文字列連結に . が使用できる $str = $a . $b; print( $str, $a, $b);

VisualBasic 経験者のための perl 注意点

  1. 文字列連結に + は使用できない。→ $str = $a . $b; print( $str, $a, $b);

500 Internal Server Error

  1. まずは属性確認 755であるか
  2. perl パスを再確認 例:#!/usr/local/bin/perl -w サーバ環境に合っているか
  3. -w を付けるべき
  4. データ・フォルダ属性、ファイル属性を再確認
    フォルダ 766ではエラー( not found )、777なら動く環境あり(西のみ)
    ファイル 644だと、新規作成できず、666ならできる環境あり(西のみ)
    動いていたものが動かなくなったら
  5. 行末の ; 漏れを見直す
  6. 括弧の対応を見直す if( ( ){ etc.
  7. "" と '' の間違いを見直す
  8. if( a > b; ){ ... } この条件文に含まれる問題は見えにくい
  9. ヒアドキュメント終了文字列指定が "EOT" だったものをうっかり、"EOT' に書き換えてしまうと見つけにくい
    さらにデバッグしやすく
  10. シェルで perlが使えるなら、perl -wc work_yet.cgi で構文チェック
  11. Carpを使用できれば 500 発生時 error_log に出力される内容をブラウザに出力できる
    	通常は、httpサーバの error_log 参照が必要だが( tail -f /var/log/httpd/error_log )
    	Carp モジュールを以下のように組み込めば、同内容がhttpクライアントに出力される
    	---
    	$DEBUG = 1;
    	if( $DEBUG != 0 ){	# ( $DEBUG = 1; でデバッグ出力を on/off できるように )
    		use CGI::Carp qw(fatalsToBrowser);
    	}
    
  12. perl5.6以降なら use strict 'vars'; を使うべき
  13. 広域変数を大文字混じりに、内部変数は小文字のみにして人の目に区別しやすく統一する
  14. for foreach while ループ先頭に戻るには、continue ではなく next である

変数の内容がヘン

perl5未満非対応でよいなら、迷わず「 local を my に」置換するべき

変数のスコープ
local 使用時の注意点
一般の言語でいう内部変数とは異なることを知る必要がある。
perlで、同名であれば、local定義された変数も、同じ場所に格納される。
perlは実行時に変数スコープが変わる都度、その場所の内容を書き換える。

	my $m;		# Perl5 が使えるなら、何も考えず my を使うこと
	local $l;	# Perl4 の環境でも動作することが必要なら myは使えないので localを使う以外ない

	$var = 1;
	sub foo {
		local $var = 2; # ダイナミックスコープ宣言( ダイナミックスコープ変数 )
	}
	sub boo {
		print $var;# 2 を出力
	}
	print $var; # 1 を出力

sub内で宣言された local変数は、「そのsub内でのみ有効」なのではなく、あらゆる sub内で有効。
他の sub内で参照すると期待する広域変数でなく、どこか別の sub内にて代入された値が返される。

URLエンコード・デコード

# 文字列をURLエンコードして返す
# 	半角英数字及び、一部の記号( * - . @ ) はエンコード不要
# 	半角スペース ' ' → '+' 
sub url_encode{
	my $str = shift;
	# 1byteづつ、文字コードを2桁の16進数に変換し %xx 形式に '!' → %21
	$str =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
	return($str);
}
# URLエンコードされた文字列をデコードして返す
sub url_decode{
	my $str = shift;
	$str =~ tr/+/ /;
	$str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	#'+' を ' ' に %xx を該当の文字コードに戻す
	return($str);
}

ハッシュの扱い方

# ハッシュ変数の宣言
%member;
# 代入
$member{'Akai'} = 'red@domain.com';
$member{'Aoi'} = 'blue@domain.com';
%member = ('Amai', 'sweet@domain.com', 'Akudoi', 'bad@domain.com');
%member = (
  "Osoi" => "slow@domain.com",
  "Hayai" => "fast@domain.com",
);
# 要素数を取得
$n = keys( %hash );
# 内容をすべて出力
foreach $key ( keys %member ) {
	print "$key : $member{$key}", "\n";
}
# 内容をすべて出力
while ( ($key, $value) = each(%member) ) {
    print "key:$key, value:$value\n";
}
# 含まれる KEYをすべて取得
@key = keys( %hash );
# 含まれる値をすべて取得
@value = values( %hash );

関連サイト


perlモジュール・ドキュメント

( 宅内専用です... ) NET::POP3 MIME-Base64 MIME::Base64 MIME-tools MIME::Words MIME::Entity MIME::Parser MIME::ParserBase MIME::Head MIME::Body MailTools Mail::Internet

since 04/08/08(sun)


©