Browsing articles in "perl"
6月 28, 2012
inomoto

Illustrator CS4でのfile pathの取得&perlで索引の連続ノンブルをまとめる

今回はバグ(?)報告とPerlのルーチンを投稿します.

1 Illustrator CS4でのfile pathの取得結果が,OSのバージョンによって変わる

この現象は下記の経緯で発見されました.

1 Mac OSX 10.4 & Illustrator CS4の環境で,リンク画像のパスを取得するスクリプトを作成
2 その後,Mac OSX 10.7 & Illustrator CS4での動作も求められる
3 動かしてみると,予期せぬ箇所でエラーが発生している
4 調査の結果,下記の事実が判明する
 「file pathを取得すると,10.4と10.7とでは得られる結果が異なる」

スクリプトエディタのログのキャプチャを掲載します.

10.4での挙動がこちら.
10.7での挙動がこちら.
10.4では,Unicode textにキャストする前後で同じMacintosh形式のパスが帰ってくるのに対し,10.7では,Unicode textにキャストする前はバイナリのようなdata形式になってしまっています.
バグなのか仕様なのかは不明ですが,このような混乱の素が放置されているのは困りますね…….

2 索引の連続ノンブルをまとめる perl ver.

市川せうぞー様がrubyでのルーチンをblogに掲載してらっしゃいますが,ちょっとrubyが使用できない環境にあったので,perlで作成してみました.
かなり力技なので,美しくないです(^^;).もっといい方法があったら教えてください.
また,あまりテストをしていないので,バグがでるケースもあるかもしれません.その場合もご指摘いただけると幸いです.
[perl]
#———————————————-
#ノンブルの配列中の連続した部分をハイフンで連結した文字列にして返す
#(「1,2,3,4,5,8,9,10」の配列を「1-3,4,5,8-10」にする)
#———————————————-
sub GetSuccess {
my @in = @_;
my @arr;

#配列の要素が2つだけならカンマで連結して返す
my $len = @in;
if ($len == 2) {
return join(",", @in);
}

#3つ以上の場合
my @result;
my @serial;
my $prev;
for(my $i = 0; $i < @in; $i++) {
my $num = $in[$i];

#最初の要素はリストに入れるだけ
if ($i == 0) {
$prev = $num;
push (@serial, $prev);
next;
}

#ノンブルが続いている箇所を固まりにして配列に入れる
if ($num – 1 == $prev) { #続き要素なら
push (@serial, $num); #続き要素用の配列に入れる
} else { #ノンブルが飛んだら
push (@result, [@serial]); #続き要素の配列をリファレンスにして結果配列に入れる
@serial = (); #続き要素用の配列をリセット
push (@serial, $num);
}
$prev = $num; #直前の番号を更新
}
push (@result, [@serial]);

#結果配列の内容を走査
my @retArr;
foreach my $r(@result) {
my @r = @$r;
my $cnt = @r;
my $val;
if ($cnt >= 3) { #3以上の配列なら最初と最後をハイフンで連結
$val = join("-", $r[0], $r[-1]);
} else { #2以下ならカンマで連結
$val = join(",", @r);
}
push (@retArr, $val);
}

# print join(",", @retArr), "\n";
return join(",", @retArr);
}
[/perl]

2月 8, 2012
amemiya

Perl Script 習作

Perlのブラッシュアップのためにサブルーチン化した習作を投下します。元はInDesignから書き出したxmlテキストをタブ区切りテキストに成形するスクリプトの一部。内容は順不同に出現するフィールド名のタグで挟まれた部分を抽出して並び替えて揃えるというものです。↓こんな感じのタブ区切りテキストを表組に使えるテキストに加工するのに作りました。

ちょっと記述が長いかもしれないので、折りたたんでおきます。
(シンタックスハイライトを使って整形しました。2012/2/19)

Continue reading »