dyno2316

dyno2316 ロヒミフ perl VBA Excel 秀丸

XP_Vista_MulriBoot

VistaとXPのマルチブート
《ブートシーケンスについて》
OS起動時は「MBR→ブートセクタ→ブートローダ」の順に情報入力が行われます.
  1. まずBIOSプログラムによってハードディスクの先頭セクターであるマスターブートレコード(MBR)が読み込まれる.
  2. 次にアクティブな基本領域(通常C:を含む領域)の先頭セクターであるブートセクタが読み込まれる.
  3. ブートセクタの記録内容に応じて,対応するブートローダを読み込む.
《ブートローダについて》
ブートローダはブートシーケンスにおいて最初に読み込まれるOS固有のファイルです.
  • WindowsXPのブートローダは「NTLDR
  • Windows Vistaのブートローダは「Bootmgr
  • 「Bootmgr」は「NTLDR」を起動できるが,「NTLDR」は「Bootmgr」を起動できない.

    VistaとXPのマルチブート環境ではブートローダとしてVistaのブートローダである「Bootmgr」が起動されなければならない.
  • ブートローダ(および関連ファイル)は,アクティブな基本領域(通常C:)に存在する.マルチブート等でD:ドライブ,E:ドライブにOSをインストールした場合でもその通り.

《ブートセクタについて》
ブートセクタには,次に読み込むブートローダの所在が記録されています.この内容はOSインストール時に"そのOSのブートローダを読み込むように"書き換えられます.
マルチブート環境作成の為に複数のOSをインストールした場合,最後にインストールしたOSのブートローダが読み込まれるようになります.

WindowsXP → Windows Vistaの順でインストールする場合

既に第1パーティションにWindowsXPがインストールされており,これから第2パーティションにWindows Vistaをインストールする場合,あまり注意すべき事項はありません.以下のいずれかの方法でWindows Vistaをインストールすれば,自然とマルチブート環境が構築できます.

これは,後からVistaをインストールしたことにより以下の状態にってくれるからです.
  • Vistaのブートローダである「Bootmgr」が起動されるようにブートセクタが書き換えられている.
  • Vistaインストール時に,先に存在しているXPのブートローダ「NTLDR」を認識し,それも起動できるように「Bootmgr」が設定される.

《補足事項》
Vistaのインストールの仕方で挙動の違いが発生します.認識しておいた方がよいでしょう.
  • VistaのインストールDVDより起動してVistaをインストールした場合…

    実行しているOS時のドライブレターが「C:ドライブ」になるという挙動を示します.すなわち
    • XP実行時:第1パーティションがCドライブ,第2パーティションがDドライブ.
    • VIsta実行時:第2パーティションがCドライブ,第1パーティションがDドライブ.
  • XP上からVistaのインストールを行った場合…

    実行OSに関わらず,第1パーティションがCドライブ,第2パーティションがDドライブと認識されます.

    ※当ページではこちらを意識した図を示しています.



Windows Vista → WindowsXPの順でインストールする場合

この場合,XPインストール後にVistaが起動できなくなります.(⇔無条件にXPが起動し選択する余地が無い)
これは,後からVistaをインストールしたことにより以下の状態になるからです.
  • XPのブートローダである「NTLDR」が起動されるようにブートセクタが書き換えられている.
  • XPインストール時に,Vistaのブートローダ「Bootmgr」の存在が認識されない.
これまで動いていたVistaが起動できなくなりますが,Vistaのファイルは一切失われていませんので,ご心配は無用です.




ブートに関する情報(ブートセクタ,ブートローダ)を変更してやれば,無事マルチブートをすることができます.
変更の内容は以下の2点.
  • Vistaのブートローダである「Bootmgr」が起動されるようにブートセクタを書き換える.
  • 「Bootmgr」からXPのブートローダ「NTLDR」を起動できるようにBCDにエントリを追加する.
これらの変更は,コマンドプロンプトからのコマンド入力で行います.

《ブート情報の変更手順》
  1. XPを起動
  2. アクセサリのコマンドプロンプトを起動
  3. DVDドライブ(E:とします)にVISTA の DVD を入れる.
  4. 以下の5-7のコマンドを入力し,ブートセクタの書き換えを行います.

     
  5. 光学ドライブに移動

    C:\Documents and Setting\[ユーザー名]>e:※e:はDVDドライブを指定して下さい.

    ※「\」は半角の¥で入力して下さい.

     
  6. DVD内の\bootフォルダに移動

    E:\>cd \boot※cdがフォルダに移動するコマンドです.

     
  7. ブートセクタ書き換えコマンドを実行

    E:\boot>bootsect /nt60 all

    ※ ここまででVISTAの起動情報に置き換わります.このままだと今度はXPが起動しないので,以下の以下の8-12のコマンドを入力し,BCDにXP起動の為のエントリを追加します.

     
  8. ビスタのsystem32フォルダに移動

    E:\boot>cd c:\windows\system32 
  9. C:\WINDOWS\system32>bcdedit /create {ntldr} /d "Microsoft Windows XP"  
  10. C:\WINDOWS\system32>bcdedit /set {ntldr} device partition=C: 
  11. C:\WINDOWS\system32>bcdedit /set {ntldr} path \ntldr 
  12. C:\WINDOWS\system32>bcdedit /displayorder {ntldr} /addlast


 
 

Windows Vistaの削除

マルチブートを解除し,Windows Vistaを削除する場合の作業手順は以下の通り.
  1. XPのブートローダである「NTLDR」が起動されるようにブートセクタを書き換える.
  2. Windows Vistaのファイルを削除する.

以下,詳細手順を記載します.

《XPのブートローダである「NTLDR」が起動されるようにブートセクタを書き換える》
  1. XPを起動する.

     
  2. アクセサリのコマンドプロンプトを起動する.

     
  3. DVDドライブ(E:とします)にVISTA の DVD を入れる.

     
  4. 以下の5-7のコマンドを入力し,ブートセクタの書き換えを行う.

     
  5. 光学ドライブに移動

    [C]:\Documents and Setting\[ユーザー名]>e:※[C]:はXPの入っているドライブ,場合によってはD:

    ※e:はDVDドライブを指定して下さい.

    ※「\」は半角の¥で入力して下さい.

     
  6. DVD内の\bootフォルダに移動

    E:\>cd \boot※cdがフォルダに移動するコマンドです.

     
  7. ブートセクタ書き換えコマンドを実行

    E:\boot>bootsect /nt52 all

《Windows Vistaのファイルを削除する》

削除するWindows VistaがD:ドライブ等,c:ドライブ以外の場合は,当該ドライブをフォーマットして初期化すればよいです.

削除するWindows VistaがC:ドライブの場合は,手作業でファイルを削除する必要があります.XPの起動に必要な以下のファイルを残し,他のファイルを削除します.
  • ntldr
  • NTDETECT.COM
  • boot.ini
  • bootfont.bin

実際には,あまり危ない橋を渡らず,容量の多い「Documents and settings」「Program Files」「Windows」といったフォルダおよび「hiberfil.sys」「pagefile.sys」といったファイルを削除すれば十分でしょう.

WindowsXPの削除

マルチブートを解除し,WindowsXPを削除する場合の作業手順は以下の通り.
  1. BCDからXP起動の為のエントリを削除する.
  2. Windows XPのファイルを削除する.

以下,詳細手順を記載します.

《BCDからXP起動の為のエントリを削除する》
  1. Vistaを起動する.

     
  2. コマンドプロンプトを管理者として起動する(右クリックメニューから).

     
  3. 以下の4のコマンドを入力する.

     
  4. [C:]\windows\system32>bcdedit /delete {ntldr}

《Windows XPのファイルを削除する》

削除するWindows XPがD:ドライブ等,c:ドライブ以外の場合は,当該ドライブをフォーマットして初期化すればよいです.

削除するWindows XPがC:ドライブの場合は,手作業でファイルを削除する必要があります.Vistaの起動に必要な以下のファイルを残し,他のファイルを削除します.
  • bootフォルダ
  • bootmgr

実際には,あまり危ない橋を渡らず,容量の多い「Documents and settings」「Program Files」「Windows」といったフォルダおよび「pagefile.sys」といったファイルを削除すれば十分でしょう.

マルチブートの問題点

WindowsXPとWindows Vistaのマルチブートで重大な問題点があることが判明しています.それは「WindowsXPを起動するとWindows Vistaの復元ポイントが削除されてしまう」というものです.

これは,XPで使用しているボリュームシャドウコピーサービス用のストレージフィルタドライバである「volsnap.sys(=ボリュームのスナップショットをとる機能を実装)」の仕様上の問題点に起因するものであるとのことですが,Microsoftでは仕様変更する予定はないとのことです.

volsnap.sysに依存するアプリケーション(パーティションバックアップソフト類)を使用しないということであれば,以下の手順でvolsnap.sysを無効化すればこの問題を回避することはできるとのこと.
  1. XPを起動する.

     
  2. 「ファイル名を指定して実行」からレジストリエディタを起動(regeditと入力)する.

     
  3. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\

    Class\{71A27CDD-812A-11D0-BEC7-08002BE2092F}を開き、「UpperFilters」キーを削除


Windows特殊フォルダ呼び出しコマンド

ツール名 コマンド名
デバイス マネージャ devmgmt.msc
ネットワーク接続 ncpa.cpl
コンピュータの管理 compmgmt.msc /s
セキュリティ強化FW WF.msc
システム情報 msinfo32
タスク スケジューラ taskschd.msc /s
ディスク デフラグ ツール dfrgui
イベント ビューア eventvwr.msc /s
サービス services.msc
システム構成 msconfig
タスク スケジューラ taskschd.msc /s
データ ソース (ODBC) odbcad32
ローカル セキュリティ ポリシー secpol.msc /s
印刷の管理 printmanagement.msc
信頼性とパフォーマンス モニタ perfmon.msc /s
ユーザーアカウント Netplwiz, control userpasswords2
ローカル ユーザーとグループ lusrmgr.msc
Windows モビリティ センター mblctr /open
リモートデスクトップ接続 mstsc

OEからLiveMailへデータ移行


【Outlook Express→Live Mail データ移行】

Outlook Expressがメッセージ・データを保存する既定の場所は、
 1. Outlook Expressを起動し、[ツール]メニューから[オプション]を選択
 2. 表示されるダイアログで[メンテナンス]タブに移動し、[保存フォルダ]をクリック
 3. 保存場所が表示される

□メールデータのデフォルトの保存場所
「 c:\Documents and Settings\<ユーザー名>\Local Settings\Application Data
\Identities\{GUID}\Microsoft\Outlook Express」

 このフォルダの内容を丸ごと、USBメモリにコピー

(注){GUID}にはユーザーを識別するグローバル一意識別子(GUID:Globally Unique Identifier)

□アドレス帳のデフォルトの保存場所

「 c:\Documents and Settings\<ユーザー名>\Local Settings\Application Data
\Microsoft\Address Book」の中の拡張子「*.wab」を持つファイル

この「*.wab」ファイルをUSBメモリにコピー

□アカウント設定のエクスポート
 1. Outlook Expressの[ツール]メニューから[アカウント]を選択する。
 2. 表示される[インターネット アカウント]ダイアログで、
   エクスポートしたいアカウント設定をクリック
   ([すべて]タブではメールもニュースもまとめて表示されるが、
   [メール][ニュース]タブで個別に選択することもできる。)
 3. 右側ボタンの中から[エクスポート]をクリック
 4. アドレス帳と同じ場所に保存

Win7:強化されたファイアウォール設定

セキュリティが強化されたWindowsファイアウォールにICMPを許可する
条件を追加するコマンド

以下をコマンドプロンプトから実行
--------------------------------------------------
netsh advfirewall firewall add rule name="ICMPV4_IN_OK"  dir=in  protocol=icmpv4 localip=any remoteip=any action=allow
netsh advfirewall firewall add rule name="ICMPV4_OUT_OK" dir=out protocol=icmpv4 localip=any remoteip=any action=allow

