Perl でファイルのタイムスタンプを変更する

小ネタ。「【Unix】タイムスタンプを変更する」を調べたときに使った Perl スクリプト。

#!/usr/bin/perl use strict;
use warnings;
use Date::Manip;
my @s = stat "IMG_0036.MOV";
my $atime = $s[8];
my $mtime = UnixDate "2010-08-14T14:29:17", "%s";
utime $atime, $mtime, "IMG_0036.MOV";

Perl でファイルのタイムスタンプを変えるには utime 関数を使う。例では atime は元のファイルのものをそのまま使い、mtime だけを指定の日時に変更している。どちらのパラメータもエポック時で指定する必要があるが、その際 Date::Manip モジュールの UnixDate 関数を使うと便利だ。

【Perl】Date::Manip モジュールで日付文字列を解析する(関数型インターフェイス編)
https://blog.delphinus.dev/2010/07/date-manip-in-functional-interface.html

PAR で Perl スクリプトを exe 化する(ActivePerl 5.12.2 編)

もう 3 回目になるが、Perl スクリプトを exe 化する方法について。Perl が 5.12.2 にアップデートしたのでまとめてみた。

PARでPerlスクリプトをexe化 @ ActivePerl 5.10.1 build 1007
https://blog.delphinus.dev/2010/02/par-activeperl-5101-build-1007.html

ActivePerl 5.12 で PAR::Packer をインストール
https://blog.delphinus.dev/2010/04/install-par-packer-on-activeperl-5120.html

必要モジュールのインストール

まずは、PPM(Perl Package Manager)を使って必要なモジュール(+α)をインストールする。

Continue reading

【Perl】my と our と local と……

当たり前のことなのだけど、改めて纏めてみる。レキシカルスコープとパッケージの範囲って全然違うんだなあ。

ourmy

#!/usr/bin/perl
use strict;
use feature qw! say !;

package AAA;
our $our_var = 123;
my $my_var = 567;

package DDD;
say '$our_var      : ' . ( $our_var      // "undefined" );
say '$AAA::our_var : ' . ( $AAA::our_var // "undefined" );
say '$DDD::our_var : ' . ( $DDD::our_var // "undefined" );
say '$my_var       : ' . ( $my_var       // "undefined" );
say '$AAA::my_var  : ' . ( $AAA::my_var  // "undefined" );
say '$DDD::my_var  : ' . ( $DDD::my_var  // "undefined" );
$our_var      : 123
$AAA::our_var : 123
$DDD::our_var : undefined
$my_var       : 567
$AAA::my_var  : undefined
$DDD::my_var  : undefined
  1. ourmy もレキシカルスコープ全体で有効になる。この例の場合、その範囲はスクリプト全体となる。
  2. レキシカルスコープ内では例えパッケージが違っていても参照できる(10, 13 行目)。
  3. our は変数をパッケージの名前空間に紐付けする。つまり、グローバル変数を作るmy にそのような効果はないのでパッケージ名を付けても参照できない(14 行目)。

Continue reading

【Perl】use 5.12.0 !!

小ネタ。5.10.0 以降いくつかの予約語が追加されたが、互換性のために標準では有効になっていない。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
binmode STDOUT => ":utf8";

# say は使えない
say "Hello, World!";
# でも Defined-or 演算子はエラーにならない
my $t = undef // "未定義です!";

実行例

$ perl testSay.pl
String found where operator expected at testSay.pl line 8, near "say "Hello, World!""
(Do you need to predeclare say?)
syntax error at testSay.pl line 8, near "say "Hello, World!""
Execution of testSay.pl aborted due to compilation errors.

Continue reading

【Perl】文字化けしないメールの送り方

Gmail の SMTP サーバを使ってメールを送るのに四苦八苦したメモ。次のサイトを参考にして書いてみた。

Gmail の SMTP を利用して Perl からメール送信(添付ファイル付) – memo.mzt
http://d.hatena.ne.jp/mzt/20080219/p1

Encode モジュールでの MIME Encode
http://www.ksknet.net/perl/encodemime_enco.html

ただ送るだけなら割と簡単なのだが、文字化けを防いだり、第三、第四水準といった最新の文字セットを含めようとすると結構複雑。この本が大変参考になった。

プログラマのための文字コード技術入門
http://www.amazon.co.jp/dp/477414164X/

Continue reading