トップページ⇒php
988コメント342KB

CGIに依存しないPerlの話題一般

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2001/05/31(木) 21:49ID:bKRSBFew
・コマンドラインからのPerl活用
・モジュール、オブジェクト指向プログラミング
・Perl6や.NET対応など
・各種GUIツールキット(Perl/Tk, Gtk-Perlなど)
・他言語による拡張(Inline::*, XS, Swigなど)

についてマターリと語り合うスレッドです。

#CGI関連の話題は、なるべく専用スレッドで。
0182恥ずかしながら1752001/08/20(月) 04:52ID:???
>>176
ありがとうであります。
新しい書き方も取り入れて行こうと思う次第であります。
018311101/08/27 09:56ID:gtVoupko
>>111
すみません、誤爆です。
逝ってきます。
018418301/08/27 10:08ID:cCFTKgE6
>>183
すみません、誤爆の謝罪を誤爆してしまいました。
申し訳ない。
0185名無しさん@お腹いっぱい。01/09/05 16:01ID:8Hg/qZ8I
プロンプト表示して逐次処理するのってどうするんでしょうか
Cのgetchar みたいなんすけど、、ARGV??
つーかプリント文が流れて逝くだけだし、、、俺ってあほですか?
0186名無しさん@お腹いっぱい。01/09/05 16:09ID:dfrFd246
>>185
うん。

