Perl

指定フォルダ内の重複ファイルを検出するプログラムの修正

指定フォルダ内の重複ファイルを検出するプログラムを参照の事。 サイズ0のファイルが検出されたり、3つ以上の重複ファイルが2つ以上の組み合わせに分かれていたりと、大量のファイルを扱うには不便な箇所が色々と見つかったので、修正。 空のファイルを無視…

サクラエディタ外部マクロのPerlスクリプト

サクラエディタではユーザーが作成したマクロを登録でき、キーマクロ(mac)や、その他WSH(Windows Scripting Host)で使用可能なスクリプト言語(js, vbs等)を使って記述することもできる。 WSHがサポートしていればPerlスクリプト(pls)も使えるので、それで複…

正規表現パターンマッチングのPerlとGroovyでの書き方の違い(2010-5-20の修正・補足版)

キーワードが含まれているかを判定 Perl(=~を使った場合) my $text = "apple banana cherry"; print ($text =~ /banana/ ? "yes\n" : "no\n"); Perl(!~と!/.../を使った二重否定) my $text = "apple banana cherry"; print ($text !~ !/banana/ ? "yes\n" : …

正規表現パターンマッチングのPerlとGroovyでの挙動が異なる

my $text = 'apple banana cherry'; if ($text =~ /banana/) { print "YES\n"; } else { print "NO\n"; } def text = 'apple banana cherry' if (text ==~ /banana/) { println "YES" } else { println "NO" } 同じ正規表現パターンでも、Perlでは"YES"、Gro…

PerlでSQL接続/操作を学ぶための自作ドリル

DBI経由でPostgreSQLに接続し、データの登録/参照を行う。 問題 CSVファイルの内容をDBに登録する DBとテーブルはPgAdmin3で用意する。 CSVファイル(sample.csv) name,email,address "山田 太郎",taro.yamada@xxx.com,"東京" "田中 次郎",jiro.tanaka@xxx.c…

XML::TreePPを使ってみる

XMLファイルを読み込んで内容を表示する。 ソースコード use strict; use warnings; use utf8; use IO::File; use XML::TreePP; use Data::Dumper; binmode STDIN, ':utf8'; binmode STDOUT, ':utf8'; binmode STDERR, ':utf8'; # Input Check if (@ARGV != …

XML::LibXML::Simpleを使ってみる

XMLファイルを読み込んで、マップ形式で表示してみる。 ソースコードは以下の通り use strict; use warnings; use utf8; use IO::File; use XML::LibXML::Simple; use Data::Dumper; binmode STDIN, ':utf8'; binmode STDOUT, ':utf8'; binmode STDERR, ':ut…

PerlでXMLの扱いを学ぶための自作ドリル

モジュールはXML::LibXMLを使用。 問題 XML書き出しスクリプト name, email, addressを入力して、XMLでファイルに書き出す。(項目名はプロンプトとして表示する。) 実行結果 $ perl output_xml.pl name : 山田太郎(改行) email : taro.yamada@xxx.com(改行…

PerlでCSVの読み書きを学ぶための自作ドリル

CSVを扱うと同時に、パッケージモジュールの扱いにも慣れさせるための問題と解答例。 モジュールはText::CSV_XSを使用。 問題 CSV書き出しスクリプト name, email, addressを入力して、CSVでファイルに書き出す。(項目名はプロンプトとして表示する。) 実…

Perlで文字列操作を学ぶための自作ドリル(日本語仮名変換)

こちらは日本語文字列(ひらがな/カタカナ)を扱う処理。 問題 ひらがな→カタカナ(キー入力→画面出力) 実行結果 $ perl kana_h2k.pl あいうえお カキクケコ(改行) アイウエオ カキクケコ さシすセそ タちツてト(改行) サシスセソ タチツテト (Crtl+Dで終…

Perlで文字列操作を学ぶための自作ドリル(英大文字/英小文字)

研修生に教えるための問題と解答例を作ってみた。 問題 英小文字→英大文字(キー入力→画面出力) 実行結果 $ perl uppercase.pl abcde(改行) ABCDE This is perl program.(改行) THIS IS PERL PROGRAM. 12345xyz ZYX67890(改行) 12345XYZ ZYX67890 (Ctrl+Dで…

コマンドシェルのリダイレクトを使ったファイル入出力+エラーログ出力

標準入出力経由でファイルの入出力を行う perl program.pl < infile.txt > outfile.txt この場合、STDINから読み込まれるのはキーボード入力ではなくファイルinfile.txtの内容となる。 また、print命令で画面に表示する代わりにファイルoutfile.txtに書き込…

範囲演算子でアルファベットの配列を作成できる

数値で範囲演算子を挟む事で数値が1ずつ増える数列の配列が作れる。 ソース1-1 my @num_list = (0 .. 10); print join (', ', @num_list) . "\n"; ソース1-2 print join (', ', (0 .. 10)) . "\n"; 出力結果1 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 文字列でも同…

Perl上でシステムコマンド実行する際の小技メモ

普通に実行する `$command`; print `$command`; system($command); 戻り値を受け取る my $result = system($command); 標準出力を受け取る my $result = `$command`; open my $rs, "$command |"; my @rlist = <$rs>; close $rs; my $result = join '', @rlis…

Perlの引数を内部コード化する

ファイル入出力や標準入出力は、binmodeでエンコーディングを設定しておけば、自動的に内部コードに変換されるが、環境変数やコマンドライン引数は変換されない事があるため、別の処理で内部コード化する必要がある。 その処理をサブルーチンとして用意して…

Perl DBIでAccessクエリに接続し、データをハッシュの配列で取得する際、キーが重複する事がある

クエリの中に複数のテーブルでリレーションを作った場合、SELECT文で取り出す際のフィールド名は、「テーブルA.フィールドB」という風に表される事がある。特に、複数のテーブルに同じフィールド名が使われている場合、これがないとフィールドの区別が付かな…

mapで繰り返し処理を短縮・追記

サブルーチンを使わずに、さらに短縮してみる。 my %table_hash = map{ my $name = $_; my $fh; open $fh, '; close $fh; map { $_ =~ s/[\r\n]$//g } @text; $name => [ map{ [split(',', $_)] } @text ]; } ('a', 'b');

mapで繰り返し処理を短縮

カンマ区切りデータをまとめる map不使用 my $fh; my @table; my $table_hashref = {}; open $fh, ') { $line =~ s/[\r\n]$//g; my @record = split(',', $line); push @table, \@record; } $table_hashref->{'a'} = \@table; open $fh, ') { $line =~ s/[\r…

PerlでShiftJIS::Regexpモジュールを使う際の注意点

2バイト文字のコードにエスケープ文字コード「0x5c」(¥または\)が含まれるいわゆる「ダメ文字」をマッチングパターンに使う際、文字データをそのまま使うと意図したマッチング結果にならない場合がある。 そこで、これを避けるためにマッチングパターンに含…

指定フォルダ内の重複ファイルを検出するプログラム

指定したフォルダ内の(サブフォルダ内も含む)全てのファイル名とサイズを取得し、同じサイズのファイル同士を比較して、内容が全く同じファイルを検出するPerlスクリプト。 UTF8用なので、ソースコードもUTF8にする必要がある。Shift-JISにする場合は、"¥"…

Perl正規表現の罠と罠はずし その3

文字列を複数行として扱う修飾子「m」を付けると、改行文字による行区切りの後を行頭、前を行末と見なすので、行頭・行末アンカーを置き換えなくてもそのまま使える。 $text = "12345\nABCDEFG\n12345\n"; print '=' x 10 . '(1-0)' . '=' x 10 . "\n"; prin…

Perl正規表現の罠と罠はずし その2

マッチングパターン「.」に改行文字を含める場合、マッチング修飾子「s」を用いるが、行末アンカー「$」を付けた場合に、キチンと行末(改行の前もしくは文字列の末尾)を認識するマッチングパターンは以下のようになる。 (?:(?:$)|(?=[\n])) 行頭・行末それ…

Perl正規表現の罠と罠はずし

改行文字を含む文字列をマッチング対象とし、改行文字もただの文字として扱う場合、オプションにsを付けるが、行頭アンカー(^)を付けた文字列をマッチングパターンにすると、うまくマッチングしない不具合が起こる。 そこで、行頭アンカーを"(?:(?:^)|(? my …

PerlでCP932文字コードの2バイト文字によるマッチングを行う

Perlで全角2バイト文字をマッチングすると、CP932(ShiftJIS)環境では文字区切りが存在しないため、誤判定や文字化けの元になる。 UTF8にコード変換すれば一発で解決するが、機種依存文字などの特殊文字や、複数の区分に重複登録されている文字などの関係で、…

Perlでの日本語マッチング

金村さんに教えてもらった参考サイト Perl 5.8.x Unicode関連 404 Blog Not Found:perl - Encode 入門 perl5.8のUnicodeサポート Shift-JISテキストを正しく扱う WindowsでPerlを使うもんじゃない

PerlでAccessデータベースに接続

Accessデータベースのテーブルからフィールド名を取得する方法 ODBC経由でデータベースと接続するには my %TYPES = $db->ColAttributes(SQL_COLUMN_TYPE_NAME); TYPESにはフィールド名と型名のハッシュマップが格納される。

PerlでExcelファイルをCSV形式に変換

Win32::OLEモジュールを使うと、PerlからWordやExcelなどのファイルにアクセスできるようになる。ExcelシートからCSV形式への変換は、xlsファイルから読み込んだブックのセルの内容を取得し、カンマで連結したものをシート別にファイルへ書き出す方法と、xls…

PerlからODBC経由でAccessファイルの内容を操作する

ODBCはWindowsで標準サポートされているデータベースドライバで、他の言語からでも使える。 JavaでJDBCを使ったが、そのようなものだろう。 Perlの場合はDBIモジュールからデータベースとして接続できるらしい。 ODBCによるAccess操作 SQLステートメント

Perlの配列操作に関する知識の食べ残し

配列の末尾の添字を得るには @TEST_ARRAY = (1 .. 5); print $#TEST_ARRAY . "\n"; @TEST_ARRAY = (); print $#TEST_ARRAY . "\n"; 4 -1 配列を後方から参照する添字の書き方 @TEST_ARRAY = (1 .. 5); print $TEST_ARRAY[-1] . "\n"; print $TEST_ARRAY[-2] …

出社3日目

今日はPerlの文字列処理に集中。 Perlの文字コードに関する操作 例えば、CP932で書かれたファイルをバイナリデータとして読み込み解析する場合、Perlだと内部コードはUTF8になるので、文字列リテラルとの照合の際、そのままだと正しい結果にならない。 さら…