今日出会ったCPANモジュール
プログラムが対話モードで実行されているか判定する is_interactive() サブルーチンを,正しく実装するのは大変難しいらしい。(詳細は PBP 「10.14 対話性」を参照)
このモジュールは,その実装の難しい is_interactive() サブルーチンを提供してくれる。
使用方法は以下のとおり。
use IO::Interactive qw( is_interactive ); if (is_interactive()) { print $PROMPT; }
Perl: ファイル全体を一度に読む込む
以下がその方法。
my $code = do { local $/; <$in> };
- 説明
グローバル変数「$/」は,入力レコードセパレータ。
これをローカル化すると,「$/」の値は undef となる。
「$/」の値が undef の場合,入力は分離されていない単一のレコードとして扱われる。
- local $/; で $/ が undef になるのか確認
#!/usr/bin/perl use strict; use warnings; use utf8; use Encode; use Perl6::Say; { local $/; say '$/ is undef' if not defined $/; } # <実行結果> # $/ is undef
- おまけ
Perl6::Slurp モジュールを使用すると,最初の例は以下のように書ける。
use Perl6::Slurp; my $code = slurp $in;
See Also
Plagger: Bloglinesの未読項目をGmailに転送する事がある日を境に出来なくなっていたが...
ある日を境に, Bloglines のサイトをブラウザで見ると未読項目が沢山あるのに,なぜか Plagger で未読項目を Gmail に転送しようとすると,
Plagger::Plugin::Subscription::Bloglines [info] You have 0 unread item(s) on Bloglines.
と,未読項目は「0」と出力され, Gmail に転送されないという状況に陥った。
私はてっきり Bloglines の API 仕様が変更されて,Plagger の Plugin を修正する必要があるのだろうと思い込んでいた。(なんの疑いもなく...)
しかしこの問題は,ちゃんと ./lib/Plagger/Plugin/Subscription/Bloglines.pm の pod に書かれていた OTZ (pod 読めよ > オレ)
CONFIGURATION dont_use_notifier_api Turn it on when you want to skip Notifier API, which could some‐ times be broken and always returns 0 instead of the actual unread count.
ということで yaml を以下のように修正したら,あっさり未読項目が取得できました。
# yaml ファイルの一部抜粋 - module: Subscription::Bloglines config: username: username password: password mark_read: 1 dont_use_notifier_api: 1 # この行を追加する fetch_meta: 1
注意点として,「mark_read」「dont_use_notifier_api」「fetch_meta」はこの順番で指定しないとうまくいかない様です。(私は試していませんが,参考にした以下のサイトに書かれていました)
See Also
Perl: サブルーチンからの失敗のリターン
"失敗状態を返すには、裸の return を使用する"
- 作者: Damian Conway,クイープ
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2006/08/24
- メディア: 大型本
- 購入: 11人 クリック: 153回
- この商品を含むブログ (155件) を見る
Perl における 「サブルーチン」と「メソッド」のプロトタイプの取扱い
サブルーチン | プロトタイプはチェックされる |
---|---|
メソッド | プロトタイプは無視される |
これは知らなかった。
でも言われてみればそうだよね。
OOで書いた場合,継承関係を辿ってメソッドを探す為,実行時にならないと,実際にどのメソッドが呼び出されるかは分からない。
だから,コンパイル時にプロトタイプをチェックする事は出来ないってことなんだな。
そうだよね〜