Perl Memo

::目次::

0. 開発環境を整える
1. 基本的なこと
2. 変数への代入、参照
3. 真・偽の扱い
4. メタ文字
5. 演算子
6. 繰り返し、条件分岐
7. 配列の扱い
8. ハッシュの扱い
9. ファイルの利用
10. 文字列の置換
11. 日本語の扱い
12. CGI フォーム
13. 関数
14. Here Document / ヒアドキュメント
15. 外部コマンドの利用
16. 役に立つ関数など
17. 環境変数の利用

開発環境を整える

Linux の場合、デフォルトの状態で使えるでしょう。

Windows の場合、ActiveState の ActivePerl をインストールする。
ActivePerl のページ の 「Download Now」をクリック。
Register の画面になるが、空白のまま「Next」をクリック (情報の入力は必須ではない)。
Windows 用の ActivePerl をダウンロード。
インストールは、何も考えずに「Next」をクリックしていけば完了。

動作チェックのためにコマンドプロンプトに

> perl -v

としてバージョン情報が表示されればOK。

test.pl

> perl test.pl

として実行して、「Hello! World.」が表示されればOK。


基本的なこと

  • 1行目は必ず perl への絶対パス
    例:
    Linux の場合
    #!/usr/bin/perl
    Windows の場合
    #!/Perl/bin/perl
    
  • 最後は __END__
  • 変数の宣言が必要なし
  • 変数に代入する値の種類も関係ない
  • 未定義の変数の場合は、undef値(数値と参照されれば、0。 文字として参照されれば、"空文字(長さ0の文字)"。)というものが入る

変数への代入、参照

  • スカラー値
    $scalar = 0;
    
  • 文字、文字列
    $string = "String";
    
  • 変数の参照例
    print "Scalar is $scalar, String is $string.";
    

真・偽の扱い

  • 真:偽(↓)以外(例:1, a, etc...)
  • 偽:0 または "0" または ""(空文字)

メタ文字

  • \n 改行文字
  • \r 改行コード(キャリッジリターン)
  • \t タブ
  • \u 次に続く1文字のみ大文字に変換
  • \l 次に続く1文字のみ小文字に変換
  • \U 以降の文字を全て大文字に変換
  • \L 以降の文字を全て小文字に変換

演算子

数値演算子、数値用比較演算子

  • C言語等と同じ

文字列演算子

  • 文字列の連結 .(ピリオド)
    例:bon と jour を連結して bonjour という文字列を作る。
    $a = "bon", $b = "jour";
    $c = $a.$b;
    
  • 文字列の掛け算(繰り返し) x
    例:3回繰り返す
    $a = "Salut!" x 3;
    

文字用比較演算子

  • eq 等しい
  • ne 等しくない
  • gt 右辺より大きい(辞書順で)
  • ge 右辺以上(辞書順で)
  • lt 右辺より小さい(辞書順で)
  • le 右辺以下(辞書順で)

繰り返し、条件分岐

  • for, while, if, else など、C言語と一緒。

