今日出会った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 に転送されないという状況に陥った。
私はてっきり BloglinesAPI 仕様が変更されて,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

「ブロック」と「無名ハッシュコンストラクタ」の曖昧さを解決する方法

プログラマがどちらのつもりで中括弧を使っているのか,コンパイラ(パーサ)に知らせる方法は以下の通り。

  • 無名ハッシュコンストラクタを使うつもりだということをコンパイラに知らせるには
    • { の前に + 記号を付けて,+{ ... } のように書く
  • コードブロックを使うつもりだということをコンパイラに知らせるには
    • ブロックの冒頭に空の文を示すセミコロン(;)を付けて,{; ... }のように書く


See Also

Perl: サブルーチンからの失敗のリターン

"失敗状態を返すには、裸の return を使用する"


Perlベストプラクティス

Perlベストプラクティス

Perl における 「サブルーチン」と「メソッド」のプロトタイプの取扱い

サブルーチン プロトタイプはチェックされる
メソッド プロトタイプは無視される

これは知らなかった。
でも言われてみればそうだよね。

OOで書いた場合,継承関係を辿ってメソッドを探す為,実行時にならないと,実際にどのメソッドが呼び出されるかは分からない。
だから,コンパイル時にプロトタイプをチェックする事は出来ないってことなんだな。

そうだよね〜