ようこそゲストさん

Kerosoft : Modus Operandi

2008/10/17(Fri) 変数の展開の展開 +α

はてブ情報 はてブに登録 はてブ数 2008/10/17 3:31 Languages::Perl
変数の展開の展開で、printなどする予定の変数内に埋め込んだ変数名文字列を展開する方法を紹介したが、同じ手法で関数も展開するバージョン。

★09/02/26追記
こんな面倒なことしなくても、関数展開できる方法があった。こちらを参照。
#!/usr/local/bin/perl

my $str = q|この結果は&sum(10, 25)&になります|;
$str =~ s/(&.+?)&/eval($1)/eg;
print $str.qq|\n|;

sub sum{
    my ($a, $b) = @_;
    return $a+$b;
}

あらかた答えは予測できるだろう…。
この結果は35になります
と表示される。

埋め込む部分が、"&sum(10, 25)&"となっているのは、正規表現の誤爆防止というか、単に[0-9a-zA-Z ,]+?などと書くのが面倒だったのと、引数に日本語を含む場合などはうまくマッチしないだろうということで。
この辺は自分の好きな正規表現にアレンジして使ってください。

本来なら、前回のエントリの時点で書くべきところだが、evalにそのまま投げるので、マッチさせる部分のチェックはくれぐれも慎重に。
システムコマンドを放り込まれたら、普通に結果が出力されちゃいますので。

evalが怖いという人は、デグレードして、こうにもできる。
$str =~ s/&\w+\((\d+),\s*(\d+)\)&/&sum($1, $2)/eg;
括弧の内側だけマッチングさせて、"10, 25"を取得してsumに投げたら、案の定10と25に分かれてくれなかったので、苦肉の策。
引数が1個固定の時くらいしか使い道なさそうだなぁ。


しっかし、Perlって便利だよねぇ。この辺り。
参考になった記事や興味深かった記事は、他の人も見つけやすいようにリンクはてブしていただけると助かります…。 コメントも歓迎です。

名前:  非公開コメント   

  • TB-URL  http://mo.kerosoft.com/079/tb/
  • 変数内での関数の展開 Kerosoft : Modus Operandi Keroberos
    変数の展開の展開 +αでは、埋め込んだ関数を展開して評価する方法を書いたが、あんな面倒な事をやらなくてもPerl本来の機能で簡単にできたらしい。簡単な例を下に示す。#!/usr/local/bin/perlprint qq|5*2は@{[a(5)]です}\...

2008/10/17(Fri) Vista 電源制御周りのコマンド

はてブ情報 はてブに登録 はてブ数 2008/10/17 3:03 Software::Windows
VistaにもXPと同じくshutdownがあるが、多少オプションが拡張され、XPではできなかった休止状態への移行などができるようになっている。

C:\Users\Kero>shutdown /?
使用法: shutdown [/i | /l | /s | /r | /g | /a | /p | /h | /e] [/f]
    [/m \\コンピュータ][/t xxx][/d [p|u:]xx:yy [/c "コメント"]]

    引数なし   ヘルプを表示します。「/?」と入力するのと同じです。
    /?        ヘルプを表示します。オプションを入力しないのと同じです。
    /i        グラフィック ユーザー インターフェイース (GUI) を表示します
                このオプションは最初に指定する必要があります。
    /l        ログオフします。/m または /d オプションとは併用できません。
    /s        コンピュータをシャットダウンします。
    /r        コンピュータをシャットダウンして再起動します。
    /g        コンピュータをシャットダウンして再起動します。システムの
                再起動後に、登録したアプリケーションを再起動してください。
    /a        システムのシャットダウンを中止します。
                これは、タイムアウト期間にのみ使用できます。
    /p        タイムアウトまたは警告なしでローカル コンピュータの電源を
                切ります。
                /d および /f オプションと併用できます。
    /h        ローカル コンピュータを休止状態にします。
               /f オプションと併用できます。
    /e        コンピュータの予期しないシャットダウンの理由を記録します。
    /m \\コンピュータ 対象となるコンピュータを指定します。
    /t xxx    シャットダウンまでのタイムアウト期間を xxx 秒に設定します。
                有効範囲は 0 から 600 までで、既定値は 30 です。
                /t xxx を使用すると /f オプションも指定されます。
    /c "コメント" 再起動またはシャットダウンの理由にコメントを付けます。
                最高 512 文字まで入力できます。
    /f        ユーザーに警告せずに実行中のアプリケーションを強制終了します。
                /f は、/t xxx と共に使用されると自動的に設定されます。
    /d [p|u:]xx:yy  再起動またはシャットダウンの理由を指定します。
                p は再起動またはシャットダウンが計画されていたことを示します。
                u は理由がユーザーにより定義されることを示します。
                p と u のどちらも指定されていない場合は、再起動または
                シャットダウンは計画されていません。
                xx は主因の番号です (256 未満の正の整数)。
                yy は副因の番号です (65536 未満の正の整数)。

理由:
(略)


なお、従来のXPから使える以下のコマンドでも実現可能。
DLL名はpowerprofではなく、powrprof.dllなのでミスタイプに注意。

休止状態
rundll32.exe powrprof.dll,SetSuspendState

ハイブリッドスリープ

ハイブリッドスリープが有効な環境では、スリープ状態に入るための呼び出しがないようなので、APIを呼んでいる系のツールを準備する必要がありそう。
一部では、SetSuspendStateの後に、<スペース>Sleepを入れるとか、<スペース>0,1,0と指定するとよい、とあったものの、こちらの環境ではうまくいかず。


なお、自分のシステムが、どのようなスリープをサポートしているかは次のコマンドで確認できる。

C:\Users\Kero>powercfg /a
以下のスリープ状態がこのシステムで利用可能です:
   スタンバイ ( S3 ) 休止状態 ハイブリッド スリープ

以下のスリープ状態はこのシステムでは利用できません:
スタンバイ (S1)
   システム ファームウェアはこのスタンバイ状態をサポートしていません。
スタンバイ (S2)
   システム ファームウェアはこのスタンバイ状態をサポートしていません。

参考になった記事や興味深かった記事は、他の人も見つけやすいようにリンクはてブしていただけると助かります…。 コメントも歓迎です。

名前:  非公開コメント   

  • TB-URL  http://mo.kerosoft.com/078/tb/