Win7 TIPS

Windows 7 のフォルダーの中には、スタートメニューの検索ボックス、エクスプローラーのアドレスバー、ファイル名を指定して実行などで「shell:~」と入力して Enter キーを押すと、一発で開くフォルダーが多くあります。ここでは、それらの Shell コマンドで開く特殊フォルダーを紹介します。

http://pasofaq.jp/windows/mycomputer/shellfolder7.htm

Shell コマンド 開くフォルダー パス
コントロール パネル\すべてのコントロール パネル項目
shell:ControlPanelFolder コントロール パネル\すべてのコントロール パネル項目
shell:AddNewProgramsFolder ネットワークからプログラムをインストール \プログラムの取得
shell:AppUpdatesFolder 更新プログラムのアンインストール \プログラムと機能\インストールされた更新プログラム
shell:ChangeRemoveProgramsFolder プログラムのアンインストールまたは変更 \プログラムと機能
shell:ConflictFolder \同期センター\競合
shell:ConnectionsFolder \ネットワーク接続
shell:PrintersFolder \プリンター
shell:SyncCenterFolder \同期センター
shell:SyncResultsFolder \同期センター\同期結果
shell:SyncSetupFolder \同期センター\同期のセットアップ
C:\Users\<ユーザー名>\AppData\Roaming
shell:AppData C:\Users\<ユーザー名>\AppData\Roaming
shell:Administrative Tools ユーザーの管理ツール \Microsoft\Windows\Start Menu\Programs\Administrative Tools
shell:Cookies クッキー \Microsoft\Windows\Cookies
shell:NetHood ネットワーク ショートカット \Microsoft\Windows\Network Shortcuts
shell:PrintHood プリンター ショートカット \Microsoft\Windows\Printer Shortcuts
shell:Programs スタートメニューのプログラム \Microsoft\Windows\Start Menu\Programs
shell:Recent 最近使った項目 \Microsoft\Windows\Recent
shell:SendTo 「送る」メニュー \Microsoft\Windows\SendTo
shell:Start Menu ユーザーのスタートメニュー \Microsoft\Windows\Start Menu
shell:Startup ユーザーのスタートアップ \Microsoft\Windows\Start Menu\Programs\Startup
shell:Templates ユーザーのテンプレート \Microsoft\Windows\Templates
shell:Quick Launch クイック起動 \Microsoft\Internet Explorer\Quick Launch
shell:User Pinned ジャンプリスト 固定メニュー \Microsoft\Internet Explorer\Quick Launch\User Pinned
C:\Users\<ユーザー名>\AppData\Local
shell:Local AppData C:\Users\<ユーザー名>\AppData\Local
shell:Cache インターネット一時ファイル \Microsoft\Windows\Temporary Internet Files
shell:CD Burning CDの一時書き込みフォルダー \Microsoft\Windows\Burn\Burn
shell:Gadgets ユーザーのガジェット \Microsoft\Windows Sidebar\Gadgets
shell:History IEの履歴 \Microsoft\Windows\History
C:\ProgramData
shell:Common AppData C:\ProgramData
shell:Common Templates 共通のテンプレート \Microsoft\Windows\Templates
C:\ProgramData\Microsoft\Windows\Start Menu
shell:Common Start Menu 共通のスタートメニュー C:\ProgramData\Microsoft\Windows\Start Menu
shell:Common Startup 共通のスタートアップ \Programs\Startup
shell:Common Programs 共通のスタートメニューのプログラム \Programs
shell:Common Administrative Tools 共通の管理ツール \Programs\Administrative Tools
C:\Program Files
shell:ProgramFiles C:\Program Files
shell:Default Gadgets デフォルトのガジェット \Windows Sidebar\Gadgets
shell:ProgramFilesCommon \Common Files
C:\Users\Public
shell:Common Desktop パブリックのデスクトップ \Desktop
shell:Common Documents パブリックのドキュメント \Documents
shell:CommonDownloads パブリックのダウンロード \Downloads
shell:CommonMusic パブリックのミュージック \Music
shell:CommonPictures パブリックのピクチャ \Pictures
shell:CommonVideo パブリックのビデオ \Videos
ライブラリ
shell:Libraries ライブラリ ライブラリ
shell:UsersLibrariesFolder ライブラリ ライブラリ
shell:DocumentsLibrary ドキュメント \ドキュメント
shell:MusicLibrary ミュージック \ミュージック
shell:PicturesLibrary ピクチャ \ピクチャ
shell:VideosLibrary ビデオ \ビデオ
C:\Users\<ユーザー名>
shell:UserProfiles C:\Users
shell:Profile ユーザーのフォルダー C:\Users\<ユーザー名>
shell:UsersFilesFolder ユーザーのフォルダー <ユーザー名>
shell:Contacts ユーザーのアドレス帳 \Contacts
shell:Downloads ユーザーのダウンロード \Downloads
shell:Favorites ユーザーのIEのお気に入り \Favorites
shell:Links ユーザーのリンク
(エクスプローラーのお気に入り) \Links
shell:My Music ユーザーのマイ ミュージック \Music
shell:My Pictures ユーザーのマイ ピクチャ \Pictures
shell:My Video ユーザーのマイ ビデオ \Videos
shell:Personal ユーザーのマイ ドキュメント \Documents
shell:SavedGames 保存したゲーム \Saved Games
shell:Searches ユーザーの検索 \Searches
C:\Users\Public
shell:Public パブリックのユーザーのフォルダー C:\Users\Public
shell:SampleMusic サンプル ミュージック \Music\Sample Music
shell:SamplePictures サンプル ピクチャ \Pictures\Sample Pictures
shell:SampleVideos サンプル ビデオ \Videos\Sample Videos
Windows フォルダー
shell:Windows C:\Windows
shell:Fonts フォント C:\Windows\Fonts
shell:ResourceDir テーマ リソース フォルダー C:\Windows\Resources
shell:System C:\Windows\System32
その他
shell:Desktop デスクトップ デスクトップ
shell:Games ゲーム ゲーム
shell:HomeGroupFolder ホームグループ ホームグループ
shell:MyComputerFolder コンピューター コンピューター
shell:NetworkPlacesFolder ネットワーク ネットワーク
shell:RecycleBinFolder ごみ箱 ごみ箱
shell:SearchHomeFolder 検索結果 検索結果



--------------------------------------------------------------------------------

<サイト内関連URL>


Windows 7 のユーザーフォルダ(User Shell Folders)の初期値
特殊フォルダ・プログラムのCLSID・アイコン一覧
特殊フォルダの対応表(XP/7)

Excelショートカット

【Excel】
Ctrl + Shift + ; 挿入メニュー
Ctrl + - 削除メニュー

Ctrl + Shift + Home 左上まで一気に選択
Ctrl + Shift + End 右下まで一気に選択

Ctrl + Shift + & 罫線で囲む
Ctrl + Shift + _ 罫線削除

Ctrl + Shift + ! 数値カンマ挿入
Alt + Shift + = (範囲指定後)合計行挿入

Ctrl + Alt + V 形式を選んで貼り付ける

AHCIドライバ組み込みXPインストールCDの作成 - Inspiron1720 (Windows Vista)

AHCIドライバ組み込みXPインストールCDの作成 - Inspiron1720 (Windows Vista)

nLite で AHCIドライバ を統合します。
 「追加」→「ドライバ単体」をクリックしてダウンロードして展開した
「C:\dell\drivers\R154200\iaahci.inf」を選択すると、
以下のウィンドウが表示されます。

・モードは「Textmodeドライバ」
・Textmode統合オプションでは
「Intel(R)82801HEM/HBM SATA AHCI Controller(Mobile ICH8M-E/M)」を選択

IE8:NoSearchBox

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer\InfoDelivery\Restrictions]"NoSearchBox"=dword:00000001

netsh IPアドレス設定

# 現在の設定を set1_conf.nsh に保存
netsh -c interface dump > set1_conf.nsh

# ネットワーク設定を set1_conf.nsh に変更
netsh -f set1_conf.nsh

------------------------------------------
ローカル エリア接続インターフェースを下記のように設定
 IPアドレス 192.168.0.10
 サブネットマスク 255.255.255.0
 デフォルトゲートウェイ 192.168.0.1
 DNSサーバー 192.168.0.1
 c:\>netsh interface ip set address "ローカル エリア接続" static 192.168.0.10 255.255.255.0 192.168.0.1 1
 c:\>netsh interface ip set dns "ローカル エリア接続" static 192.168.0.1

------------------------------------------
ローカル エリア接続インターフェースをDHCPで設定
c:\>netsh interface ip set address "ローカル エリア接続" dhcp

c:\>netsh interface ip set dns "ローカル エリア接続" dhcp
------------------------------------------
XR410(L2VPN ルータ)内部インタフェイスにPC接続して、Webインターフェイスで設定修正

IPアドレス 192.168.0.1
サブネットマスク 255.255.255.0
デフォルトゲートウェイ 192.168.0.254
c:\>netsh interface ip set address "ローカル エリア接続" static 192.168.0.1 255.255.255.0 192.168.0.254
このPCから
http://192.168.0.254:880 でアクセス
管理者権限必要

ファイル入力と正規表現で抽出


#-------------------------------------------------------------------
# ファイルから特定の文字列を含む行から、指定の文字列を抜き出して出力
#-------------------------------------------------------------------
# 入力のレコード形式
## <entry type="ENTRY_RISYU"><key name="gaksekno">00210018</key>
## <value name="CAM2ndSelectedSubject">213C2059000001:1:1:C20590:off:1</value>
#
open(FIN,$ARGV[0]) die "001 can't open $ARGV[0]¥n";
while(<FIN>){

#
# キーワード「gaksekno">」でそれに続く8桁の数字列を抽出
#
if (/gaksekno¥"¥>(¥d¥d¥d¥d¥d¥d¥d¥d)/){
$gakuno = $1;
}

#
# キーワード「CAM2ndSelectedSubject">999」でそれに続く
# 1桁の英字列+7桁の数字列を抽出
#
if (/CAM2ndSelectedSubject¥"¥>¥d¥d¥d(¥w¥d¥d¥d¥d¥d¥d¥d)/){
$kogi = $1;
$rec = $gakuno . "," . $kogi;
print "$rec¥n";
}

}
close(FIN);

演算子

if ($a ge $b) # 文字列比較 eq ne cmp lt gt le ge
if ($a == $b) # 数値比較  == != <=> < > <= >=
if ( !( $num % 2 == 0 ) ) {
print "奇数です¥n";
}
# AND OR
( ( $x != 7 ) and ( $x > $y ) ); # AND,OR
# 文字列連結
$x = "filename";
$x .= "123"; # filename123
# インクリメント
$a++; # $a=$a+1
# switch文の働き
SWITCH: {
if (/^abc/) { $abc = 1; last SWITCH; }
if (/^def/) { $def = 1; last SWITCH; }
if (/^xyz/) { $xyz = 1; last SWITCH; }
$nothing = 1;
}

期間中の毎日を表示

#----------------------------------------
#☆期間中の日を表示 ppm install date-simple
#----------------------------------------
use Date::Simple;
use strict;
my $day_from = Date::Simple->new(2005, 12, 1);
my $day_to = Date::Simple->new(2006, 2, 28);
my $day_cnt = $day_to - $day_from;
print $day_from," 〜 ",$day_to," = ",$day_cnt, "¥n";
my $day = $day_from;
for (my $i = 0; $i <= $day_cnt; $i++) {
print $i,":",$day->format("%Y/%m/%d"),"¥n";
my $nextday = $day->next;
$day = $nextday;
}

ファイルの入出力


----------------------------------------------------
# ファイルを1行づつ入力
open(IN1,$ARGV[0]) || die "001 can't open $ARGV[0]¥n";
while( &ltIN1> )
{
処理(各要素は $_に代入されている)
}
close(IN1);
----------------------------------------------------
# ファイルを1行づつ出力
open(OUT,">$ARGV[1]") || die "002 can't open $ARGV[1]¥n";
foreach( @list ) {
print OUT $_;
}
close( OUT );
----------------------------------------------------

