NTシステムデザインの技術メモ

Perlメモ

最終更新:

ntaka206

- view
管理者のみ編集可

UNIXのプロセスについて

Unix Programming Frequently Asked Questions 日本語訳 - 1 プロセス制御
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html

Unix Programming Frequently Asked Questions 日本語訳

Unix Programming Frequently Asked Questions 日本語訳 - Table of Contents
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html

バッファリング

Perlで出力のバッファリングを無効にするには - Sakura scope
http://www.nishishi.com/blog/2006/05/perl_buffer_flu.html

コアテクの路地: 標準出力のバッファリング
http://blog.miraclelinux.com/ctd/2006/09/post_1b11.html

マニュアル

コマンドラインで
perldoc Net::Telnet

Perl/Tk テキストウィジット 改行するには

文字列に改行コード入れる"\n"

3種類の改行コードに対応しているよう。
CR LF
CR
LF

お約束

use strict;
use warnings;

単純文

func() if EXPR;

func() if $a == 1;
func() if ($a == 1); <-ダメ

型グロブ

型グロブは、様々な変数型のエントリを持つ一種のハッシュである。
*pkg::sym{SCALAR}      # \$pkg::symと同じ
*pkg::sym{ARRAY}       # \@pkg::symと同じ
*pkg::sym{HASH}        # \%pkg::symと同じ
*pkg::sym{CODE}        # \&pkg::symと同じ
*pkg::sym{GLOB}        # \*pkg::symと同じ
*pkg::sym{FILEHANDLE}  # 内部的なファイルハンドル 直接に等価な書き方はない
*pkg::sym{NAME}        # "sym" リファレンスではない
*pkg::sym{PACKAGE}     # "pkg" リファレンスではない

変数未定義の判定など

  • Ippiki - PerlにおけるNULLの扱い

if ($s == NULL) ×

ソケット通信

ネットワークプログラミングの基礎知識



Perlの漢字コード扱い

文字列をPerlの内部文字列(utf8フラグの付いた文字列)として扱うと、lengthやsubstr等の関数や正規表現などでもバイト単位でなく文字単位で操作することができる。

PerlのスクリプトがUTF-8で書かれていることを示すために、スクリプトの初めに入れる。
     	use utf8;

use utf8 をすることで、perl にソースコード中の文字列がUTF8で書かれていることを教えます。
このことにより、ソースコード中の文字列には、UTF8フラグがつく。

   * STDIN, STDOUTにUTF-8を使うなら、binmodeを使って指定する。

     	binmode STDIN, ":utf8";
     	binmode STDOUT, ":utf8";

読み込むファイルがUTF-8で書かれているなら、次のようにopenで指定する。

     	open(FH, "<:utf8", $filename);

読み込むファイルがshift-jisなど、UTF-8以外のコードで書かれているなら、次のようにencodingをopenで用いて指定する。

     	open(FH, "<:encoding(shiftjis)", $filename);

処理手順

  • ソースコードをUTF-8で書き、先頭で宣言する。
use utf8;

  • ファイルを開く場合は文字コードを指定する。
open(FH, "<:utf8", $filename);
open(FH, "<:encoding(shiftjis)", $filename);

  • ストリーム等から入力した文字列は、内部表現(UTF-8)に変換する。
$s = decode('utf8', $s);        # UTF-8
$s = decode('shiftjis', $s);    # SHIFT JIS
$s = decode('euc-jp', $s);        # EUC

  • STDOUTにUTF-8を出力するなら、binmodeで指定する。
binmode(STDOUT, "utf8");

内部表現(UTF-8)に変換した文字列は、漢字でもバイト単位ではなく文字単位で扱える。以下のコードで、内部表現になっていない文字列では漢字が正しく表示されない。

$s = decode('utf8', $s);        # UTF-8
foreach $byte (split //, $s) {
    print $byte;
}

UTF-8フラグとは

スカラー変数の内部表象の状態を示すものとして UTF8 フラグというものがある
スカラー変数には文字列として下記のものを格納できる
(A) 文字列(内部表象: UTF-8)
(B) 文字列(内部表象: ISO-8859-1)


文字列にUTF-8フラグが付いているかどうか確認するには。
Encode::is_utf8($tmp);


Perl内部の文字コード


UTF-8/Shift JIS/EUCの入力コード例
UTF-8/Shift JIS/EUCの文字列をPerlに読み込み、標準出力とパイプに出力する

use encoding "utf-8";
use Encode;
use utf8;

子プロセス側
{
   binmode(PARENT_WTR, "utf8");

   my $s = $telnet->get(Timeout => 3600);

   #$s = decode('utf8', $s);        # UTF-8
   #$s = decode('shiftjis', $s);    # SHIFT JIS
   $s = decode('euc-jp', $s);        # EUC

   print $s;
   print PARENT_WTR $s;
}

親プロセス側
{
   sysread(PARENT_WTR, $curline, 1024);
   # 子プロセスからUTF-8で送られてきた文字列を、内部表現(フラグ付きUTF-8)に変換する
   $curline = decode('utf8',$curline);
}

use utf8; と use encoding;


参考


UTF8 フラグあれこれ - daily dayflower
http://d.hatena.ne.jp/dayflower/20080219/1203493616

Perlの文字コード変換の話 其の参 - It_lives_vainlyの日記
http://d.hatena.ne.jp/It_lives_vainly/20080306/1204629364


Perlでクリップボードを使う


CAPN Clipboardモジュールを使う

Clipboard - Copy and paste with any OS - search.cpan.org

# cpan
> install Clipboard

Perlにコードを書いて実行するとxclipが無いと怒られる
freshmeat.net: Project details for xclip

# aptitude install xclip

Tk::clipboardを使う

Tk::clipboard - Manipulate Tk clipboard - search.cpan.org

実行時にエラーが出る
Tk::Error Failed to AUTOLOAD 'MainWindow::clipboardGet'

Tkのクリップボード機能を使う

$widget->clipboadrClear();
$widget->clipboadrAppend('add to clipboard');
$m_mainWindow->SelectionGet(-selection => 'CLIPBOARD');

クリップボードの内容を取り出し

Net::SSHモジュールについて

WindowsのActivePerlにもある。 Ver0.08
ただし、中身はopen2またはopen3でsshコマンドを呼び出している。

Perl参考書

プログラミングPerl 第2版


最新版は第3版なので注意!
第3版は、2冊に分かれているのでいまいち使いにくい、最新の機能を使わないならば第2版でも十分だと感じます。
中古だと安いし(^.^)

Perlベストプラクティス


タグ:

Perl Tk utf 改行
目安箱バナー