#!perl
use constant PROMPT => '( ´∀`)>';
print PROMPT;
while (<>) {
    chomp;
    system $_;
    print PROMPT;
}
__END__
0187名無しさん@お腹いっぱい。01/09/05 17:09ID:jg.i3l1M
ぐはあ、STDINだたのか  (痴
逝って来ます    アホだ。。。
0188名無しさん@お腹いっぱい。01/09/06 20:41ID:???
File::statとかTime::localtimeとかFile::chdirみたいに
組み込み関数をかなり違う動作をする関数でオーバーライドするのってどうよ?

$s = new File::Stat('foo);
$t = new Time::Localtime(time);
$c = new ChdirSaver ('..');

などの方が読みやすく安全だと思うのだが。
0189名無しさん@お腹いっぱい。01/09/07 11:56ID:.xfvPVkw
>>188
同感。普通のコード書く時はそうですよね。
ただワンライナーを書く時はオーバーライドしてくれた方が便利という背景もある。
@EXPORT じゃなくて @EXPORT_OK に書いてくれてれば良いのにね。
0190名無しさん@お腹いっぱい。01/09/07 14:36ID:BHawRKfc
別にオーバーライドさせたくなければできますよ。
use File::Stat ();
@EXPORT に入ってるのはあくまで「デフォルト」でEXPORTするだけです。
空リストをuseに渡せばOK。
$st = File::stat($file);
019118801/09/07 18:42ID:???
>>190
そりゃそうだが、デフォルトでエクスポートするのが気に入らん、って事。
だからどうしたと言われりゃそれまでだが。
0192名無しさん@お腹いっぱい。01/09/08 00:16ID:TqV0GOBs
なるほど。
組み込み関数の名前をオーバーライドするってのは、
こんな使えない組み込み関数は捨てちまえ!俺のモジュール使え!という
モジュール作成者の自信をあらわすものだったりして。
0193名無しさん@お腹いっぱい。01/09/08 23:45ID:UUPZ4HXg
TERM:capの使い方教えれ。
0194名無しさん@お腹いっぱい。01/09/09 16:18ID:???
今コマンドみたいなのを色々書いてるんですが、入力の受け取りで困ってます

cp ./tmp/hoge './tmp/h u" g a' "./tmp/target'dir"
こう言う入力がSTDINから有ったとして、これを上手に

@argment = ('./tmp/hoge','./tmp/h u" g a','./tmp/target'dir');
つまりShellに与えた時の引数の解釈と同じ動作がしたいのです。

正規表現で削ってみたりと苦戦してみたのですが、引数の数は不定な事も
有って完全にShellと同じ動きをするのは不可能な気がしています。
今は1byteづつ積み上げて解釈するしかないのかなと思ってます。
参考になるソースなんかは無いでしょうか。出来ればperlなら感激なんですが
よろしくお願いします。
019519401/09/09 16:31ID:???
ちょっと説明が変ですね、perlshell.plを起動するとそこから
処理モードに入るんです、各コマンドのサブルーチンは大体出来ていて
例えば、
$./perlshell.pl cp ./tmp/hoge './tmp/h u" g a' "./tmp/target'dir"
こんな感じなら上手く行くのです(シェルが綺麗に@ARGVに収めてくれるので)
ところが$./perlshell.pl として起動して
perlshell$←入力待ち
cp ./tmp/hoge './tmp/h u" g a' "./tmp/target'dir"
とした時の<STDIN>からの入力の処理が出来ないのです。
ここに
0196名無しさん@お腹いっぱい。01/09/09 16:40ID:???
>>194
もう少しマトモかつ具体的な例を頼む。
019719401/09/09 17:08ID:???
すいません、>196
つまりShellをエミュレートしたいのだと思います。
tcshから、./perlshell.pl とタイプすると
perlshell$ こう言うプロンプトが出ます。
そこに
cp "dist1" "dist2" "dist3" "target" と入力した時の
<STDIN>からの入力を上手に配列(上なら("dist1","dist2","dist3","target"))
に収めたいのです。
今bashのソースを拾ってきたのですが、何故か心が重いです・・・
0198名無しさん@お腹いっぱい。01/09/09 18:08ID:???
それなら><|等の処理もした方が良くないか?
と思いつつ少し考えてみる。

とりあえず
http://www.din.or.jp/~ohzaki/perl.htm#Tag_Remove
でも読みながら考えていろ。
019919401/09/09 21:46ID:???
ありがとう御座います、>198
シェルのソース見てみたんですが、Cが殆ど読めないので良く分かりません
でした、ただそれらしきループが有ったんでやはり1byteづつ切り出してる
んだと思います。

取り合えずsubstrで1byteづつ切り出してるんですが、難しいです。
フラグだらけで訳が分からなくなってきた。
まずは ' の中では " が使える、" の中では ' が使える。
これを目指して頑張ってます。
パイプとリダイレクトはどうしようかなぁ、何か無理っぽいです。
0200名無しさん@お腹いっぱい。01/09/09 21:53ID:NKqI5UNo
$cmd = <SHIFT>;
print `$cmd`;
で

$ perlshell rm -rf /

じゃだめなの?
020119801/09/09 22:18ID:???
ダメだな。折れ力じゃ無理らしい(鬱
逝ってきます。
#!perl
my $command = q{cmd>foo.txt "double quote" '/single quote/' "cmd>foo.txt"};

print Dumper [parseline($command)];

sub parseline{
my $str = shift;
my $quoted_str = qr{(?:[^"' ]|"[^"]*"|'[^']*')*};
my $i = 0;
return grep{ $i++ % 2 }(split /($quoted_str)/o, $str);

}
__END__
0202JAPU@ページデザイン変更してみたり01/09/09 22:35ID:???
こうしとけ。(笑)

$arg = q/Sakura "Moe" "\"puni\"" 'hanya-n'/;
@arg = split /\0/, `perl -e 'print join "\\0", \@ARGV' $arg`;
print "$_\n" foreach @arg;
0203>>JAPUさん01/09/09 22:53ID:???
ご丁寧にバナーまでモノクロにしてある(笑
でもあまり暗いのは好きじゃないですね。鬱になりそう。
0204名無しさん@お腹いっぱい。01/09/09 23:32ID:???
>>194
psh (Perl Shell) っていうのがあるらしいんだが、参考にはなるか?

ttp://sourceforge.net/projects/psh/
020519401/09/10 01:25ID:???
わわ、JAPUさんまで、感謝です>みなさん
>>200 それはちょっと・・(笑

>>201
いえいえ、凄く参考になります。自分では何も思いつかないレベルなので

>>202
凄いトリックですね、こんなの絶対考えつかないです。
今回は、勉強がてらなるべくシステムを呼ばない前提なので、
最後の手段に保存させてもらいました。

>>204
大感謝です、これは凄い。
入れてみてビックリしました、完全にShellの動作をしてます
グロビングまで自前でやってる様です、きっとこの人は偏執狂だ(笑
同じ名前で情けないので dameshell に改名しました。
今、該当部分を探している所です。段々流れがつかめて来た気がします。
今日は寝るので、ある程度形になったらまた報告させてもらいます。

多謝です>みなさん
0206 01/09/10 07:13ID:???
while( $arg ){
$arg =~ s/^\s*//;

if( $arg =~ /^"/ ){
if( $arg =~ s/^"((\\.|[^"])*)"// ){ push @args, &parse_meta( $1 ) }
else{ die "unmatched" }
}
elsif( $arg =~ /^'/ ){
if( $arg =~ s/^'([^']*)'// ){ push @args, $1 }
else{ die "unmatched" }
}
elsif( $arg =~ /^`/ ){
if( $arg =~ s/^`((\\.|[^`])*)`// ){ push @args, &parse_command( $1 ) }
else{ die "unmatched" }
}
elsif( $arg =~ s/^(\S+)// ){
push @args, &parse_meta( $1 );
}
else{
last;
}
}

うーん。この位なら正規表現一発で綺麗に書けそうだけど…
リダイレクトやパイプがないんじゃシェルとは…
0207名無しさん@お腹いっぱい。01/09/10 10:19ID:7tqUQO.2
んー shellと同じように分割したいなら標準モジュールの Text::ParseWords つかえば良いのに。

#!perl
use Text::ParseWords;
@args = shellwords($strings);
__END__
020819401/09/10 15:53ID:???
#**********************************
use strict;

&Main_block;
sub Main_block{
    my ($input,@output,$count);
    print "ひき数をいれてください\n";
    $input = <STDIN>;
    @output = &Parse_arg($input);
    $count = 0;
        foreach (@output){
            print '$ARGV'."[$count]\t$_\n";
            $count++;
        }
    exit;
}
020919401/09/10 15:54ID:2zI8oYIY

#***** 引数を解釈して配列に入れる
sub Parse_arg{
    my ($input,$charnum,$char,$argpart,$count,$quot_flag,@out);
    $input = shift;
    chomp ($input);
    $charnum = length ($input);
        while ($count < $charnum){
            $char = substr ($input,$count,1);
            if (($char eq ' ')&&(!$quot_flag)){
                $char = '';
                    if ($argpart){push (@out,&Unquote($argpart))};
                $argpart = '';
            }
            elsif ((($char eq '\'')||($char eq '"'))&&(!$quot_flag)){
                $quot_flag = "$char";
            }
            elsif (($char eq $quot_flag)&&($quot_flag)){
                $quot_flag = '';
            }
            if ($count == (${charnum}-1)){
                $argpart .= $char;
                if (&Unquote($argpart)){push (@out,&Unquote($argpart));}
            }
            $argpart .= $char;
            $count++;
        }
    return (@out);
}
#***** クオートを取り去る
sub Unquote{
    $_ = shift;
    $_ =~ s/^\'([^\']*)\'$/$1/;
    $_ =~ s/^\"([^\"]*)\"$/$1/;
    return $_;
}
#**********************************
021019401/09/10 15:57ID:???
こんにちは、またまた有難うございます、勉強になります

>>206
いえいえ、**完全に**とか言ってしまいましたが、本当は
It's my dir と言うディレクトリを開けなかったのと不定な
引数の数に対応出来なかっただけなのです。 " の中では ' が
使える、逆もOK、"と' の中ではスペースが使える、区切り文字の
スペースは幾つでも良い。これ位が目標だったので
リダイレクトは本物の動作がよく理解出来てない厨房っぷりなので
今後の課題にしようと思います。

>>207
知らなかったです、>>204さんに教えて頂いたpshもそうでしたが
細かく機能別のサブルーチンに分けて、そこに投げて行くんですね。
今、sub parse_lineとにらめっこしてます。実は、モジュールはrootに
有るの位しか使った事が無いのです(汗)

恥かしいコードですが結果、上の様になりました。
本物のふるまいが理解出来てないので今一つですが、
一応目的は達しました。ループしてるのは効率的じゃないかも、、
まだ比較演算子の優劣が分からないのでカッコだらけですが
ご勘弁ください、変な所有ったら指摘してもらえたら嬉しいです。
ありがとうございました>みなさん。 ホント勉強になる!
この板は2chじゃないですよね 笑)
0211名無しさん01/09/10 18:00ID:???
プライオリティも解らんのにこんなの書けるのかよ(´Д`;)
0212超上級者01/09/13 05:28ID:???
あるファイルシステムがマウントされているかどうかをPerlから知るにはどうすればいいのかね?
それと、実行されている環境のバイトオーダーを知る方法は?

知ってる人はココに書きなさいね。
0213_gunzip01/09/13 05:59ID:???
#!/usr/bin/perl -w

use Inline C;

our @filesystems = ("/dev/sda1", "/dev/fd0", "/dev/cdrom");

foreach my $fs (@filesystems){
    print "$fs: ", is_mounted($fs) ? "mounted\n" : "not mounted\n";
}

__END__
__C__
#include <mntent.h>

#define TABLE_FILE "/etc/mtab"

int is_mounted(char *fsname)
{
    FILE *fp;
    struct mntent *ent;

    if((fp = setmntent(TABLE_FILE, "r")) == NULL)
        return -1; /* error */

     while((ent = getmntent(fp)) != NULL){
        if( !strcmp(ent->mnt_fsname, fsname) )
             return 1; /* found */
     }

    endmntent(fp);
    return 0; /* not found */
}
0214_gunzip01/09/13 06:03ID:???
#!/usr/bin/perl

use Inline C;

sub is_little_endian2()
{
    return pack("I", 1) eq pack("V", 1);
}

sub is_little_endian3()
{
    return vec(pack("I", 1), 0, 1);
}

__END__
__C__

int is_little_endian1()
{
    union {
        int val;
        char byte[sizeof(int)];
    } u;
    u.val = 1;
    return u.byte[0] == 1;
}
0215超初心者01/09/13 06:04ID:???
-eでいいんじゃねーの?

unpack('s', pack('n',1));
戻り値で判断
0216_gunzip01/09/13 06:13ID:???
せっかくなのでInlineモジュール使ってみました。

#このスレッドに書き込むのも久しぶりな気がする...。
#いつの間にか書き込み200を越えていて嬉しひ。
0217名無しさん@お腹いっぱい。01/09/13 09:16ID:FCaipOx6
NFSかどうかを知るにはどうすればいいんですか?
flockが使えないなら、自動的に他のロックを使いたいのです。
0218名無しさん@お腹いっぱい。01/09/13 12:59ID:skA46.9M
>>217
/etc/mtabの中をみて、マウントタイプ判断すればいいんじゃない?
うちの環境になぜか入っていた Quota モジュールを使う手も。

use Quota;
print is_nfs(/home2/john/path) ? 'Danger!' : 'Safe';

sub is_nfs {
  my $path = shift;
  my $is_nfs = 0;
  Quota::setmntent();
  while (my @mntent=Quota::getmntent()) {
    if( $path ~= /^$mntent[1]/ and $mntent[2] eq 'nfs'){
      $is_nfs = 1;
      last;
    }
  }
  Quota::endmntent();
  return $is_nfs;
}

flockが使えないファイルシステムは他にもあるでしょうから、
もっと調べないとダメだと思いますけどね。
CfgTie::TieMTab っていうモジュール使うと便利かも。
021921801/09/13 13:03ID:???
あ、is_nfs('/home2/john/path') ね、言うまでもないけど。
0220_gunzip01/09/13 15:42ID:???
お、Quotaという便利なモジュールがあるんですね。勉強になります。

ちなみに、マウントされたファイルシステムのタイプ(nfs, ext2, msdos, etc...)を取得するには
mntent構造体のmnt_typeメンバを調べるだけでおっけいです。

--> getmntent(3), fstab(5)
#213のは、見つかった場合endmntent(FILE *)を呼ぶのを忘れてる...。
0221名無しさん@お腹いっぱい。01/09/13 16:18ID:???
>>217 eval使って返値でチェックしたら?
0222JAPU@会社作ったにょ01/09/13 16:47ID:???
NFSでも、flockは成功するにょ。
ただ、NFS だとうまくロック出来ない場合がある... らしい。

# 何種類佳乃組合わせでためしたけど、全部成功したので "らしい" としか...
022321701/09/14 13:09ID:???
みなさんどうも。

eval { flock(STDIN) };
if ($@) {
 # my_flock
}
elsif (is_nfs("mypath/mylockfile") {
 # my_flock
}
else {
 # flock
}

てな具合でいきたいと思います。

>>222
># 何種類佳乃組合わせでためしたけど、全部成功したので "らしい" としか...
成功したっていうのは吐いた制御がちゃんとできているってことですか?
# 自分も実験できる環境がないので "らしい" でしかないんですよね。
0224名無しさん@お腹いっぱい。01/09/14 13:22ID:???
flock(STDIN)は常にdieすると思うのだがどうかな?
0225名無しさん@お腹いっぱい。01/09/14 13:27ID:???
218の is_nfs に相対パスを渡しても、うまくいかないと思う。
0226名無しさん@お腹いっぱい。01/09/14 17:56ID:???
あたりまえ。
022722601/09/14 18:07ID:???
すまん。マジ誤爆。
0228名無しさん@お腹いっぱい。01/09/14 23:38ID:???
>>222
美凪組み合わせだとどうですか?
022921701/09/15 01:07ID:???
修行のためCPANのLock関連のモジュールあさってたけど、
NFSの自動判別とかしないでユーザに指定させるか、
flockは完全に無視して独自ロックだけをつかう方法が多かった
前者がLockFile::Simple、後者がFile::FlockDir、File::NFSLock

厨房は厨房らしく自動判別はやめて、ぬるく逝こうと思う。
0230PerlHacker01/09/19 05:33ID:???
ここにはすごそうな人が多そうなのでここで聞きます。
ページを見ている人のパソコンのCD-ROMを排出させる方法をCGIでやるやり方を教えてください!!!!
ネットを探しまわったのですが見つかりませんでした。
0231名無しさん@お腹いっぱい。01/09/19 05:45ID:???
>>230
そいつの家まで逝って、手動で開けてやれ。
0232_gunzip01/09/19 05:52ID:???
>>230
いやはや迷惑な話で...。
0233_gunzip01/09/19 06:07ID:???
真面目な話、PerlからCD-ROMをイジェクトさせるには(Linuxの場合)
まず/dev/cdromをアンマウントし、(面倒くさければsystem("umount /mnt/cdrom")とか。)
<linux/cdrom.h>で定義されているCDROMEJECTをioctl(2)に渡してやれば良い。

use Fcntl;
require 'linux/cdrom.ph';
sysopen(CDROM, "/dev/cdrom", O_RDONLY|O_NONBLOCK);
$status = ioctl(CDROM, CDROMEJECT);

のような感じ。(無論、これでは動かないが)

#'linux/cdrom.ph'は<linux/cdrom.h>をh2phで変換
0234_gunzip@Scheme初心者01/09/19 06:23ID:???
/dev/audioサウンドデバイスにmu-Lawで書き出して音を鳴らすとか、Perlで無茶をすることは十分可能だろうけど、実験する時間がないなあ。
0235PerlHacker01/09/19 07:05ID:???
全然分かりません!!!!!
教えてください!!!!!
0236PerlHacker01/09/19 07:08ID:???
優しい方DOSプロンプトの使い方も教えてください!!!
0237名無しさん@お腹いっぱい。01/09/19 07:09ID:???
CGIじゃ出来ません!!!!!!
Activeでも勉強して下さい!!!!!
ついでに首括って芯で下さい!!!!!!!!!!
0238PerlHacker01/09/19 07:12ID:???
Activeって何ですか!!!!
0239PerlHacker01/09/19 07:13ID:???
帰ってくるまでに教えてくださいね。
よろしくお願いします!!!
0240名無しさん@お腹いっぱい。01/09/19 07:14ID:???
http://www.microsoft.com/japan/developer/VSTUDIO/download/sp/full.htm
これを全部落してインストールする
↓
リモートデバイスマネージャ(RDM)のヘルプを良く読む
↓
RDMサンプルスクリプトが付いてるからそれを試してみる
↓
(゚Д゚)ウマー
0241名無しさん@お腹いっぱい。01/09/19 08:53ID:???
馬鹿の相手するなよ・・・。
0242名無しさん@お腹いっぱい。01/09/19 14:11ID:???
というわけで話題提供でもしてみる。

誰かXML::RSS使ってる人いますかね?
自分のサイトでRSS使って更新情報吐き出そうと思っているのですが。
使い方教えれってんじゃないよ(w
0243名無しさん@お腹いっぱい。01/09/19 17:33ID:???
Perlとcurses使った簡単なキャラクタベースのプログラム作ってるけど、
窓のサイズを途中で変更されると表示が変になったり、全く何も描画されなくなったり。
そこで質問なのだが、窓のサイズが変更されたことを知るにはどうすればいい?
024424301/09/19 17:35ID:???
なるべく、変更されてすぐがいいな...。
0245_gunzip@Scheme初心者01/09/19 17:52ID:???
>>243-244
UNIX BSD4.3,SVR4から追加されたシグナルSIGWINCHを使えばいい。
端末サイズの変更の際にカーネルから送られてくるから、適切なハンドラでもって応えてやればいい。(デフォルトでは'IGNORE'になっている)
0246_gunzip01/09/19 18:21ID:???
sfioおすすめ。
http://www.research.att.com/sw/tools/sfio/
024724301/09/19 20:06ID:???
>>245
Thanks!
0248名無しさん@お腹いっぱい。01/09/20 22:53ID:BGTtPH/k
ディレクトリ内のすべてのファイル中の\r\nを\nにしたくて

#!/bin/sh
OLD=$1
NEW=$2
shift ; shift
for file in $*
do
sed "s/$OLD/$NEW/g ${file} > ${file}.tmp
mv ${file}.tmp ${file}
done

をhage.shとして
$ ./hage.sh \r\n \n *
を実行したのですが、\r\nのままです。どこが変なのでしょうか?
0249名無しさん@お腹いっぱい。01/09/20 23:01ID:???
なぜPerlスレにこんな話題が出るのか分からない。
>>248いい子だからUNIX板に池。
025024801/09/20 23:04ID:BGTtPH/k
しかられたので少し訂正します

#!/bin/sh
OLD=$1
NEW=$2
shift ; shift
for file in $*
do
perl -pe "s/$OLD/$NEW/g" ${file} > ${file}.tmp
mv ${file}.tmp ${file}
done

をhage.shとして
$ ./hage.sh \r\n \n *
を実行したのですが、\r\nのままです。どこが変なのでしょうか?

これならここでいいでしょ?
0251名無しさん@お腹いっぱい。01/09/20 23:22ID:???
何故
perl -i.bak -pe s/\r\n/\n/ *
ではイカンのか。
0252_gunzip01/09/20 23:23ID:???
\r\n \n -> \\r\\n \\n
0253名無しさん@お腹いっぱい。01/09/20 23:23ID:???
>>250
echo "\r\n"
0254>25001/09/21 03:00ID:???
>>252
0255名無しさん@お腹いっぱい。01/09/21 08:12ID:???
XML::RSSはXMLスレに書いたほうが良かったかね。
0256名無しさん@お腹いっぱい。01/09/21 10:27ID:eCUa7iH.
>>255
オレ使ってるよ。とか言ったとしてどうなるのよ?
0257名無しさん@お腹いっぱい。01/09/21 10:49ID:???
>>256
そこから話が盛り上がる可能性に期待して、とか?
0258_gunzip01/09/25 04:46ID:???
C++で書かれたGUIツールキットwxWindowsのPerlインターフェイスがリリースされていますね。
http://www.perl.com/pub/a/2001/09/12/wxtutorial1.html

wxWindows
http://www.wxwindows.org/

wxWindows-Perl
http://wxperl.sourceforge.net/
0259101/09/25 05:00ID:7Zufx8jA
これカキコしてる奴誰だよ!↓
http://members.tripod.co.jp/bingo852/
0260_gunzip01/09/25 05:35ID:???
手元のVineLinux2.1.5に wxWindows 2.2.7 for GTK+と Wx-Perlをsource rpmからビルドしてインストールし、幾つかテストスクリプトを走らせてみましたが、特に問題なく快適に動いてますね。
また、特に何も手を加えずに日本語の表示も可能ですね。

Windows用バイナリPPMパッケージも用意されていますから、Windows環境でActivePerlを利用している人も簡単にインストールできると思うので試して欲しいなあ、と思ふ。(wxWindowsを入れる必要があるかも。)

------
wxGTKWindows
    http://prdownloads.sourceforge.net/wxwindows/wxGTK-2.2.7-0.src.rpm

wxWindows-Perl
    http://prdownloads.sourceforge.net/wxperl/perl-Wx-0.07-1.src.rpm
------
wxWindows for MS Windows
    http://www.wxwindows.org/dl_msw2.htm

    wxPerl for ActivePerlhttp://prdownloads.sourceforge.net/wxperl/Wx-0.07-win32.zip
0261Perlあまちゅあ01/09/27 15:04ID:n78xCnwc
すいません、コマンドラインで<STDIN>時に「キーボードから入力する文字数」を制限するのは、
どうすれば良いのでしょう?

(例えば、コマンドラインで、パスワードを入力するときに、8文字なら8文字と決まっていて、
9文字目は入力しても、画面には表示されない。)

OS非依存が良いのですが、依存せざるを得ないのであれば、Win依存でお願いします。
(キーが押されたってことを検出できれば、それをループでまわせるとは思うんですが、
 C言語のgetche や kbhitに相当するPerl関数がわからないんです。。とほほ。。。。)

厨な質問ですみません。(板違いなら、さらにごめんなさい)
0262名無しさん@お腹いっぱい。01/09/27 15:46ID:WzgjwwkM
>>260
以前、Windows ActivePerl に入れてみたら日本語が表示できなくて
いろいろ情報探したら、「マルチバイトに対応する予定はない」って
いうMLの記事を見つけたんであきらめたんですけど、表示できるのかぁ。
またちょっと試してみようかな。
0263名無しさん@お腹いっぱい。01/09/27 20:08ID:OLVunqio
>>261
ないんじゃないか?
俺が知らないだけかも。
でもgetcheもkbhitもDOSやWindowsプラットホーム固有の関数だから
マルチプラットホームなPerlには実装されてないんじゃないかと思われ
0264[perl:2228]01/09/27 21:41ID:???
Windows2000,Perl6を使用。

<STDIN>を使ってコマンドプロトコルから
入力した値をスカラー変数代入する処理で
プロトコルからの入力で、
何バイトまでしか入力ができない・・
っという風にしたいのですが、可能なのでしょうか?

もし可能であれば教えて頂きたいのですが。
0265_gunzip01/09/27 21:46ID:???
>>261

1.Term::ReadKeyモジュールのReadKey()関数を利用する。
2.Cursesライブラリのgetnstr()を使って入力文字数を制限するか、
またはgetch()で必要なだけ読み込む。
の二つの方法があります。例を挙げるなら、

---readkey.pl----

#!/usr/bin/perl -w

use strict;
use Term::ReadKey;
use constant PASSWD_MAX => 8;

ReadMode 4;

our $input = "";

foreach(1..PASSWD_MAX){
my $ch;
1 while (!defined($ch = ReadKey(-1)));
last if $ch eq "\n";
$input .= $ch;
}

ReadMode 0;

print "your password is $input\n";
0266_gunzip01/09/27 21:50ID:???
お、インデントが...。
--- curses.pl ----

#!/usr/bin/perl -w

use strict;
use Curses;
use constant TRUE => 1 == 1;
use constant FALSE => !TRUE;
use constant MAX_PASSWD => 8;

sub app_init()
{
     initscr();
     keypad(stdscr, TRUE);
     cbreak();
     noecho();
}

sub app_exit()
{
     echo();
     nocbreak();
     keypad(stdscr, FALSE);
     endwin();
     exit(0);
}

sub read_passwd2()
{
     my $input = "";

     getnstr($input, MAX_PASSWD);
     printw "your password is $input\n";
     refresh();
}
0267_gunzip01/09/27 21:51ID:???
sub read_passwd()
{
     my $count = 0;
     my $ch = "";
     my $input = "";

     while (($ch = getch()) ne "\n") {
     last if ++$count >= MAX_PASSWD;
     $input .= $ch;
     }
     printw "your password is $input\n"; # 確認。
     refresh();
}

#main

BEGIN{ app_init() }
END{ app_exit() }

read_passwd(); #read_passwd2();

sleep(2); # 確かめる暇もなく終わらないように。
0268_gunzip01/09/27 21:52ID:???
>>264
ありゃりゃ。とんだ無駄足だったな。
0269名無しさん@お腹いっぱい。 01/09/27 22:18ID:???
いや、俺はROMだけど
良いモジュールの紹介あんがと>>_gunzip
コマンドプロトルコイイ(・∀・)!
0270_gunzip01/09/27 22:29ID:???
>>262
まだサンプルをいじって遊んでいる程度ですが、Perl/Tk, GTK-Perlで書いたものより軽快でなかなか気に入っています。

また、ラベル、テキスト、リストボックス等の日本語表示、
kinput2経由での日本語入力についても問題ありません。
自分としては、結構使えそうだ..という感触を持っています。

もし暇があればWindows上ではどうなのか試して欲しいですー。
#今Windowsパーティションが逝っているので試せない...。
>>269
どうもです。Curses使うならCurses::Form, Curses::Widget,Cdkも入れておくと、驚くほどいろんなことができますよー。
(ついてくるサンプルをいじるだけでもいろいろ楽しめるはず)
今は亡き啓学出版からCurses本(for C)も出てますし。
0271 01/09/28 01:17ID:???
>>270
漏れもROMだが、勉強になった。Thanx
027226101/09/28 03:35ID:???
>>265-267
_gunzipさん、ありがとうございます。
(_gunzipさんの投稿は良くROMさせてもらっています。大変勉強になります)

264 の方は、もしかしたら私のところに質問投稿された方かも。。。
(Windows2000 Perl6っていう「印象的な」環境が同一なので。。。)

ありがとうございました。
0273!!!!!01/09/28 05:18ID:???
ファイルテスト演算子ですが、あるディレクトリが存在することを確かめるには -d "directory name"と書くのと、-e "directory name" and -d "directory name" のどちらがいいですか!
あと、Perlの-Tは信頼性が低いというのは本当ですか!!
教えて下さい!!!
0274?????01/09/28 06:25ID:???
どっちでも委員じゃないですか!opendirとかでもイイ鴨!
>本当ですか!! ←ハイ!!!
僕も厨房なんです!ゴメンナサイ!!!
0275JAPU01/09/28 07:56ID:???
ファイルテスト演算子の -T のことかな?
Shift_JIS とか EUC-JP で書かれていると判定に失敗することも多いです。あまり当てにしない方がよいかも。
0276名無しさん@お腹いっぱい。01/09/28 14:51ID:9NVAEcd.
tieの使い方を勉強してたらバグ(?)発見!

package AutoCount;
sub TIESCALAR { my $val = 0; bless \$val; }
sub FETCH { ${$_[0]}++; }

tie my $foo, 'AutoCount';
tie my $bar, 'AutoCount';
foreach (1..3) { print "$foo, $bar\n"; } # ←× $foo が2ずつ増加
foreach (1..3) { print " $foo, $bar\n"; } # ←○ 正常

「読み込むたびに1ずつ増える変数」を作ったつもりなんだけど、
その変数がダブルクォート文字列の先頭にあると、
なぜか2回評価されてしまうよー。文字列の先頭以外なら大丈夫。

使ってるバージョンは
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
です。
0277名無しさん@お腹いっぱい。01/09/28 15:04ID:xYFJBzyw
>>276
v5.6.0 built for i686-linux
version 5.005_03 built for i386-linux
では再現しませんでした。
v5.6.1 built for MSWin32-x86-multi-thread (ActivePerl build628)
で再現。
0278名無しさん@お腹いっぱい。01/09/28 15:22ID:8UXDD7TM
ボイスチャットのようなものを作りたいと思っているのですが、
恐らく探し方が悪いのだとは思いますが、cpanで探しても、
良さそうなモジュールが見つかりませんでした。

・チャットサーバー
・チャットクライアント
の両方を作りたいと思っています。
マイクから音声を入力して、
サーバーを通してクライアントソフトを立ち上げている方々に
リアルタイムで音声を送れるようなものです。

・マイクからの入力を受け取る方法。
・音声をネットを通して送信する方法。
・受け取った音声を再生する方法。
などが知りたいです。
027927801/09/28 15:25ID:8UXDD7TM
どなたか上記の事を出来る方法やモジュールなどを教えてください。
028027601/09/28 16:25ID:???
>>277
検証どもども。うちは同じWin版のver5.6.1のbuild626でした。
ActivePerlのバグか、5.6.0=>5.6.1でエンバグしたか。

さっきActiveState.comのサイトにいって
バグレポート出そうかと思ったんだけど、このバグが既知かどうか
確認できなかった。英語に弱いのよね俺。。。
0281名無しさん@お腹いっぱい。01/09/28 17:01ID:aDO6qmS2
>>280
既知か否かは知らないけど、ActivePerl固有の問題ではなくて5.6.1全般の問題みたいよ。
Solaris2.6でmakeした5.6.1でも同じ挙動
■ このスレッドは過去ログ倉庫に格納されています