四捨五入


$a=2.345;
$round=sprintf("%.2f",$a);
print $round."\n";

# 上記実行結果は「2.34」になってしまう
#Active Perl v5.10.0 built for MSWin32-x86-multi-thread
#Binary build 1005 [290470] Built May 24 2009 12:17:36

# そこで以下のような四捨五入を思いつくが

$n=2.345; #四捨五入する数
$x=100; #10の四捨五入する桁数乗
#(小数点以下 n桁で四捨五入のとき、10のn乗)
$n *= $x; #整数にするために $x倍する
$p = int($n); #不要な小数点以下をカット
$q = $n - $p; #小数点以下の差を求める3
$q *= 10; #上記の差を10倍して整数化する
if ($q >= 5) { #整数化後の数値が5より大の場合は+1
$p += 1;
}else{
print "\$qは5未満 ".sprintf("%.19f", $q )."\n";
}
$n = $p / $x; #整数化したものを、$xで割り四捨五入後の数値とする
print $n."\n";


# これでもダメなので 正確な四捨五入が必要な場合
# Math::Round::nearest (CPANモジュール)を使う
use Math::Round;
$b=2.345;
$round2=nearest(.01, $b); # 「.01」が小数点以下2桁
print $round2."\n";

Perl : 重複行を削除


#-------------
#重複行を削除
#-------------
#  (説明)
#    ハッシュで読込み行の文字列をキーとしてハッシュを作成
#    ハッシュの値は重複行の出現回数
while(<>){
next if $line{$_}++;
print;
}

## print "---------------------¥n";
## foreach $key ( keys %line ) {
## print "KEY:$key VALUE:$line{$key}", "¥n";
## }

CSV形式正規表現


#-------------------------------------------------------------
# CSV形式の $line から値を取り出して @values に入れる正規表現
#-------------------------------------------------------------
#(CSV形式の定義)
#  ・「,」で区切った部分がスペースを含めて値である.
#  ・値に「,」や「"」が含まれる場合は、値全体を「"」で囲む.
#  ・値に含まれる「"」は「""」と2回記述となる.

