perl のスクリプト内で日本語を記述したいなら、Perl 5.8 以降の場合、文字コードは UTF-8 を使うのが簡単なようだ。正規表現もきちんと使えるし、「表」など Shift JIS では注意が必要だった文字も普通に扱うことができる。
use utf8;
と書いておけばソース内部の非アスキー文字は UTF-8 として解釈される。モジュールの場合は、
noencoding;
use utf8;
と書く。
この utf8 プラグマは、ソースが UTF-8 で記述されていることを示すだけで、外部のファイルから日本語を読んだり、日本語を書き出したりするときの挙動には関係がないようだ。
use Encode::Guess, my $enc = guess_encoding($data, qw/euc-jp shiftjis 7bit-jis/); ref($enc) or die "Can't guess: $enc"; $utf8 = $enc->decode($data); # or $utf8 = decode($enc->name, $data)
use DBI; # 接続文字列(SQL Server or MSDE の例) $dataSource = "dbi:ODBC:". "driver={SQL Server};". "Server=(local);database=test;". "Trusted_Connection=yes;". # yesだとWindows認証 "AutoTranslate=No;"; #データベースに接続 $user="tuser"; #ユーザ名 $pwd="tuser"; #パスワード $dbh=DBI->connect($dataSource,$user,$pwd) or die $DBI::errstr; # テーブル削除 $dbh->do("Drop table seito"); # テーブル作成 $dbh->do( "Create Table seito(id int, name varchar(30))" ) or die $DBI::errstr; # データ挿入 $sth = $dbh->prepare( "INSERT INTO seito (id,name) VALUES (?,?)"); $sth->execute(11, "菅原 道真"); $sth->execute(12, "藤原 道長"); # データ読み出し $ref=$dbh->selectall_arrayref("select * from seito"); for $x (@{$ref}){ print join("/", @{$x},"\n"); } # データベースから切断 $dbh->disconnect;
# SQLserver のデータベース操作の例 # # SRV2003 という名のサーバ上の SQLserver の # test という名のデータベースに接続し、 # seito というテーブルを作成し、データを追加し、 # データを読み出す。 use Win32::OLE; $server="SRV2003"; $db="test"; $user="tuser"; $password="tuser"; # データベースへの接続 $objDB=Win32::OLE->new("ADODB.Connection"); $connStr="Provider=sqloledb;". "Data Source=${server};". "Initial Catalog=${db};". "user id=${user};password=${password}"; $objDB->Open($connStr); $objDB->{Errors}->{Count} and die "cannot connect '$connStr'"; # テーブル作成 $objDB->Execute( "Create Table seito (id int, name Char(20))" ); # データ挿入 $objDB->Execute( "Insert into seito values (11,'蘇我 馬子')"); $objDB->Execute( "Insert into seito values (12,'中臣 鎌子')"); # データ読み出し $rs=Win32::OLE->new("ADODB.Recordset"); $rs->Open("select * from seito", $objDB); while(!$rs->EOF and $rs->{RecordCount}!=0){ print "$rs->{Fields}->{id}->{Value}, ", "$rs->{Fields}->{name}->{Value}\n"; $rs->MoveNext(); } $rs->Close(); # 接続を閉じる $objDB->Close(); $objDB=undef();
Windows 2000 や XP では、起動時に実行させるスタートアップスクリプトというのが使えるが、その中ではファイル名の指定にUNC名(\\server1\aaa\bbb\xxx.txt みたいな表現)が使えない。
なぜいまさら気がついたかと言うと、クライアントPCの情報をスタートアップスクリプトを使ってサーバに集めようと考えたのだが、標準出力をサーバ上のファイルにリダイレクトしようとして見事にはまってしまったのだった。スタートアップスクリプト中でリモートのファイルにアクセスしたいとき、世のシステム管理者の皆さんはどうしているのだろうかと疑問に思った。(クライアントPCのローカルのファイルを使うしかないのだろうか。)
もっと詳しく状況を書くと、各PCの ipconfig /all の出力結果を集めたいと考えており、そのためにスタートアップスクリプトを使い標準出力をサーバ上のファイルにリダイレクトしたかったのだ。
現在考えている解決策は
1)クライアントPCのローカルドライブに出力を保存させておき、適当なときに Wake up on LAN を使って電源を入れてやってから、サーバに当該ファイルを集めてくる。
2)Windows XP からのコマンドラインツールである eventcreate を使いサーバのイベントログに必要な情報を書き込ませる。
3)スタートアップスクリプトのかわりにログオンスクリプトを使う。