2012年11月1日木曜日

フォルダ配下のファイルをgrep

"findでxargs使うのはしょぼいっすよね"
みたいなツウィートを見て
"ぬ、xargs使うオレかっけーって思っているおれがいるのは内緒…"
と思いながらxargs使わないでfindとgrepを組み合わせる方法を探してみました。
いつもはこんな感じ。

find . | grep "*.pl" | xargs grep "takuan"

でもfindだけでいけた。

find . -type f -name "*.pl" -exec grep -n "takuan" {} \; -print

ふええええ(´・ω・`)

2012年10月23日火曜日

Perlで文字コード判別

たまにnkf入っていないサーバーとかあるので、そんな時はPerlで文字コードを調べる。。こともあるかも。

今こんな感じで書いているけど、おかしいorもっと簡潔にかけるなら修正する。
#!/usr/bin/perl
use Encode::Guess qw/shift-jis euc-jp 7bit-jis/;
local $/ = undef;
my @data = <STDIN>;
close(IN);
my $enc = Encode::Guess->guess(@data);
ref($enc) || die "Can't guess: $enc";
print "Encode => ". $enc->name;
print "\n";
view raw guess.pl hosted with ❤ by GitHub
と、見せかけnkfがないならpiconv使えばいいじゃない!

PerlでQuotedPrintをデコード/エンコードするワンライナー

MIME::QuotedPrintを使う

QuotedPrintにエンコード

$ echo "エンコード文字" | perl -M'MIME::QuotedPrint' -e 'while (<STDIN>) { print encode_qp($_); }'
=E3=82=A8=E3=83=B3=E3=82=B3=E3=83=BC=E3=83=89=E6=96=87=E5=AD=97

QuotedPrintのデコード

$ echo "=E3=82=A8=E3=83=B3=E3=82=B3" | perl -M'MIME::QuotedPrint' -e 'while (<STDIN>) { print decode_qp($_); }'
エンコ

Base64操作はコマンドで

Base64は、Linuxのcoreutilsに含まれているので素直にそれ使う。方が楽だと思う。

Base64エンコード

$ echo "べーすろくよん" | base64
44G544O844GZ44KN44GP44KI44KTCg==

Base64デコード

$ echo 44G544O844GZ44KN44GP44KI44KTCg== | base64 -d
べーすろくよん

ついでにヘッダーで使うエンコードのフォーマット

=?{charset}?{B or Q}?{Encoded String}?=

例.
=?utf8?B?44G544O844GZ44KN44GP44KI44KTCg==?=

結果.
「べーすろくよん」と表示される。

ワンライナー

っていいね!

2012年10月22日月曜日

PerlでGmailのメールをAppendする

Net::IMAP::Clientを使ってメールをAppend。

#!/usr/bin/env perl
use Net::IMAP::Client;
use Data::Dumper;
use strict;
use warnings;
# 引数チェック
if (@ARGV != 4){
print "Usage: file.pl <Server> <User> <Pass> <InputMail> \n";
die;
}
my $imap = Net::IMAP::Client->new(
server => $ARGV[0],
user => $ARGV[1],
pass => $ARGV[2],
ssl => 1,
port => 993
) or die "Could not connect to IMAP server";
# ログイン
$imap->login or die($imap->last_error);
# メールをAppend
my $eml = readEml($ARGV[3]);
$imap->append('INBOX', \$eml);
# 終了
$imap->quit;
print "Append end.\n";
# emlファイル読み込み
sub readEml {
my $path = shift;
open(IN, "<", $path);
read (IN, $eml, (-s $path));
close IN;
return $eml;
}
view raw imapAppend.pl hosted with ❤ by GitHub

PerlでGmailのメールを保存

とりあえず貼っておきます。

#!/usr/bin/env perl
use Net::IMAP::Client;
use Data::Dumper;
use strict;
use warnings;
my $imap = Net::IMAP::Client->new(
server => $ARGV[0],
user => $ARGV[1],
pass => $ARGV[2],
ssl => 1,
port => 993
) or die "Could not connect to IMAP server";
# ログイン
$imap->login or die($imap->last_error);
# INBOXを選択
$imap->select('INBOX') or die($imap->last_error);
# メールをFetch
my $data = $imap->fetch('*', 'BODY.PEEK[]');
# 配列の場合
if( ref($data) eq 'ARRAY' ){
foreach my $mail (@$data) {
print $mail->{'UID'};
print $mail->{'BODY[]'};
createEml($mail->{'UID'}, $mail->{'BODY[]'});
}
# 配列じゃない場合
} else{
print $data->{'UID'};
print $data->{'BODY[]'};
createEml($data->{'UID'}, $data->{'BODY[]'});
}
# 終了
$imap->quit;
# emlファイル生成
sub createEml {
my $uid = shift;
my $body = shift;
# 保存フォルダ作成
if (!-d $ARGV[3]){
mkdir $ARGV[3];
}
my $emlDir = $ARGV[3] . '/' . $ARGV[1];
if (!-d $emlDir){
mkdir $emlDir;
}
# eml保存先
my $eml = $emlDir . '/' . "${uid}.eml";
open( my $FH, ">", $eml )
or die "Cannot open file for write: $!";
print $FH $body;
close $FH;
}
view raw imapFetch.pl hosted with ❤ by GitHub

2012年8月28日火曜日

PerlBeginners #4 行ってきました

お疲れ様でした!初参加でした!

今回のテーマは「オブジェクトとパッケージ」でした。
一応、概念は別の言語で理解しているつもりなのでPerlでもいけるだろう、と思いましたがPerlのオブジェクト指向よくわからない/(^o^)\

あと、Acme全集2012を入手しました。

メモ

Perlのオブジェクト指向で気になったところをメモると
  • use parent 'Animal'; で継承
  • use parent ('Cat', 'Bird'); 多重継承可能!
  • lib/ 配下に置くのが主流のよう
  • ファイルの最後には「1;」を書く(trueな値を書く)
  • Mouse使うのもあり。
  • Mixin的な事をしたい場合、Exporterを使う
    • 基本構文ではない
  • URI::httpは演算子のオーバーロードをしている
    • なるほど、use overload ('""'     => sub { ${$_[0]} },)で文字列として評価しようとした時の動きを変えている様子。
    • ${$_[0]} } の意味がよくわからない…オブジェクト自身($_[0])を${}で囲んでいる。するとなぜか値が返ってくる
      • 確かに「warn Dumper ${ $res->{link} };」の様に${}で囲めばうまくいく!
    • 多分blessの値を返してる。
      • インスタンス変数のイメージでOK?
    • ${$_[0]} } は、オブジェクト自体をデリファレンスしているということ??
    • 色々試してみました

@ytnobodyさんのgithubからLTで使っていたサンプルコード入手して、ゴニョゴニョ触ってみました。blessでインスタンスを作るなどして、なんとなくちょっと分かってきた気がしてます。

ググった

  • my $class = shift; で何をshiftしているのか分からなかったけど、$_;  @_;が省略されているっぽい。
    • 【追記】@toku_bass さんに$_ではなく@_が省略されていることを教えてもらいました!
  • $オブジェクト->サブルーチン(); で呼ぶときは第一引数にはオブジェクト自身が入る。
なるほど。

ビギナーズセッション

@__papix__さんの発表
pappixさん、次は別のpmにも行かれるようで行動力に驚きました。

発表内容

オブジェクトやパッケージの概念を理解するのに役だったモジュールは?
⇛ @ytnbodyさんの回答
・以下のピンク色のページが役に立った
http://www.rwds.net/kuroita/program/Perl_oo.html
・LWP::UserAgentを操作してオブジェクトの操作に慣れるのもオススメ

懇親会

ハワイ料理でした。



初参加でしたが、色々と話してくれたので楽しめました。
「Hachioji.pmはすごくたのしい!」とすっごい押していました。Hachioji.pmは凄いところらしいです…!