【正規表現のマッチを利用してCSV形式文字列を分解し各要素を @values に格納】
1 {
2 my $tmp = $line;
3 $tmp =~ s/(?:\x0D\x0A[\x0D\x0A])?$/,/;
4 @values = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
5 ($tmp =~ /("[^"]*(?:""[^"]*)*"[^,]*),/g);
6 }

2行目: 次の行で $line を変更するため、$line のコピーを $tmp に取る
3行目: 抽出処理を簡単にするため、最後の値の後ろにコンマを付加
$line の最後に改行コードがついていた場合、改行コードの削除
これで $line の中身は 値,値,値,・・・ の繰り返しになる
    文末の0,1回の「\x0D\x0A」「\x0D」「\x0A」を「,」に置換
[正規表現] (?:abc) 後方参照不可のグループ化でメモリ節約
(hogehoge)? ()内に0or1回マッチ
4行目: 5行目で得られたリストの各要素に対する処理
# A ? B : C は、Aが真であればBを、偽であればCを値とします
# map例  @array2 = map { $_ + 10 } @array1; #全てに10を足した
# scalar例 $aaa = "111abc222";
# print scalar($_ = $aaa, s/abc/efg/g, $_); # 111efg222 が返る
# scalar関数は、()内の3命令を行った結果を返す(はじめて知った機能)
5行目: $tmpの中でマッチした文字列をすべて処理(4行目の map{ } が処理内容)
# $str ="a11nn44..55--aa";
# @w = ($tmp =~ /\d\d/g); # 正規表現でマッチしたすべての文字列を @w に格納
# map {print $_,"\n"} @w; # @w の各要素を改行つきで出力「11\n44\n55」
4,5行目の詳細解説
(1) 値,値,値, という形から個々の値を取り出すため修飾子 g をつけたパターンマッチを行う
  ( 修飾子 g をつけたパターンマッチをリストコンテキストで受けると、
  ( )によるグループにマッチした部分文字列のリストを返す )

  パターン作成で注意が必要なのは,
  「値,」、「 "値",」の 2種類があること
  さらに「"値",」の方には、「,」、「""」が含まれている可能性があること
    以下の場合ごとにパターンを作成し合成する 
a.「値,」 の場合は、「,」が含まれないので、『/([^,]*),/』
b.「"値",」の場合は、値に「""」が含まれている可能性も考慮して
    「[^"] 」と「""」の場合をあわせて、『/("(?:[^"]"")*"),/』

  a,bを合成して、『 /("(?:[^"]"")*"[^,]*),/g 』 となる
    実行速度向上のために最適化を行い 
($tmp =~ /("[^"]*(?:""[^"]*)*"[^,]*),/g); となる
「詳説正規表現」で「ループ展開」として書かれている手法で最適化
 (2) map{ } の中では、
   「値」 の形ならそのまま格納
   「"値"」の形ならば両側の「"」を削除し、「""」を「"」に変換して格納

現在の日時を表示


#----------------------------------------------------------
# 現在の日時を「1999年3月22日(月) 23時37分19秒」形式で表示
#----------------------------------------------------------
@youbi = ('日', '月', '火', '水', '木', '金', '土');
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
print "$year年$mon月$mday日($youbi[$wday]) $hour時$min分$sec秒¥n";

Perlリンク

配列・文字列操作


----------------------------------------------------
@list = split(/,/,$src); # カンマ区切りのデーターをリストにいれる
----------------------------------------------------
$wkstr = join(" ", @w[2], @w[3]); # カンマで文字列結合
----------------------------------------------------
sprintf(qq/%06d¥n/,61); # 頭0うめ「000061」
----------------------------------------------------
substr($rec,10,4) = "□□";# $recの11バイト目から4バイトを□□に置換する
----------------------------------------------------
$sjis = pack( "H*", $str ); # Pack関数 8c6f -> 経
----------------------------------------------------
($s1,$s2,$s3) = unpack( "A5A10A3", $_ ); # 固定長レコードを分解して変数に代入
----------------------------------------------------
# MAP関数 配列の値を2倍にする
@double = map { 2 * $_ } @vals;
# MAP関数 @array の要素を値としてハッシュに代入する
%hash = map { ("map" . $i++) => $_ } @array;

require Data::Dumper;
print Data::Dumper->Dump( [ \%hash ] , [ '*hash' ] );

正規表現の検索・置換

# 「販売価格:¥1,234円」から「1234」を取り出す
if (/¥p{Han}+:¥¥([0-9,]+)/) {
print "価格=".$1."¥n";
}
$wk = $1;
$wk =‾ s/¥,//g;


# 変数( $passwd )の中にある複数の特定記号( @,",¥,$ )の頭に ¥ を付加
s/P/R/gでは、パターンPが見つからなければ置換をしません
$passwd =‾ s/([¥@¥¥¥"¥$])/¥¥$1/g;

# 置換の際に eオプションで置換結果を式として表示
my $a = 100;
my $str = '$a*0.5';
$str =‾ s/(.*?)¥*(.*)/eval($1)*$2/e; # 置換結果を式として評価
print $1,"¥n"; # $a
print eval($1),"¥n"; # 100
print $2,"¥n"; # 0.5
print $str; # 50

# 見やすい正規表現
/x ホワイトスペースを無視するオプション
// を使わずに {} でくくるとわかりやすい

先頭、末尾のホワイトスペースを削除
$text =‾ s{^¥s* | ¥s*$}{}g;

$test =‾ m{^ # Comment
¥¥d¥¥d¥¥d # comment2
}x;

正規表現のマッチを利用してCSV形式文字列を分解し各要素を配列に格納

1 {
2 my $tmp = $line;
3 $tmp =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
4 @values = map {/^"(.*)"$/ ? scalar($_ = $1, s/""/"/g, $_) : $_}
5 ($tmp =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
6 }

2行目: 次の行で $line を変更するため、$line のコピーを $tmp に取る
3行目: 抽出処理を簡単にするため、最後の値の後ろにコンマを付加
$line の最後に改行コードがついていた場合、改行コードの削除
これで $line の中身は 値,値,値,・・・ の繰り返しになる
    文末の0,1回の「¥x0D¥x0A」「¥x0D」「¥x0A」を「,」に置換
[正規表現] (?:abc) 後方参照不可のグループ化でメモリ節約
(hogehoge)? ()内に0or1回マッチ
4行目: 5行目で得られたリストの各要素に対する処理
# A ? B : C は、Aが真であればBを、偽であればCを値とします
# map例  @array2 = map { $_ + 10 } @array1; #全てに10を足した
# scalar例 $aaa = "111abc222";
# print scalar($_ = $aaa, s/abc/efg/g, $_); # 111efg222 が返る
# scalar関数は、()内の3命令を行った結果を返す(はじめて知った機能)
5行目: $tmpの中でマッチした文字列をすべて処理(4行目の map{ } が処理内容)
# $str ="a11nn44..55--aa";
# @w = ($tmp =‾ /¥d¥d/g); # 正規表現でマッチしたすべての文字列を @w に格納
# map {print $_,"¥n"} @w; # @w の各要素を改行つきで出力「11¥n44¥n55」
4,5行目の詳細解説
(1) 値,値,値, という形から個々の値を取り出すため修飾子 g をつけたパターンマッチを行う
  ( 修飾子 g をつけたパターンマッチをリストコンテキストで受けると、
  ( )によるグループにマッチした部分文字列のリストを返す )

  パターン作成で注意が必要なのは,
  「値,」、「 "値",」の 2種類があること
  さらに「"値",」の方には、「,」、「""」が含まれている可能性があること
    以下の場合ごとにパターンを作成し合成する 
a.「値,」 の場合は、「,」が含まれないので、『/([^,]*),/』
b.「"値",」の場合は、値に「""」が含まれている可能性も考慮して
    「[^"] 」と「""」の場合をあわせて、『/("(?:[^"]|"")*"),/』

  a,bを合成して、『 /("(?:[^"]|"")*"|[^,]*),/g 』 となる
    実行速度向上のために最適化を行い 
($tmp =‾ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); となる
「詳説正規表現」で「ループ展開」として書かれている手法で最適化
 (2) map{ } の中では、
   「値」 の形ならそのまま格納
   「"値"」の形ならば両側の「"」を削除し、「""」を「"」に変換して格納

日本語

# Perl5.8 日本語扱いスクリプトの指定方法
use encoding "shift_jis"; # 標準入出力とスクリプトの文字コードが Shift-jis
use open IO => ":encoding(shift-jis)"; # 入出力ファイルの文字コードが shift-jis
binmode STDERR, ":encoding(shift-jis)"; # 標準エラーの出力文字コードを shift-jis

# 文字列リテラルの作り方1
($name, $career, $age, $memo) = split "¥n", << 'EOF';
田中一郎
プログラマ
三十五
健康一番 電話は2番
EOF

# 文字列リテラルの作り方2 ( 空白, 半角円マーク, 半角括弧 )を含まない場合のみ
 (1) @str = qw(表示 対応表 ); #最後の半角空白は必須(カッコのエスケープを防ぐため)
(2) 1つの文字列を作る時 $str = qw/百三十 /; # Perl5.6以降
#====================================================================================
# <<Shift-JIS漢字のマッチング>>
#
# 予[0x975C], 表[0x955C]など ¥5C が含まれる漢字のマッチング
# 以下の内容のファイルの各レコードについて正規表現を使った置換を行う
#
#(ファイル内容 置換前と置換後)
# 111aaaaaaaああアアアあ予定表1ああ => 111aaaaaaaああアアアあ予定表01ああ
# 222bbbbbbbいいイイイイイイ予期表2いい => 222bbbbbbbいいイイイイイイ予期表02いい
# 333cccccccううウウウcccc予告a表3うう => 333cccccccううウウウcccc予告a表03うう
# 444dddddddええエ1234567予言の表4ええ => 444dddddddええエ1234567予言の表04ええ
#--------------------------------------------------------

# Shift-JISの1,2バイト文字のパターンを定義
$char = '(?:[¥x00-¥x7F¥xA1-¥xDF]|[¥x81-¥x9F¥xE0-¥xFC][¥x40-¥x7E¥x80-¥xFC])';
# Shift-JISのリテラルは、変数に格納し、「¥」をエスケープしておく
$str_yo = quotemeta(qw/予 /);
$str_hyo = quotemeta(qw/表 /);
$str_0 = '0';
open(IN,$ARGV[0]) || die "001 can't open $ARGV[0]¥n";
while( &ltIN> )
{
$rec = $_;
# 正規表現では、文字の区切りを意識させ、ある文字の第2バイトと次の文字の第1バイトが
# 1文字であるかのようにマッチしてしまうのを避ける
$rec =‾ s/($char*?$str_yo$char*?$str_hyo)(¥d)/$1$str_0$2/;
print $rec;
}
close(IN);
#======================================================================================
(文字化けを起こすShiftJIS漢字)
0x815c — 0x835c ソ 0x845c Ы 0x875c � 0x895c 噂 0x8a5c 浬 0x8b5c 欺 0x8c5c 圭
0x8d5c 構 0x8e5c 蚕 0x8f5c 十 0x905c 申 0x915c 曾 0x925c 箪 0x935c 貼 0x945c 能
0x955c 表 0x965c 暴 0x975c 予 0x985c 禄 0x995c 兔 0x9a5c 喀 0x9b5c 媾 0x9c5c 彌
0x9d5c 拿 0x9e5c 杤 0x9f5c 歃 0xe05c 濬 0xe15c 畚 0xe25c 秉 0xe35c 綵 0xe45c 臀
0xe55c 藹 0xe65c 觸 0xe75c 軆 0xe85c 鐔 0xe95c 饅 0xea5c 鷭 0xed5c �����綉����� ""で囲むと文字化け、対処は print "表¥示";  print 'ソバ';
----------------------------------------------------

日付

----------------------------------------------------
# 日時のフォーマット
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",$year+1900,$mon+1,$mday,$week[$wday],$hour,$min);

($sec, $min, $hour) = (localtime())[0..2]; # 時分秒だけがほしいとき
----------------------------------------------------

実行方法

#
# perl sortsel.pl 引数1 引数2 引数3
#
# 引数1--FIN、引数2--FOUT、引数3--科目コード
#
#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
# FIN:レイアウト
#   1バイト目から2バイト:科目コード
# 3バイト目から2バイト:頁番号
# 5バイト目から7バイト:受験番号
# 12バイト目から3バイト:点数
#
# FOUT:FINと同じレイアウトで
#   引数3の科目コードで抽出、受験番号>科目コード>頁番号順でソート
#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

open(FIN,$ARGV[0]) || die "001 can't open $ARGV[1]¥n";
open(FOUT,">$ARGV[1]") || die "002 can't open $ARGV[2]¥n";
@temp = @result = ();

while($rec=&ltFIN>)
{
chomp($rec);
$kamoku = substr($rec,0,2); #科目コード

#print "Debug $kamoku $pageno $ jyuno ¥n";


#----科目コードによる抽出
if ($kamoku ne $ARGV[2]) {next};

push @temp,$rec;
}
#foreach $rec (@temp) { print "Debug $rec¥n"};

#----ソート
@result = sort {join("",substr($a,4,7),substr($a,0,4)) cmp join("",substr($b,4,7),substr($b,0,4))} @temp;

#----ソート
foreach $rec (@result) { print FOUT "$rec¥n"};


close(FOUT);
close(FIN);

固定長レコードを分解して変数に代入

#------------------------------------------
#☆unpack固定長レコードを分解して変数に代入
#------------------------------------------

while(<>)
{

($s1,$s2,$s3) = unpack( "A5A10A3", $_ ); # 固定長レコードを分解して変数に代入
print "$s1,$s2,$s3¥n";

}

出力ファイル

#
# 経
# 路
# 従
#
open(FIN,$ARGV[0]) || die "001 can't open $ARGV[0]¥n";
open(FOUT,">$ARGV[1]") || die "002 can't open $ARGV[1]¥n";

while(&ltFIN>)
{
chomp;
$sjis = pack( "H*", $_ );

print FOUT "$sjis¥n";
}

close(FOUT);
close(FIN);

入力行の11バイト目から30バイト目までの文字列を全角空白

#---------------------------------------------------------------------
#☆入力行の11バイト目から30バイト目までの文字列を全角空白10文字に置換する
#---------------------------------------------------------------------
open(FIN,$ARGV[0]) || die "001 can't open $ARGV[0]¥n";
open(FOUT,">$ARGV[1]") || die "002 can't open $ARGV[1]¥n";

while(&ltFIN>)
{
$rec = $_;
substr($rec,10,20) = "          ";
print FOUT $rec;
}

close(FOUT);
close(FIN);

入力レコードの各カラム毎の文字の集計

#--------------------------------------
#☆入力レコードの各カラム毎の文字の集計を行う
#--------------------------------------
# 123456789 <= カラム
# ----------
# ABCDEFGHI
# BBDEFGHIA
# CDEFGHIAB
#
# 上記のファイルの集計で以下の表示をする
# 01A:1 01カラム目の文字「A」の数は1個
# 01B:1        ・
# 01C:1        ・
# 02B:2        ・
# 02D:1        ・
# ・
# ・
#######################################

if ($ARGV[0] eq "") {die "anketo.pl 入力ファイルなし¥n"};

open(FIN,$ARGV[0]) || die "IN File can't open ¥n";
undef %caltbl;

while ($rec=&ltFIN>)
{
##print "$_¥n";
chomp($rec);
$lng=length($rec);
##print "$lng:$rec¥n";
for ($i = 0; $i < $lng; $i++)
{
$moji=substr($rec,$i,1);
### $pos =$i+1;
$pos = sprintf("%02d", $i+1);

$indx = $pos.$moji;
### print "$indx¥n";
$caltbl{$indx}++;
}
}

foreach $indx ( sort keys %caltbl )
{
print "$indx:$caltbl{$indx}¥n";
}

ワンライナー

----------------------------------------------------
# '@'が含まれていない行を表示
perl -ne "print unless /@/" aaa.txt
----------------------------------------------------
# 10行ごとに出力
perl -ne "print unless ($. % 10)" INFILE.txt
----------------------------------------------------
# 可変長のレコードを固定長に変換
perl -lne "print pack('A80',$_)" vrec.txt > out.txt
----------------------------------------------------
# 最初の50行を表示
perl -pe 'exit if $. > 50' file
----------------------------------------------------
# 重複行を削除
perl -ne "print unless $line{$_}++" aaa.txt
perl -ne "next if $line{$_}++; print;" aaa.txt
----------------------------------------------------
# ipconfigコマンド出力から'Host','Address'のある行を抽出
ipconfig /all | perl -ne "print if (/Host/ || /Address/)" > c:¥temp¥aaa.txt
----------------------------------------------------
# カンマ区切りファイルの1番目と3〜5番目をコロン区切りで表示
perl -F, -lane "print qq|@F[0]:@F[2]:@F[3]:@F[4]¥n|" aaa.csv
----------------------------------------------------
# 引数で指定したところから拡張子plファイルを見つけて表示します
perl -MFile::Find -le "find {wanted=>sub {print if /¥.pl$/;}},$ARGV[0]"
----------------------------------------------------
# 指定されたページを取ってきて表示します。
perl -MLWP::Simple -e "getprint qq|http://www.fpu.ac.jp/|";
----------------------------------------------------
ワンライナーのオプション
-e : 引数に記述された内容を実行
-n : 引数全体がwhile(<>){...} に囲まれたように動作
-p :「-n」に加えてループの最後にprint文が実行
----------------------------------------------------------------------
# ファイル内の文字列を置換(正規表現可)
perl -pe "s/置換前/置換後/g" filename
----------------------------------------------------------------------
# filenameの「#で始まる行と行の途中からの#以降」と空白の行を削除
perl -pe "s/^¥s*#.*¥n$|#.*$|^¥s*$//" filename
----------------------------------------------------------------------
# grepのように使う
perl -ne "print if (/検索パターン/)" filename
----------------------------------------------------------------------
# ミリ秒表示のUTC時間を読みやすい形式に変換
perl -pe "s/^¥d+¥.¥d+/localtime $&/e" filename
----------------------------------------------------------------------
Perl ワンライナー&nbspTips

図16 複数コマンドでのワンライナー
$ &nbspperl&nbsp-e 'print "3の倍数¥n" &nbspfor (1..100) {if (($_ %&nbsp3) ==&nbsp0) {print $_&nbsp. "¥n" }}'
C:¥>perl&nbsp-e "print ¥"3の倍数¥n¥";&nbspfor (1..100) {if (($_ %&nbsp3) ==&nbsp0) {print $_&nbsp. ¥"¥n¥"}}"

図17 ファイル名の一覧を取得しコピーコマンド生成
$ &nbspls |&nbspperl&nbsp-ne 'chomp;&nbspprint "cp&nbsp-p $_ $_.old¥n"'
c:¥>dir /b |&nbspperl&nbsp-ne "chomp;&nbspprint ¥"copy /y $_ $_.old¥n¥""

図18 ファイルの一部分を表示する
$ &nbspperl&nbsp-ne 'print&nbspif&nbsp15&nbsp..&nbsp17' ファイル名
c:¥>perl&nbsp-ne "print&nbspif&nbsp15&nbsp..&nbsp17" ファイル名

図19 文字を置き換える
$ &nbspecho 'halllllo,&nbspworld' |&nbspperl&nbsp-pe 's/h[ae]l+o/hello/'
c:¥>echo "halllllo,&nbspworld" |&nbspperl&nbsp-pe "s/h[ae]l+o/hello/"

図20&nbsp-lオプションを利用して置き換え
$ &nbspls |&nbspperl&nbsp-nle 'print "cp&nbsp-p $_ $_.old"'
c:¥>ls |&nbspperl&nbsp-nle "print ¥"copy /y $_ $_.old¥""

図21 桁を指定して出力する
$&nbspls&nbsp-l |&nbspperl&nbsp-ane 'print "$F[4]¥t$F[8}¥n"'

図22&nbspCSV形式ファイルの特定カラムを抽出表示
$&nbspcat&nbsptest.csv
10,20,30
40,50,60

$&nbspperl&nbsp-F,&nbsp-alne 'print $F[1}'&nbsptest.csv

図23 ファイルの中身を置換する
$&nbspperl&nbsp-pi&nbsp-e 's/mae/saki/g' *.txt

図24 ファイルの中身を置換+バックアップを作成する
$&nbspperl&nbsp-pi.bak&nbsp-e 's/mae/saki/g'&nbsptext.txt

図25 ファイルの中身を置換+日付付バックアップを作成する
$&nbspperl&nbsp-pi.`date +%Y%m%d`&nbsp-e 's/mae/saki/g'&nbsptext.txt

図26&nbspWebの内容を取得する
$&nbspperl&nbsp-MLWP::Simple&nbsp-e 'print&nbspget("http://gihyo.jp")'

図27 画像ファイルのEXIF情報を取得する
$&nbspperl&nbsp-MImage::ExifTool&nbsp-e '$exif =&nbspnew&nbspImage::ExifTool->ImageInfo(shift);&nbspforeach (sort&nbspkeys %$exif) {&nbspprint("$_ : $exif->{$_}¥n");}'&nbsptest.jpg

図28&nbspBase64でエンコード・デコードする
$&nbspperl&nbsp-MMIME::Base64&nbsp-ne 'print&nbspMIME::Base64::encode_base64($_)' ファイル名
$&nbspperl&nbsp-MMIME::Base64&nbsp-ne 'print&nbspMIME::Base64::decode_base64($_)' ファイル名


-nオプション
&nbsp-eに−nオプションを付けることで,標準入力
から読み込んで,その内容に対して処理を行うよ
うになります.


●ファイル名の一覧を取得しコピーする
図17は,lsコマンドでファイル名を出力し,
そのファイル名をコピーするシェルスクリプトを
表示する例です.


●ファイルの一部分を表示する
図18は,ファイル名の15〜17行目を表示し
ます.「15‥17」は,入力ファイル内の現在の行
番号を意味する$.変数に対して評価され,結果と
して15〜17行目が表示されます.


-pオプション
&nbsp-nオプションと同様に,標準入力から読み込ん
だ内容に対して処理を行います.−nと異なるのは,
処理結果を標準出力に出力する点です.フィルタ
として利用すると便利です.


●文字を置き換える
図19では,文字列の置き換えに正規表現を使っ
ています.「s/」は,「s//演算子」と呼ばれ,
スラッシュで区切られた前半部分を後半部分へ置換しま
す.図19では,正規表現のhlae11+0をhelloへ置
き換えることを意味します.


-lオプション
&nbsp-lオプションを-nと-pに組み合わせて利用す
ると,処理を行う前に標準入力に対してchompを
実行します.また,出力に対して強制的に改行を
行います.
図17のファイルをコピーするスクリプトを出
力する例を図20として書き直しました
&nbspChompと¥nがなくなり,シンプルになりました.


-aオプション
&nbsp-aオプションは,テキスト1行を空白文字で分割し,
分割した結果を@Fという特別な配列に入れます.
おもに-nもしくは-pと組み合わせて利用します.
配列@Fの添字はゼロから始まります.


●任意の桁を抽出して出力する
図21では,5桁目と9桁目を抽出して出力して
います.


-Fオプション
&nbsp-aオプションに−Fオプションを組み合わせる
と,@Fに分割する際の区切りとなる文字を変更
できます.

●CSV形式のファイルの特定のカラムを抽出して表示
図22では,-Fの後にカンマを記載することで,
カンマ区切りで@Fに入れています.csvファイル
から2桁目を抽出して表示しています.


-iオプション
&nbsp-iオプションは,ファイルを置換します.

●ファイルの中身を置換する
図23では,拡張子txtのファイル中にある文字
列&nbspmae を&nbspsaki に置換し,ファイルそのものも置き
換えています./gを付けることで,1行に複数の
文字列があっても,すべてを置換するようになり
ます.ファイルの中身を一括して置換したいこと
は多くありますが,Perlワンライナーで実行でき
ます.

●ファイルの中身を置換する際にバックアップを作成する
図24では,-iの引数として文字列を指定する
ことで,元ファイルのバックアップを取得してい
ます.元ファイルに「.bak」との拡張子を付けて
保存します.結果として,test.txt の中身は文字列
&nbspmae が文字列&nbspsaki に置換され,元ファイルは
&nbsptest.bak として保存されます.

●ファイルの中身を置換する際に日付を入れたバック
アップを作成する
ワンライナーもシェルからの実行に過ぎないた
め,シェルのバッククォートとの連携も使えます・
図25は&nbspdate コマンドの出力を利用する例です.
&nbsptest.txt の中身は図24と同様に置換され,
&nbsptest.txt.20090318 のように,実行した日付が保存され
ます.

&nbspCPANを使ったワンライナー
&nbspCPANの機能をワンライナーからも利用するこ
とができます.Perlのワンライナーから呼び出す
ことで,CPANの機能をあたかもOSのコマンド
であるかように利用できます.

-Mオプション
&nbsp-Mオプションは,実行する際にPerlモジュー
ルを指定します.−Mの後にそのままPerlモジュー
ル名を記載します.たとえば,LWP::Simple を利
用する場合は,「-MLWP::Simple」と指定します.


●Webの内容を取得する
図26のようにすると,Webの内容を取得する
ことができます.

●画像ファイルのEXIF情報を取得する
図27では,画像ファイルのEXIF情報を取得
しています注2

●Base64でエンコード/デコードする
&nbspBase64のエンコード/デコードは何かと使う機
会がありますが,図28のようにモジュールを使っ
てワンライナーで記載できれば便利です.


=============================================================================

レコードの外字文字列を「〓」に置換

#-------------------------------------------------------
#☆入力ファイルの全レコードの外字文字列を「〓」に置換する
#-------------------------------------------------------
open(FIN,$ARGV[0]) || die "001 can't open $ARGV[0]¥n";
open(FOUT,">$ARGV[1]") || die "002 can't open $ARGV[1]¥n";

while(&ltFIN>)
{
$rec = $_;


$x = pack( "H*", "F040" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F041" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F042" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F043" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F044" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F045" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F046" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F047" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F048" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F049" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F04A" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F04B" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F04C" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F04D" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F04E" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F04F" ); $rec =‾ s/$x/〓/g;

$x = pack( "H*", "F050" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F051" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F052" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F053" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F054" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F055" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F056" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F057" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F058" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F059" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F05A" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F05B" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F05C" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F05D" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F05E" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F05F" ); $rec =‾ s/$x/〓/g;

$x = pack( "H*", "F060" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F061" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F062" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F063" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F064" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F065" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F066" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F067" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F068" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F069" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F06A" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F06B" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F06C" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F06D" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F06E" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F06F" ); $rec =‾ s/$x/〓/g;

$x = pack( "H*", "F070" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F071" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F072" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F073" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F074" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F075" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F076" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F077" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F078" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F079" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F07A" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F07B" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F07C" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F07D" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F07E" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F07F" ); $rec =‾ s/$x/〓/g;

$x = pack( "H*", "F080" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F081" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F082" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F083" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F084" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F085" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F086" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F087" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F088" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F089" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F08A" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F08B" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F08C" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F08D" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F08E" ); $rec =‾ s/$x/〓/g;
$x = pack( "H*", "F08F" ); $rec =‾ s/$x/〓/g;


print $rec;
print FOUT $rec;
}

close(FOUT);
close(FIN);

ループ

while(<>)
{
($s1,$s2,$s3) = unpack( "A5A10A3", $_ ); # 固定長レコードを分解して変数に代入
print "$s1,$s2,$s3¥n";
}

# カウンタがある数値になるまで処理を繰返す
for (my $i = 2; $i <= 10; $i++)
  {
ここに処理を記述
}

# $_ の値を 1 から 10まで順に増加してループ
for ( 1..10 )
{
print "$_ ¥n"
}

# @number 内の要素を1つづ取り出し、2倍にして表示する
foreach $num ( @number )
{
print ( $num * 2 ); #「print (map { $_ * 2 } @number) 」と同じ
}

ハッシュを使い、キーごとの人数、平均点

#----------------------------------------------
#☆ハッシュを使い、キーごとの人数、平均点を計算
#----------------------------------------------
#  入力ファイル
#   CSV形式 [並び] 受験番号7桁,区分,科目コード1,点数,科目コード2,点数
#     「1190001,3,10,50,30,47」
# 集計方法
# 「受験番号上2桁_科目コード」をキーとし、それぞれの人数、平均点を算出
#

while(<>)
{
$s1 = unpack( "A2", $_ ); # レコードの1-2桁目を$1に格納
($d1,$d2,$kmk1,$ten1,$kmk2,$ten2) = split( /,/,$_); # レコードを「,」で分離

$sum_key1 = $s1."_".$kmk1; # キーを合成
$sum_key2 = $s1."_".$kmk2; # キーを合成

$nin{$sum_key1}++; # 人数の加算
$nin{$sum_key2}++;

$ten{$sum_key1} = $ten{$sum_key1} + $ten1; # 点数の加算
$ten{$sum_key2} = $ten{$sum_key2} + $ten2;
##print;
}

##print "---------------------¥n";
foreach $key ( sort keys %nin ) # ハッシュの内容を出力
{
print "KEY:$key 人数:$nin{$key}";
print " 点数:$ten{$key}";
$w_avl = $ten{$key}/$nin{$key};
print " 平均:$w_avl¥n";
}

ハッシュ

----------------------------------------------------
# 重複行を削除 -- ハッシュの値は重複行の出現回数
while(<>){
next if $line{$_}++;
print;
}
----------------------------------------------------
# ----得点毎人数テーブル(%ten_tbl:ハッシュ形式)
$ten_tbl{$kamoku}{$tokuten} = 12; # $ten_tbl{科目コード}{得点} = 人数
# ----- 得点毎人数テーブルの表示
foreach $key_kamoku (sort keys %ten_tbl)
{
foreach $key_tokuten (sort keys %{$ten_tbl{$key_kamoku}})
{
print "科目:$key_kamoku 得点:$key_tokuten 人数:$ten_tbl{$key_kamoku}{$key_tokuten}¥n";
}
}
----------------------------------------------------

サブルーチン

----------------------------------------------------
&test('a','b','c'); # 呼出し元
sub test # サブルーチン側
{
my ($a,$b,$c) = @_; # $a = 'a',$b = 'b',$c = 'c'
}
----------------------------------------------------
&swap( *a,*b); # 配列 @a,@bの内容を入れ換える
sub swap
{
local(*x,*y) = @_;
my $i,$t;
for( $i = 0; $i < @x $i ++ )
{
$t = $y[$i];
$y[$i] = $x[$i];
$x[$i] = $t;
}
}
----------------------------------------------------
open(IN,"test.txt");
&printtext(*IN); # ファイルハンドルを型グロブ引数で渡す
close(IN);
sub printtext
{
local(*F)=@_;
while(&ltF>)
{
print;
}
}
----------------------------------------------------

コントロールブレイク処理

#--------------------------------------------------------
#☆コントロールブレイク処理
#--------------------------------------------------------
#===入力ファイルフォーマット
#
# 区切り文字:^
# 0 1 2 3 4 5 6 7 8 9 10
# 購入金額^予算区分^予算単位^利用者ID^書名^購入書店^資料ID^受入日^発注日^著者名^出版者
#
# 集計条件・・・予算単位ごとに、購入金額を集計
#
# 抽出条件・・・受入日が、当年度(例 2001/04/01 〜 2002/03/31)のレコードを対象
#
#===出力ファイル(図書購入データ)フォーマット [CSVファイル形式]
#
#  予算単位,購入金額
#
#*************************************************************
# (0.0) Program
#*************************************************************

&s1_init;
until ( $eofflg == 1 ) {&s2_main;}
&s3_end;

#*************************************************************
# (1.0) イニシャル処理
#*************************************************************
sub s1_init
{
$time = localtime();
print "Program Start $time¥n";

$ka_gokei = 0;
###$ysn_gokei = 0;
$eofflg = 0;

open(IN,$ARGV[0]) || die "in.dat can't open $ARGV[0] ¥n";
open(OUT,">$ARGV[1]") || die "OUT.dat can't open $ARGV[1] ¥n";

&scmn_read;
$sv_ysn_code = $ysn_code;
###$sv_ka_code = $ka_code;
}
#*************************************************************
# (2.0) メイン処理
#*************************************************************
sub s2_main
{
&s21_ysn_header; #-- 予算単位見出し
until ( ($ysn_code ne $sv_ysn_code) ||
($eofflg == 1 ) )
### {
### &s22_ka_header; #-- 課見出し
### until ( ($ka_code ne $sv_ka_code) ||
### ($eofflg == 1 ) )
{&s23_body;} #-- 明細
### &s24_ka_tail; #-- 課合計
### }
&s25_ysn_tail; #-- 予算単位合計
}
#*************************************************************
# (2.1) 予算単位見出し
#*************************************************************
sub s21_ysn_header
{
$sv_ysn_code = $ysn_code;
$sv_ka_code = $ka_code;
print "¥予¥算単位=$ysn_code¥n";
}
#*************************************************************
# (2.2) 課見出し
#*************************************************************
###sub s22_ka_header
###{
###$sv_ka_code = $ka_code;
###print ": 課=$ka_code¥n";
###}
#*************************************************************
# (2.3) 明細出力
#*************************************************************
sub s23_body
{
print "   受入日=$ur_date 金額=$ur_kin¥n";
###$ka_gokei += $ur_kin;
$ysn_gokei += $ur_kin;
&scmn_read;
}
#*************************************************************
# (2.4) 課合計
#*************************************************************
###sub s24_ka_tail
###{
###print "-------------------------------------¥n";
###print ":        課 $sv_ka_code 合計=$ka_gokei¥n";
###$ka_gokei = 0;
###}
#*************************************************************
# (2.5) 予算単位合計
#*************************************************************
sub s25_ysn_tail
{
print "         ¥予¥算単位 $sv_ysn_code 合計=$ysn_gokei¥n";
$ysn_gokei = 0;
}
#*************************************************************
# (3.0) END 処理
#*************************************************************
sub s3_end
{
close(IN);
close(FOUT);
}
#*************************************************************
# (common) 共通 入力処理
#*************************************************************
sub scmn_read
{
$n = 0;
until ($n == 11) {
unless ($temp1 = &ltIN>) {$eofflg = 1; return;}
chomp($temp1);
$temp1 =‾ s/#.*//;
@rec = split(/¥^/,$temp1);
$n = split(/¥^/,$temp1); # リストの要素数
### print " N=$n¥n";
$ysn_code = @rec[2];
### $ka_code = @rec[1];
$ur_date = @rec[7];
$ur_kin = @rec[0];
}
### print $temp1;
}

Windows版ActivePerl5.8.Xで日本語処理

-------------------------------------------------------------
Windows版 ActivePerl 5.8.X で日本語処理をする時のおまじない
-------------------------------------------------------------
Windows版 ActivePerl 5.8.X 日本語テキストファイルの操作


Windows 版 ActivePerl 5.8.8 以降で
シフトJISの日本語テキストファイルを操作するときは、
次のように宣言したほうがいいということ。
(以前のバージョンはバク抱えている)

use encoding "shiftjis";
use open ":encoding(shiftjis)";
use open ":std";
map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/;

1行目、use encoding "shiftjis"; --- テキストファイルの中でシフトJISを
使うという宣言。そして、標準入出力もシフトJISになる。
2行目、use open ":encoding(shiftjis)"; --- オープンするファイルのデ
フォルトのエンコードの宣言。つまり、シフトJISとして扱う。
3行目、use open ":std"; --- 標準入力(STDIN)、標準出力(STDOUT)、標準エ
ラー出力(STDERR)のencodingを1行目で宣言したshiftjis にする。なぜ、こ
こでもう一度、宣言するかというと、2行目の use open ":encoding
(shiftjis)"; を実行すると、標準入出力がデフォルトにリセットされるため
である。
4行目、map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/; では、標準
入力、標準出力、標準エラー出力の行末コードをCR LFに設定している。これ
は前回、Windows版Active Perl 5.8.X 日本語テキストファイルの標準入出力
で説明したように内部的には設定されている :crlf が無効になっているので、
再設定している。そんな悲しいバグがある。

"rem > test.txt " などと、コマンドラインで、実行して、予め、"test.txt"
というファイルを用意して、次のプログラムを試してみるとわかる。

use encoding "shiftjis";
use open ":encoding(shiftjis)";

open(F1,"test.txt") or die;
open(F2,"<","test.txt") or die;
open(F3,">","outfile1.txt") or die;
open(F4,"<test.txt") or die;
open(F5,">outfile2.txt") or die;
map{print $_,":¥t",join(" / ",PerlIO::get_layers($_)),"¥n" } qw/F1 F2 F3 F4 F5/;

Perl 5.8.8 で試したところ、次のような結果になった。

F1: unix / crlf / encoding(shiftjis) / utf8
F2: unix / crlf / encoding(shiftjis) / utf8
F3: unix / crlf / encoding(shiftjis) / utf8
F4: unix / crlf / encoding(shiftjis) / utf8
F5: unix / crlf / encoding(shiftjis) / utf8


(引用)http://hardsoft.at.webry.info/200604/article_2.html
(おまけ)Windows版 ActivePerl 5.8.X で Excel から日本語データを読む
     http://hardsoft.at.webry.info/200603/article_11.html

URLエンコード

----------------------------------------------------
# URLエンコード
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =‾ tr/+/ /;
$value =‾ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

 フォームから送られたデータは「変数名1=データ1&変数名2=データ2&...」
 @pairsへ &デリミタで"変数名1=データ1"、"変数名2=データ2" 等を格納
 foreach で @pairs から $pair へ "変数名1=データ1" をsplitで、変数名1とデータ1を取り出す
 「URLエンコード」は
  A〜Z、a〜z、0〜9、* - . @ _ はそのまま、半角スペースは + に変換。
  その他はすべて % に16進の2桁の文字コード(「あ」0x2422なら %24%22)

 デコード $value =‾ tr/+/ /;は「+」を半角スペースに戻す(trは、変換演算子で、正規表現が使えない)
      $value =‾ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; は、
      %([a-fA-F0-9][a-fA-F0-9])を、hex関数で10進数にし、pack関数でその数値を文字に変換
      g指定で$value全体に適用、e指定はpack("C", hex($1))を式として評価した結果を対象にする
----------------------------------------------------

sprintf

#-----------------------
# sprintf 関数の記述例
#-----------------------
http://beginners.atompro.net/htm/smpcgi/sprintf.shtml

sprintf フォーマット関数
sprintf("%2.3f", $a)

「書式指定文字列」の書式は「%ym.nx」というパターンで記述


1.フラグ(y)
 - 左詰(デフォルトは右詰)
 + 正の数値に「+」符号を付ける
 空白 正の数値に「空白」を付ける
 0 数値の前を「0」埋めする
 # 8進数の時「0」を、16進数の時「0x」を、10進数の時小数点を付ける

2.整数 m n
 m(最小幅) 指定した桁数にそろえる
 n(最大幅、精度) 文字列の最大桁数、小数点以下の桁数、指数表現の有効桁数


3.型指定子フラグ(x)
 % パーセント文字
 c 文字
 s 文字列
 d 10進整数
 o 8進整数
 u 符号なし10進整数
 x 16進整数
 X 16進整数(英字に大文字を使用する)
 e 浮動小数点(指数形式)
 E 浮動小数点(指数形式)(英字に大文字を使用する)
 f 浮動小数点(固定小数点形式)
 g 浮動小数点(eとfで文字桁数が短い方を使用する)
 G 浮動小数点(Eとfで文字桁数が短い方を使用する)

Sort関数複数キー+抽出

#-------------------------------------------------------------#
#☆Sort関数複数キー+抽出            #
#-------------------------------------------------------------#
#
#★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

Proxyを通したGET

#-------------------
#☆Proxyを通したGET

#-------------------
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);


my $request = HTTP::Request->new('GET', 'http://www.cybersyndrome.net/evc.html');

# UserAgentを生成して処理
my $ua = LWP::UserAgent->new;
$ua->proxy('http', 'http://brf-ce06-g2-0.tm.net.my:553');

my $res = $ua->request($request);

print $res->as_string;

Proxyを通したCGI_post

#--------------------------------
#☆Proxyを通したCGI_post
#--------------------------------
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);


# リクエストの生成
my $url = 'http://www.aaa.com/cgi-bin/hogehoge.cgi';
my %formdata = (
'hoge' => 'form',
'hoge01' => 'yes',
'hoge02' => 'term1',
'hoge03' => 'aaaa',
'submit' => '送 信');

my $request = POST($url, [%formdata]);

#
# --- UserAgentを生成して Post 処理
#
my $ua = LWP::UserAgent->new;
$ua->proxy('http', 'http://host-148-244-150-52.block.alestra.net.mx:80');
my $res = $ua->request($request);

print $res->as_string;

Perl-PAR

http://walrus.vox.com/library/post/activeperl-588par%E3%81%A7perl%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92exe%E5%8C%96.html
ActivePerl 5.8.8+PARでPerlスクリプトをexe化

1. PARのインストール
  C:¥> ppm install PAR
2. PAR::Packerのインストール(ActivePerl 5.8.8の場合)
  PAR::Packer(ppmでの指定はPAR-Packer)
   ->PPM packages from the University of Winnipeg PAR-Packer-588をインストール
  ppm install http://theoryx5.uwinnipeg.ca/ppms/PAR-Packer-588.ppd
  (--forceをつけると、上書きインストール)
  ppm install http://theoryx5.uwinnipeg.ca/ppms/PAR-Packer-588.ppd --force
3. ppコマンドは、「C:¥Perl¥site¥bin」に移動して実行
  pp -V  -> PAR Packager, version 0.973 (PAR version 0.973)
-------------------- Perl EXE 化 -----------------
pp hello.pl -o hello.exe
---------------------------------------------------
ppのオプション
(実行時にコンソールを出さないようにする)
pp --gui -o hoge.exe hege.pl
(exeのアイコンを指定する)
pp -i hoge.ico -o hoge.exe hege.pl
(データファイルをひっくるめる)
pp -a data.txt -o hoge.exe hege.pl
(モジュールを指定) <- うまく検出されなかった時
pp -M Hamachiya::Konnichiha -o hoge.exe hege.pl
(ヘルプ)
pp -h
−−−−−−−−−−−−−−
2009/3/5 うまくいった編
コマンドプロンプトで「ppm」入力

メニュー「Edit」-「Preferances」-「Repositories」タブで
Name:bribes
Location:http://www.bribes.org/perl/ppm/package.xml
を追加
「PAR-Packer」を選んでインストールする
(必要な他のパッケージも自動インストール)

「pp -version」 でバージョン表示
「pp hello.pl -o hello.exe」 で実行ファイル作成
---コマンドプロンプトで直接-------------------------------
For installation, cut and paste in a DOS console:
ppm install http://www.bribes.org/perl/ppm/PAR-Packer.ppd
−−−−−−−−−−−−−−

Perl 実行機能つきバッチファイルヘッダー(ActivePerl専用)

−−−ここから−−−−−−−−−−−−−−−−−−−−−−−−−
@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S "%0" %*
if NOT "%COMSPEC%" == "%SystemRoot%¥system32¥cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
goto endofperl
@rem ';
#!perl -w
#line 14
−−−ここまでをPerlの頭にコピーするとバッチファイルになる−−−

Perl モジュールのインストール

 1.ActivePerlのインストール
   Perl環境(自動解凍ファイル)を以下よりGetしてインストール
http://www.activestate.com/

 2.ネットワークからモジュールのインストール
   (1) パッケージ名の確認
    http://www.activestate.com/packages/

  (2) 「abcdefg.ppd」の「abcdefg」 の部分がパッケージ名

  (3) インストール − 以下をコマンドプロンプトで行う
   
例)パッケージ「MIME-Base64」のインストール

   C:¥>ppm
   PPM interactive shell (1.1.1) - type 'help' for available commands.
   PPM> install MIME-Base64
   Install package 'MIME-Base64?' (y/N): y
   Retrieving package 'MIME-Base64'...
   Installing C:¥Perl¥site¥lib¥auto¥MIME¥Base64¥Base64.dll
   Installing C:¥Perl¥site¥lib¥auto¥MIME¥Base64¥Base64.exp
   Installing C:¥Perl¥site¥lib¥auto¥MIME¥Base64¥Base64.lib
   Installing C:¥Perl¥html¥lib¥site¥MIME¥Base64.html
   Installing C:¥Perl¥html¥lib¥site¥MIME¥QuotedPrint.html
   Installing C:¥Perl¥htmlhelp¥pkg-MIME-Base64-2.11.chm
   Installing C:¥Perl¥htmlhelp¥pkg-MIME-Base64-2.11.hhc
   Installing C:¥Perl¥site¥lib¥MIME¥Base64.pm
   Installing C:¥Perl¥site¥lib¥MIME¥QuotedPrint.pm
   Writing C:¥Perl¥site¥lib¥auto¥MIME¥Base64¥.packlist

(出所)http://member.nifty.ne.jp/hippo2000/perltips/index.htm

 3.ダウンロードしたZIPファイルからのモジュールのインストール

(1) http://www.activestate.com/packages/zips から

  (2) 「Win32-AdminMisc.zip」を DownLoad し、C:¥data に解凍

(3) 以下をコマンドプロンプトで行う
(コマンド) install /location パッケージ位置 パッケージ   

PPM> install /location c:¥data Win32-AdminMisc
Install package 'Win32-AdminMisc?' (y/N): y
Installing C:¥Perl¥site¥lib¥auto¥Win32¥AdminMisc¥AdminMisc.bs
Installing C:¥Perl¥site¥lib¥auto¥Win32¥AdminMisc¥AdminMisc.dll
Installing C:¥Perl¥site¥lib¥auto¥Win32¥AdminMisc¥AdminMisc.exp
Installing C:¥Perl¥site¥lib¥auto¥Win32¥AdminMisc¥AdminMisc.lib
Installing C:¥Perl¥htmlhelp¥pkg-Win32-AdminMisc.chm
Installing C:¥Perl¥htmlhelp¥pkg-Win32-AdminMisc.hhc
Installing C:¥Perl¥site¥lib¥Win32¥AdminMisc.pm
Writing C:¥Perl¥site¥lib/auto/Win32-AdminMisc/.packlist

Perl ファイルをすべて読み込んで出力

$FILE = "c:\\temp\\aaa.txt";
open(FILE,"<$FILE");
@lines=&ltFILE>
close(FILE);
$data = join("", @lines);
print "$data";
=============================================================================

Perl sort関数

書式 @result = sort { $a <=> $b } @list;
    ( {$a <=> $b}:昇順、{$b <=> $a}:降順 )
# CSVファイルのソート例
@sort_go = sort {(split(/¥,/,$a))[4] <=> (split(/¥,/,$b))[4] || (split(/¥,/,$a))[5] <=> (split(/¥,/,$b))[5]} @sort_zen;

1:sort LIST
   @list = (0,1,2,3,10,11,12);
   @result = sort @list;
   @resultは、(0,1,10,11,12,2,3,)となります。

2:sort SUBNAME LIST 『サブルーチンの定義あり』
   sub number {
     if ($a < $b) {
       return -1;
     } elsif ($a == $b) {
       return 0;
     } elsif ($a > $b) {
       return 1;
    }
   }

   sub number {
   $a <=> $b; # <=> 演算子を使う場合
   }

3:sort BLOCK LIST 『サブルーチンの定義なし』
  @result = sort {$a <=> $b } @list;

  例 ハッシュの値でソートする
    @name = ('taro', 'jiro', 'saburo', 'shiro');
   %height = ('taro' => 176,'jiro' => 185,'saburo' => 160,'shiro' => 170 );
    sort { $height{$a} <=> $height{$b} } @name とすると %height の値でソート

  例 CSVの3カラム目の情報でソート(少ない順/多い順)
    @昇順 = sort { (split(/¥,/,$a))[2] <=> (split(/¥,/,$b))[2] } @hogehoge;
    @降順 = reverse sort { (split(/¥,/,$a))[2] <=> (split(/¥,/,$b))[2] } @hogehoge;
      (注)数値の比較は <=>、文字列の比較は cmp

  例 複数キーの場合
   @nums = @caps = ();
  for (@old) {
  push @nums, /=(¥d+)/;
  push @caps, uc($_);
  }
  @new = @old[ sort {
   $nums[$b] <=> $nums[$a]
   ||
   $caps[$a] cmp $caps[$b]
   } 0..$#old
  ];
    #        .. は範囲演算子

4:Schwartzian Transform法
  効率良く複雑な条件でソートする手法。
  例えばカレントディレクトリ以下のファイルを最終更新順で並べ替えるとか。
  元の要素とソート条件から成る無名配列のリファレンスを作って、
  ソートして並べ替えるという流れ。

  # (ex) /etc/passwd をソートして出力
  print map { $_->[0] }
   sort {
   $a->[1] <=> $b->[1] # GID
   ||
   $a->[2] <=> $b->[2] # UID
||
  $a->[3] cmp $b->[3] # login
  }
  map { [ $_, (split /:/)[3,2,0] ] }
  `cat /etc/passwd`;


  # (ex) 名前の長さで並べ替えて出力
  my @list = qw(Perl Ruby JavaScript Java C++ C Python);
  print join " ",
   map { $_->[0] }
  sort {
  $b->[1] <=> $a->[1] # length
   ||
  $a->[0] cmp $b->[0] # name
  }
  map { [ $_, length ] }
  @list;

Perl seek関数の使い方

seek(NAMES,x,y) ポインタを指定した位置に移動
y=0のときは、ファイルの先頭からxバイト目
y=1のときは、現在のファイルポインタが指している位置からxバイト目
y=2のときは、ファイルの終りからxバイト目

(例)1行が10バイト(改行文字も含む)の固定長ファイル
abcdefghi
012345678
ABCDEFGHI

seek(NAMES, 20, 0); # NAMESというファイルハンドル
$data = <NAMES>
で3行目だけを読むことが出来ます。
=============================================================================

Perl CGI 特定のIPアドレスからのアクセスを制限

http://www2.yomogi.or.jp/watanabe/win/share/share_1.htm

# 許可するIPアドレスの登録
@ip_addr_s = (
'192.168.1.1',
'192.168.1.2',
'192.168.1.5',
'192.168.1.9',
'192.168.1.11'
);

# アクセス時のIPアドレスの取得
$ip_addr = $ENV{REMOTE_ADDR};

# IPアドレスの比較
$addr_right = '0';
if ($#ip_addr_s < 0)
{
$addr_right = '1';
}
else
{
foreach $data (@ip_addr_s)
{
if ($ip_addr =‾ /^$data$/) { $addr_right = '1';}
}
}
# 比較した結果の処理
if ($addr_right ne '1') { &error('アクセスは許可出来ません。');}
=============================================================================

pckanri.txtの構成

#
#
# 1,admin,演習室,,032,ecn001,00:e0:00:4d:5a:74,Fujitsu,FMV-6800,l,演習室,157.6.32.1,0,0,0
#
# 順序:フィールド名
# 00:seq
# 01:userid
# 02:user
# 03:registdate
# * 04:line
# * 05:host
# * 06:macadr
# 07:maker
# 08:model
# 09:syoyu
# 10:biko
# * 11:staticip
# 12:staticipreq
# 13:invalidity
# 14:application

# confmake.pl pckanri.txt dhcpd.master
#
open(FIN,$ARGV[0]) || die "001 can't open $ARGV[0]¥n";
open(FOUT,">$ARGV[1]") || die "002 can't open $ARGV[1]¥n";
open(FOUT2,">temp.dat") || die "003 can't open temp.dat¥n";

while(&ltFIN>)
{
@w = split(/,/,$_);
if ( @w[11] !‾ /¥d+¥.¥d+¥.¥d+¥.¥d+/ ) #-- Not StaticIP
{
print FOUT 'subclass "line'.@w[04].'" '.@w[06].';'."¥n";
}
else
{
print FOUT2 "host @w[05] { ".'hardware ethernet '.@w[06].' fixed-address '.@w[11]." }¥n";
}

}

#-- テンポラリファイルの書出し
close(FOUT2);
open(FOUT2,"temp.dat");
while(<FOUT2>)
{
print FOUT;
}


close(FOUT);
close(FOUT2);
close(FIN);

CSV各項目の後スペースをカット

#-------------------------------------
#☆CSV各項目の後スペースをカット
#-------------------------------------
# No11 gyosha_file(業者マスタ)
# 項目名 タイプ 項目長 日本語項目名 備考
# 0 gyosha_no CHAR 12 業者番号
# 1 gyosha_name VARCHAR2 60 業者名
# 2 address1 VARCHAR2 60 住所1
# 3 address2 VARCHAR2 60 住所2
# 4 tel_no1 VARCHAR2 13 電話番号1
# 5 tel_no2 VARCHAR2 12 電話番号2
# 6 daihyo_name VARCHAR2 40 代表者名
# 7 post_no VARCHAR2 7 郵便番号

open(FIN,$ARGV[0]) || die "001 can't open $ARGV[0]¥n";
open(FOUT,">$ARGV[1]") || die "002 can't open $ARGV[1]¥n";
#print " start $aaa ¥n";

while(&ltFIN>)
{
chop;
$_ =‾ s/ / /g; # レコード内の全角空白を半角空白に変換
@w = split(/,/,$_);
# @w[0] # 業者番号
$gyono = substr(@w[0],6,6);
@w[1] =‾ s/¥s*$//; # 業者名 行末スペースカット
@w[2] =‾ s/¥s*$//; # 住所1 行末スペースカット
@w[3] =‾ s/¥s*$//; # 住所2 行末スペースカット
#  @w[4] =‾ s/¥s*$//; # 電話番号1
#  @w[5] =‾ s/¥s*$//; # 電話番号2
@w[6] =‾ s/¥s*$//; # 代表者名 行末スペースカット
# @w[7] =‾ s/¥s*$//; # 郵便番号

$wkstr = join(" ", @w[2], @w[3]);

$outrec = join(",",$gyono,@w[1],$wkstr,@w[4],@w[5],@w[6],@w[7]);
print FOUT "$outrec¥n";

}

#print " end $aaa ¥n";

close(FOUT);
close(FIN);

CSVファイルを読んでOUTファイル作成

#-------------------------------------------------
#☆CSVファイルを読んでOUTファイル作成
#-------------------------------------------------
# 1.サーバの定義部(固定)
#  2.class 部(固定)
#  3.pool部(固定)
#  4.subclass 部(プログラムで生成)
#  5.固定IPホスト部(プログラムで生成)
# host host_name {
# hardware ethernet 00:90:cc:a2:f4:e8;
# fixed-address 192.168.0.113;
# }
#

開始、終了、経過時間を計算

#---------------------------------------------------------------------------------------------
#☆System EventLog を読み込み、日毎のEventLog開始、終了、経過時間を計算する
# イベントログ停止 "07/03/2001","12:30:47","EventLog","INFO","None",6006,"N/A","F111327",""FF000000
# イベントログ開始 "07/03/2001","13:21:36","EventLog","INFO","None",6005,"N/A","NET037",""
#---------------------------------------------------------------------------------------------
use strict;
my $elap;
my $elap_hh;
my $elap_hhx;
my $elap_mm;
my $elap_mmx;
my $elap_ss;
my $elap_ssx;
my $str_pos;
my $end_pos;
#========================================
# ログファイルを読み込み、テーブルへ格納
#========================================
my $sv_date;
my $filout;
my $wk_line;

my $str_time = '"99:99:99"';
my $end_time = '"00:00:00"';

### 1レコード先読み
open(FIN,$ARGV[0]) || die "IN File $ARGV[0] can't open ¥n";
my $rec=&ltFIN>
my @list = split(/,/,$rec);
$sv_date = $list[0];
close(FIN);

open(FIN,$ARGV[0]) || die "IN File $ARGV[0] can't open ¥n";
open(FOUT,">$ARGV[1]") || die "OUT File can't open ¥n";

while (my $rec=&ltFIN>) # ----- ログファイル(syslogxxxx.log)の読込み
{
@list = split(/,/,$rec);

if ($sv_date ne $list[0])
{
&timecal;
print " Date $sv_date $str_time - $end_time = $elap_hhx:$elap_mmx:$elap_ssx¥n";
print FOUT " Date $sv_date $str_time - $end_time = $elap_hhx:$elap_mmx:$elap_ssx¥n";
$sv_date = $list[0];
$str_time = '"99:99:99"';
$end_time = '"00:00:00"';
}


if ($list[5] =‾ /6005|6006/)
{
##print "$list[5]¥n";
if ($list[5] eq "6005")
{ if ($list[1] lt $str_time)
{
$str_time = $list[1];
}
}
else
{ if ($list[1] gt $end_time)
{
$end_time = $list[1];
}
}

}
}
close(FIN);
close(FOUT);
#=====================================================================
# 経過時間計算   Date "01/06/2001" Start "07:54:10" END "15:24:23"
#=====================================================================
sub timecal
{
$str_time =‾ /¥"(¥d¥d):(¥d¥d):(¥d¥d)¥"/;
$str_pos = $1 * 60 * 60 + $2 * 60 + $3;
$end_time =‾ /¥"(¥d¥d):(¥d¥d):(¥d¥d)¥"/;
$end_pos = $1 * 60 * 60 + $2 * 60 + $3;
$elap = $end_pos - $str_pos;
$elap_hh = int($elap / 3600);
$elap_mm = int(($elap - 3600 * $elap_hh)/60);
$elap_ss = $elap - 3600 * $elap_hh - 60 * $elap_mm;
$elap_hhx = sprintf "%02d",$elap_hh;
$elap_mmx = sprintf "%02d",$elap_mm;
$elap_ssx = sprintf "%02d",$elap_ss;
}

ハッシュの要素の存在・定義・真偽


### ハッシュの要素の状態として、
# 1. キーが存在する キーが存在しない
# 2. 値が定義されている 値が定義されていない
# 3. 値が真である 値が偽である
# という区別があります。


my %math_score_of = (
Aiko => 89,
Kenta => 0,
Taro => undef,
); #生徒の数学の点数

require Data::Dumper;
print Data::Dumper->Dump( [ \%math_score_of ] , [ '*math_score_of' ] );
print "\n";

###1: キーの存在を確認する( exists関数を使う )
print "1: キーの存在を確認する(exists)\n";
foreach my $key ( qw( Aiko Kenta Taro Masao ) ){ # 'Masao'は存在しない
if( exists( $math_score_of{ $key } ) ){
print "\$math_score_of{ $key } は存在します。\n";
}
else{
print "\$math_score_of{ $key } は存在しません。\n";
}
}
print "\n";

###2: 値が定義されていることを確認する( defined関数を使う );
print "2: 値が定義されていることを確認する(defined)\n";
foreach my $key ( qw( Aiko Kenta Taro Masao ) ){
# 'Taro' => undef と 'Masao'( 存在しない )は定義されていない
if( defined( $math_score_of{ $key } ) ){
print "\$math_score_of{ $key } は定義されています。\n";
}
else{
print "\$math_score_of{ $key } は定義されていません。\n";
}
}
print "\n";

###3: 真偽を確認する( if文で直接判定 )
print "3: 真偽を確認する(if 値)\n";
foreach my $key ( qw( Aiko Kenta Taro Masao ) ){
# 'Kenta' => 0 と'Taro' => undef と 'Masao'( 存在しない )は偽
if( $math_score_of{ $key } ){
print "\$math_score_of{ $key } は真です。\n";
}
else{
print "\$math_score_of{ $key } は偽です。\n";
}
}

ファイルの入出力


# ファイルを1行づつ入力
open(IN1,$ARGV[0]) || die "001 can't open $ARGV[0]\n";
while(){
処理(各要素は $_に代入されている)
}
close(IN1);
----------------------------------------------------
# ファイルを1行づつ出力
open(OUT,">$ARGV[1]") || die "002 can't open $ARGV[1]\n";
foreach( @list ) {
print OUT $_;
}
close( OUT );

use Smart::Comments

use Smart::Comments
#-----------------------#
デバックツール
#-----------------------
### now []
### ⇒
### line at
### num: $num * 10
### $decimals
### check: $num > 0
for (1..1000000) {
### Evaluating [=== ] % done
}
======実行結果
### now [Wed Oct 31 15:26:35 2007]
### ⇒"D:\test.pl", line 5
### line at "D:\test.pl", line 20
### num: '-802.25'
### $decimals: 2
### $num > 0 was not true at D:\test.pl line 26.
### $num was: '-80.225'
Evaluating [===== ] 48% done

ハッシュとDumper

# 【実行例1】-普通のハッシュ
print "----- DUMP %exam_org -------------------------------\n";
require Data::Dumper;
print Data::Dumper->Dump( [ \%exam_org ] , [ '*exam_org' ] );
print "-------------------------------------------------------\n";

# 【実行例2】-配列のリファレンスをデリファレンスして出力する
#         ハッシュのリファレンスをデリファレンスして出力する
#         (変数名の1文字目を*にすると、自動的に*を%に変えて出力してくれる。)
print Data::Dumper->Dump( [ $age_hash_ref ], [ '*age_hash' ] );


# Dumper オプション
# Indent インデント 0(なし)、1(固定幅)、2(自動可変幅:デフォルト)
# Terse 変数名の出力 0(省略しない:デフォルト)、1(可能であれば省略)
# Sortkeys キー項目のソート 0(ソートしない:デフォルト)、1(ソートする)
#
# $Data::Dumper::Indent = 1;
# $Data::Dumper::Terse = 1;
# $Data::Dumper::Sortkeys = 1;

秀丸カラーマーカーマクロ

//seltopcolumn    範囲選択開始位置のカラム位置を表します。(V5.00以降)
//seltoplineno    範囲選択開始位置のエディタ的に計算した行番号を表します。(V5.00以降)
//selendcolumn    範囲選択終了位置のカラム位置を表します。(V5.00以降)
//selendlineno    範囲選択終了位置のエディタ的に計算した行番号を表します。(V5.00以降)
//--------------------------------------------
//gofileend   ファイルの最後に移動
//gofiletop   ファイルの先頭に移動
//--------------------------------------------
//column    カーソルのカラム位置を表します。カーソルが論理行頭にいる時が0です。
//lineno    カーソル位置の、エディタ的に計算した行番号を表します。ファイルの先頭が1です。
//--------------------------------------------
//範囲選択をした部分に、一時的なカラーマーカー(色付け)をします。(V7.00以降)
// 任意の位置に、幾つでもカラーマーカーを付けることができます。
// 以下のような感じで使います。
//
//colormarker 文字色, 背景色, スタイル, 種類, ユーザーデータ
//
// 文字色 0x0000ffが赤、0x00ff00が緑、0xff0000が青 -1が透明
// スタイル 指定しない場合 11番(透過)0 普通 1 ボールド
// 種類 0 編集しても維持 1 編集したら分裂 2 編集したら消える
// ユーザーデータは、識別するために任意の値
//
// パラメタは省略できます。
// 全て何も指定しないか、全て透明・透過を指定すると、範囲選択に含まれるカラーマーカーを削除します。
// 既にカラーマーカーがある位置にカラーマーカーを付けた場合は上書きされます。
// ファイルに保存されることはありません。

//movetolineno 桁番号, 行番号; カーソルを移動 movetolineno 1, 1; ファイル先頭


gofileend;
#endline = lineno;
disabledraw;

#a = 1;
while( #a < #endline ) { //---------------------- movetolineno 1, #a; beginsel; movetolineno 8, #a; colormarker 0x0000ff, -1, 0, 0; endsel; //---------------------- movetolineno 8, #a; beginsel; movetolineno 11, #a; colormarker 0x00ff00, -1, 0, 0; endsel; //---------------------- movetolineno 11, #a; beginsel; movetolineno 13, #a; colormarker 0xff0000, -1, 0, 0; endsel; #a = #a + 1; } enabledraw;

ExcelVBAイベント

ExcelVBAイベント-数字キーの押下でカーソル移動

(1) 数字キー押下でイベント発生

該当ワークシートをダブルクリックして
「Private Sub Worksheet_SelectionChange(ByVal Target As Range)」

から始まるコードを記述
[SelectionChange イベント]は、ワークシートで選択範囲を変更したときに

発生します。Target:新しい選択範囲が格納されている

(コードの概要)
カーソルが動いたときにイベントが発生するので、
移動先(Target.Column) が A[1],B[2],C[3],G[7],H[8]列 の時には、

Onkeyを設定してキーの入力制御を行う
移動先(Target.Column) が A,B,C,G,H列 以外の時には、Onkeyを設定を解除する

「Onkey」で呼び出すサブルーチンは、標準モジュールとして記述し、
項目をチェックするときは、ActiveCellを使う

(Targetは移動先を示しているので、右となりになっている)

'

'
' A列[1]「第1項目」の単体チェック
'
If ActiveCell.Column = 1 Then
  If Index >= 1 And Index <= 6 Then

   'continue
  Else MsgBox ("第1項目は 1~6まで")
   'Cells(ActiveCell.Row, ActiveCellactivecell.Column).Select
    errflg = 1
  End If
End If
(2) 複数文字入力の場合 (1)と同様に該当ワークシートをダブルクリックして、
「Private Sub Worksheet_Change(ByVal Target As Range)」
を記述
[Change イベント] セルが変更された時に発生します。
Target:変更された範囲が格納されている

(コードの概要) 値が変更されたときにイベントが発生するので、
変更したセルの列番号(Target.Column) で項目チェックを行う
'
' D列[4]「製品番号」の単体チェック
'
If Target.Column = 4 Then
If Len(Target.Value) <> 7 Then
MsgBox ("製品番号が7桁になっていません")
Cells(Target.Row, Target.Column).Select
End If
End If

-------------------------------------------------------------
(1),(2)を組み合わせて、1桁入力では「Enter」なしに次のセルに移動
複数文字入力では「Enter」で移動を実現する

WordでExcelのデータを差し込み印刷

WordでExcelのデータを差し込み印刷
日付の書式が 9/21/2008 のようになる

このWordの差込印刷の仕様
電話番号や通貨も書式が変わってしまう

【データ差込前に設定する場合:ファイル形式を変換して差し込む方法】
1) メニューの[ツール(T)]-[オプション(O)]をクリック
2) [オプション]ダイアログボックスが開きます
3) [全般]タブをクリック
4) [文書を開くときにファイル形式を確認する(O)]のチェックボックスをチェック
5) [OK]ボタンをクリックし、[オプション]ダイアログボックスを閉じます

以上の操作をしてから、差込印刷ウィザードを実行 
[差し込み印刷ウィザード] で差し込むデータ (宛先) を選択すると、 
[データ ファイル形式の確認] ダイアログボックスが表示

[データ ファイル形式] ボックスの一覧から
[Microsoft Excel ワークシート DDE (*.xls)] を選択
[OK] ボタンをクリック
Excelで指定した書式で日付が表示される

Spreadsheet::ParseExcel

#-------------------------------------------------
# (定義元)スクリプトと同じフォルダ内の「kamoku.xls」
# (Excelの項目・・試験区分, 科目コード, 枚数)
#
# (格納先ハッシュ)
# $t_kmk{試験区分}{科目コード}=枚数
#-------------------------------------------------
my $format = new Spreadsheet::ParseExcel::FmtJapan->new(Code => 'sjis');
my $xlsfile = Cwd::getcwd().'\kamoku.xls';

my $sheet = new Spreadsheet::ParseExcel->Parse($xlsfile, $format)->{"Worksheet"}[0];

my $maxRow = $sheet->{"MaxRow"};
my $maxCol = $sheet->{"MaxCol"};

for(my $row=1; $row<=$maxRow; $row++) { # Excel 1行目は見出し行で対象外
  $wk_skbn = $sheet->{"Cells"}[$row][0]->Value;
  $wk_kmk = $sheet->{"Cells"}[$row][1]->Value;
  $wk_maisu = $sheet->{"Cells"}[$row][2]->Value;
  # $t_kmk{試験区分}{科目コード}{maisu}=枚数
  $t_kmk{$wk_skbn}{$wk_kmk} =$wk_maisu;}
}

# 科目テーブル $t_kmk{試験区分}{科目コード}=枚数
print " --- 科目テーブル \$t_kmk{試験区分}{科目コード}=枚数 \n";

foreach $key1_skbn (sort keys %t_kmk){
  foreach $key2_kmk ( sort keys %{$t_kmk{$key1_skbn}} ){
    print " $key1_skbn,$key2_kmk,$t_kmk{$key1_skbn}{$key2_kmk}枚\n";
  }
}

dyno2316 ページ

dyno2316 ロヒミフ ページ
http://dyno2316.web.fc2.com/