配列の扱い

  • 配列への格納例
    @scalar = (0, 1, 2, 3, 4);
    @string = ("zero","un", "deux", "trois", "quatre");
    
  • 配列内の要素の参照例
    $scalar[0], $string[2];
    $scalar[-1]; 配列の最終要素の参照
    $scalar[-2]; 最後から2番目の要素の参照
    
  • 配列の要素数(2通り)
    $i=@scalar;
    $i=$#scalar;
    便利な使い方
    for($i=0; $i<@scalar; $i++){...}
    for($i=0; $i<$#scalar; $ii+){...}
    
  • 配列のコピー
    @copy = @string;
    
  • 配列のクリア
    @copy = ();
    
  • 配列の連結
    @joint = (@scalar, @string);
    
  • 配列の最後の要素に追加:push
  • push(@scalar, $a, $b);
    
  • 配列の最後の要素を削除:pop
    例:最後の要素を $delete に取り出し、削除する。
  • $delete = pop(@scalar);
    
  • 配列の先頭に要素を追加:unshift
  • unshift(@scalar, $c);
    
  • 配列の先頭の要素を削除:shift
  • $delete = shift(@scalar);
    
  • 配列の要素の一部を別のリストで書き換える:splice
    例:@scalar の $a 番目から $b 個の要素を抜き出し、@out に格納し、抜き出した部分に @in の 中身を挿入する。
  • @out = splice(@scalar, $a, $b, @in);
    
  • 配列の要素を区切り文字で連結して文字列にする:join
  • $string = join(".", @scalar);
    
  • 文字列を区切って配列にする:split
  • @separate = split(/区切り文字/, $string);
    
    便利な例(カウンターに gif 画像を使う時など):数字を桁ごとに分ける
    foreach $count( split(//,$cnt)){
    	print "<IMG SRC=\"$(count).gif\">";
    }
    
  • 辞書列に並べ替える:sort
  • @new = sort(@old);
    
  • 要素の並びをひっくり返す:reverse
  • @new = reverse(@old);
    

ハッシュの扱い

  • 定義の仕方
  • %list = ("キー" => "値","キー" => "値");
    
  • キーのリストを取得:keys
  • @key_list = keys(%list);
    $key_list = keys(%list); ハッシュ内の要素数を得る
    
  • 値のリストを取得:values
  • @value_list = values(%list);
    
  • キーと値を取得:each
  • ($key, $value) = each(%list);
    
  • ハッシュのクリア
  • %list = ();
    
  • ハッシュの要素のクリア:delete
  • delete $list{'キー'};
    

ファイルの利用

  • 読み込みオープン
  • open(ファイルハンドル名, "ファイル名");
    
  • 書き込みオープン
  • open(ファイルハンドル名, ">ファイル名");
    
  • 追加書き込みオープン
  • open(ファイルハンドル名, ">>ファイル名");
    
  • ファイルのクローズ
  • close(ファイルハンドル名);
    
  • ファイルの読み込み
  • < ファイルハンドル名 >
    
  • ファイルへの書き込み
  • print ファイルハンドル名 "書き込みたいデータ";
    
  • 一時ファイルの削除
    例:もし $tmpfile が存在するなら、それを削除する
  • if(-e "$tmpfile"){
     unlink("$tmpfile");
    }
    

文字列の置換

$変数名 =~ s/置換前文字/置換後文字/g;

  • タグ文字の置換
  • $replace =~ s/&/&amp;/g;
    $replace =~ s/</&lt;/g;
    $replace =~ s/>/&gt;/g;
    
  • 改行の置換
  • $replace =~ s/\r\n/<br>/g;
    $replace =~ s/\r/<br>/g;
    $replace =~ s/\n/<br>/g;
    
    HTML のフォームなどに使う場合、タグ文字の置換→改行の置換の順番。

書式の変更:sprintf
例:$count を 5桁の数字にする($count が 5 桁に満たない場合、0で補完する)

$count = sprintf("%05d", $count);

日本語の扱い

  • jcode.pl を使う
  • require 'jcode.pl';
    
  • 日本語文字コード (sjis, euc, jis) の変換 convert

  • 例:$string を「EUC」に変換する。
    &jcode::convert(*string, 'euc'); (Perl 4 の場合)
    &jcode::convert(\$string, 'euc'); (Perl 5 で use strict; を使う場合)
    

CGI フォーム

  • cgi-lib.pl を使う
  • require 'cgi-lib.pl'
    
  • ReadParse
  • &ReadParse(*ハッシュ名); (Perl 4 の場合)
    &ReadParse(\%ハッシュ名); (Perl 5 で use strict; を使う場合)
    
  • 参照の仕方:HTML フォームの NAME 属性の名前によって参照する。
  • 例:NAME="adress"
    &ReadParse(*form); (Perl 4 の場合)
    &ReadParse(\%form); (Perl 5 で use strict; を使う場合)
    $adress = $form{'adress'};
    
  • CGI フォームの例
  • source (form.html)
    source (form.cgi)
    

関数

  • 関数の定義
  • sub function{
     ...
    }
    
  • 関数の利用
  • &function(第一引数、第二引数、…);
    
  • 関数内での引数の利用
    関数の引数は関数内では、配列 @_ に入る。
  • $_[0]:第一引数
    $_[1]:第二引数
     ...
    

Here Document / ヒアドキュメント

  • HTML をそのまま出力させる場合に便利なユーティリティ。
  • print <<"EOF";
    <HTML>
    Hello, World!
    </HTML>
    EOF
    

外部コマンドの利用

  • 外部コマンドの実行
  • system("nkf -e data.dat");
    
  • 外部コマンドに出力結果を渡す
    例:print 文の出力を nkf によって JISコードに変換してから出力。
  • open(OUT, "| nkf -j");
    print(OUT "日本語\n");
    close(OUT);
    
  • 外部コマンドの実行結果を読みとる
    例:data.dat を nkf で EUC に変換した結果を読み込ます。パイプでつなぐことに注意。
  • open(IN, "nkf -e data.dat |");
    while () {
        print $_;
    }
    close(IN);
    

役に立つ関数など

  • IP 情報取得 (IPアドレスを取得し、可能ならばホスト名に変換する)
  • #######################################################
    ### IP 情報取得 $host:ホスト名, $addr:IPアドレス
    #######################################################
    sub ip_get{
        $host = $ENV{'REMOTE_HOST'};
        $addr = $ENV{'REMOTE_ADDR'};
        if($host eq ""){
    	$host = $addr;
        }
        if($host eq $addr){
    	$host = gethostbyaddr(pack('C4', split(/\./,$host)),2) || $ addr;
        }
    }
    
  • 配列の中身をシャッフルする関数
  • #######################################################
    ### 使い方 @old = &shuffle(@old);
    #######################################################
    sub shuffle{
        my @new;
        while(@_){
            push(@new, splice(@_, int(rand(@_)),1));
        }
        return @new;
    }
    
  • 日付と時刻を取得
  • #######################################################
    ### $date_now に 
    ### year/month/date (week) hour:minite:second
    ### という形式で格納される。
    #######################################################
    $ENV{'TZ'}="GMT-9";
    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
    @wday_array = ("日", "月", "火", "水", "木", "金", "土");
    $date_now = sprintf("%04d/%01d/%01d(%s)%02d:%02d:%02d", 
        $year+1900, $mon+1, $mday, $wday_array[$wday], $hour, $min, $sec);
    
  • sendmail に渡す
  • #######################################################
    ### sendmail を使った
    ### $from から $to へのメール
    ### NKF で JIS に変換してから sendmail に渡している。
    #######################################################
    my $nkf="/usr/bin/nkf";
    my $sendmail="/usr/bin/sendmail";
    sub sendmail{
        if(!open(OUT, "| $nkf -j | $sendmail -t")){
             &error('Error');
        }
        print OUT "X-Mailer: From formmail\n";
        print OUT "X-HTTP_REFERER: $ENV{'HTTP_REFERER'}\n";
        print OUT "X-HTTP-User-Agent: $ENV{'HTTP_USER_AGENT'}\n";
        print OUT "X-Remote-host: $ENV{'REMOTE_HOST'}\n";
        print OUT "X-Remote-Addr: $ENV{'REMOTE_ADDR'}\n";
        print OUT "To: $to\n";
        print OUT "From: $from\n";
        print OUT "Subject: $subject\n";
        print OUT "\n";
        ### ここからメール本文
        print OUT "$message\n";
        print OUT "\n";
        close(OUT);
    }
    

環境変数の利用

  • リモートホスト名を取得 (上記 gethostbyaddr() との併用がお勧め)
  • $host = $ENV{'REMOTE_HOST'};
    
  • リモートアドレスを取得
  • $host = $ENV{'REMOTE_ADDR'};
    
  • リファラーを取得
  • $host = $ENV{'HTTP_REFERER'};
    
  • ブラウザ情報を取得
  • $host = $ENV{'HTTP_USER_AGENT'};
    
  • サーバ名を取得
  • $host = $ENV{'SERVER_NAME'};
    
  • スクリプト名を取得
  • $host = $ENV{'SCRIPT_NAME'};
    
  • 届いたデータのリクエスト方式を取得(POST or GET ?)
  • $host = $ENV{'REQUEST_METHOD'};
    
  • クエリーデータを取得 (.../hoge.cgi?foo の foo を取得)
  • $host = $ENV{'QUERY_STRING'};
    
  • 標準入力されたデータのサイズを取得 (受け取るデータのサイズチェック)
  • $host = $ENV{'CONTENT_LENGTH'};
    
  • .htaccess によってアクセス制限されている際に認証されたユーザ名を取得
  • $host = $ENV{'REMOTE_USER'};
    

Home

Tips

ページのトップへ戻る