Perl

Perlで未定義メソッドを捕捉する

先日のエントリ、『ZabbixAPI.pm作ってみた』に出てくるこのようなコード、 $za->apiinfo_version(); $za->hostgroup_get({output => "extend"}); 実は以下のコードと等価です。 $za->call_api("apiinfo.version"); $za->call_api("hostgroup.get", {output …

ネストする正規表現

『メールアドレスはネストしたコメントを持つことができるので正規表現で表わすのは不可能である』 というのは本当だろうか。 正規表現のネストが可能かというのは、実際のところは正規表現の定義と実装による。 PerlやRubyだと、これは可能だ。 試しに『f(g…

ZabbixAPI.pm作ってみた

基本的にZabbixAPIの、ただのラッパーです。 APIのクラス、メソッドをアンダースコアでくっつけたもの(host.getならばhost_get())を呼び出せます。 引数はparamsのハッシュリファレンスです。 サンプルをいくつか APIバージョン、ホストグループの一覧を取…

ログの追記ぶんだけを取り出す

一定時間ごとにログを集計、監視をするときに前回からの差分だけ取り出すツールが欲しかったので作りました。 使い方 実行するごとに、指定したファイルの前回実行からの追記分を出力します $ ./logtail.pl /tmp/test.log 1 2 3 $ ./logtail.pl /tmp/test.lo…

WWW::MobileCarrierJPインストール

『IPアドレスブロックを集中管理する方法と、その活用法』 で紹介されているupdate-mobilejp-cidrを使おうとして、 WWW::MobileCarrierJPのインストールでちょっとハマったのでメモ。 なんかインストールこけちゃうよ!! [root@cent ~]# cpan WWW::MobileCa…

Perlでバッファリング抑止

前回の続きです。 Perlの出力バッファリングを抑止したいときはオートフラッシュを有効化します。 そうするとprint、printf、writeを実行するごとにバッファがフラッシュされる、つまりprint、即出力が実現できます。 じゃやってみます。 標準出力のオートフ…

Perlの出力バッファリング

Perlでprint関数を実行してもすぐに画面に表示されない・・・ 仕様です。print、即出力を想定してると痛い目みます。 Perlでは出力されるべき文字列はまずはメモリにバッファリングされ、決められた条件を満たした時にまとめて出力されます。 その基本的な考…

Shibuya Perl Mongersテクニカルトーク#11

初参加してきました!!もちろん聞くだけです!! 諸事情あってズボンのケツが思いっきり破れてましたがめげずに行ってきました。 いやーレベルが高い。というかレイヤが低いww というのも今回のテーマは"no Perl; use x86;"。 1時間遅刻で入った最初の2つ…

Perlで破壊的だったり破壊的でなかったりする関数を書く

引数を上書きしてしまう関数を破壊的関数と言います。 Perlだとchompが代表的ですね。 $str = "abc\n"; chomp $str; ### $strの中身が書き換わる(改行が削除される) print $str; ucやsortは対照的に、引数には変更を加えず変更後の値を返り値で返します。 …

テキストファイルを見つける

findのオプションにはなさそうだけど、Perlのファイルテスト演算子には-Tがあります。 $ find . | perl -nle 'print if -f && -T' ./access_counter.pl ./count.dat ./db_login_test.php ./index.html ... 他にどんなファイルテスト演算子があるかはperldoc…

IPアドレス、MACアドレスをインクリメント

IPアドレス、MACアドレスをインクリメントしたい、というへんな依頼を受けたのでスクリプト書いてみた。 どっちも基本方針はこう。 いったん数値に変換 インクリメント 文字列に戻す そしてモジュールなにも使わない。 IPアドレス 「ちゃんとしたIPアドレス…

Perlで標準関数の一覧を表示

あの関数の名前なんだっけ・・・というときはPod::Functionsを使ってみましょう。 こんな変数が宣言されてます。 %Kinds カテゴリ、関数リストのハッシュ %Type 関数、カテゴリのハッシュ %Flavor 関数、その概要のハッシュ %Type_Description カテゴリ、そ…

perl5.6をインストール

ちょっと調べたいことがあるのでPerl5.6.2をインストール。 標準は5.8のまま、別コマンドで呼び出せるようにします。 $ wget http://www.cpan.org/src/perl-5.6.2.tar.gz $ tar xvzf perl-5.6.2.tar.gz $ cd perl-5.6.2 $ ./configure.gnu --prefix=/usr/loc…

perlの5.6と5.8ではソートアルゴリズムが違う

5.6まではクイックソート、5.7からはマージソートみたいです。 $ perldoc -f sort ... Perl 5.6 and earlier used a quicksort algorithm ... In 5.7, the quicksort implementation was replaced with a stable mergesort algorithm... ... 何かまずいの?…

PerlでCiscoスイッチを操作

Ciscoスイッチの作業を自動化したいと思ったらNet::Telnet::Ciscoモジュール。 http://search.cpan.org/~joshua/Net-Telnet-Cisco-1.10/Cisco.pm かなり使いやすいです。 use Net::Telnet::Cisco; ($hostname, $loginPass, $enablePass) = qw(sw01 cisco cis…

アルファベットと数字を分解

以前の日記で、文字列をアルファベットと数字に分割するのに先読み、後読みアサーションなんて使ってました。 @a = split /(?<=[a-z])(?=\d)|(?<=\d)(?=[a-z])/, "12ab3cde45"; print "$_\n" for @a; 出力 12 ab 3 cde 45 でもsplitの正規表現を()で括ればそ…

Perlでtry...catch

Perlにはtryとcatchの例外処理構文はありません。 必要なら自分で書きます。(もちろん普通はeval{...};if($@){...}で十分です) #!/usr/bin/perl use strict; use warnings; use Switch; ## try...catch構文を定義(ラクダ本???ページより) sub try(&$){ m…

Perlでキーの配列と値の配列からハッシュを作る

ハッシュスライスを使うのが一般的。 @keys = qw(k1 k2 k3); @vals = qw(v1 v2 v3); @hash{@keys} = @vals; print "$key:$val\n" while ($key,$val) = each(%hash); 出力 k2:v2 k1:v1 k3:v3 @hash{'k1','k2','k3'}はリスト、($hash{k1},$hash{k2},$hash{k3})…

Perlのハッシュキーは文字列、Rubyはオブジェクト

Perlのハッシュキーは文字列として保持されます。 リファレンスをキーにしてもそこからデリファレンスはできないことがわかります。 $ref = \"abc"; $hash{$ref} = 123; $key = (keys %hash)[0]; print "$ref is the reference of '$$ref'\n"; print "$key i…

正規表現の先読み、後読みアサーション

ってのを使ったらアルファベットと数字を簡単に分割できるかなと思ったんだけど、 んー、イマイチ。 $_="ab12cde3f"; s/(?<=[a-z])(?=\d)|(?<=\d)(?=[a-z])/-/g; print "$_\n"; ## ab-12-cde-3-f でもこれもなぁ・・・ $_="ab12cde3f"; s/([a-z])(\d)/$1-$2/…

ツリー走査プログラム

テキトウな質問にテキトウに答えた。 http://code.nanigac.com/forum/view/402 %tree = (A => ['B','G'], B => ['C', 'E'], C => ['D'], E => ['F'], G => ['H'], H => ['I','J'], J => ['K'], ); &search('A'); sub search { my @stack = @_; my @childs = …

YukiWikiMiniのコードを読んでみよう

Wikiってあんまりちゃんと触ったことないなぁ・・・ というわけではてなの人や多くのWiki制作者に多大な影響を与えたYukiWikiのコードを読んでみよう。 http://www.hyuki.com/yukiwiki/ まずはminiから・・・ 解凍してみる。ファイルは4つしかない。 [mikeda…

ログ監視スクリプト

syslog-ngからこんな感じに起動してエラー発生時に指定の処理を行うスクリプトを書いた。 destination d_log_handle { program("cd /home/mikeda/bin;./log_handle.pl match_list"); }; log { source(s_sys); destination(d_log_handle); }; 仕様は ・エラー…

不明な正規表現で後方参照があるかどうか

正規表現をリストコンテキストで評価すると()で括った部分の配列が取れる。 gオプションも使うとさらに便利。

Perlで日本語メール送信(2)

id:mikeda:20090115をEncodeモジュールでかきなおし。 #! /usr/bin/perl use Encode; use utf8; $to = 'mikeda@sample.to'; $from = encode('MIME-Header-ISO_2022_JP', 'そうしんもと') . '<mikeda@sample.from>'; $subject = encode('MIME-Header-ISO_2022_JP', 'だいめい'); $</mikeda@sample.from>…

Perlで日本語メール送信(3)

前回のスクリプトを使ってメール送信フォームを作ったとする。 ヘッダの一部、例えば送信元にこんなアドレス渡されたらどうなるだろう。 mikeda@sample.to Bcc: aaa@aaa.jp, bbb@bbb.jp, ... プロバイダやキャリアのブラックリストに載ってしまうかも。 「se…

Perlで日本語メール送信(1)

基本となる考え方はこう。 ヘッダ JISコード + MIMEエンコード 本文 JISコード JISコードでスクリプトやWebページを書く人はいないだろうから文字コードの変換をやることになる。 よく見るのはjcode.plとmimew.plを用いるプログラム。 #! /usr/bin/perl requ…

今さらFizzBuzz

なんかへんなの流行ってるなとスルーしてたけどこういう煽りがあったのか。 どうしてプログラマに・・・プログラムが書けないのか? 1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプ…

文字列を文字配列にバラす

もちろん1文字ずつ順番に取り出してもいいんですが、 [mikeda@cent ~]$ perl -e 'print map "$_\n", "abcde"=~/(.)/g' a b c d e [mikeda@cent ~]$ バラすといえばsplitを使いたい。 しかしワード間アンカーの\bはあるが、文字と文字の間にマッチするアンカ…

配列シャッフル

まずRubyで。 $ ruby -e 'puts (1..10).sort_by{rand}.join("\n")' 4 10 2 8 9 3 5 6 1 7 sort_by()かっこいいなー。 やっぱRubyちゃんと勉強しよう。時間ができ次第・・・ Perlにはこういうのないから明示的に乱数くっつけてやらないと。 こんな感じかな。 …