Perlについての質問箱 30箱目at TECH
Perlについての質問箱 30箱目 - 暇つぶし2ch409:デフォルトの名無しさん
07/05/02 14:03:43
>>406
知らないけど、ヒストリ用では?

よくUNIX用のシェルであるんだけど、 ! の直後にその番号入れて
実行するとその番号のコマンドが動くんだよ。全く同じなら再入力
する必要がないの。(更に後ろに :s/// のようなのを付けて文字列
置換できたりもする。 !30:s/aa/bb/ みたいな。全てのシェルが
同じこと出来るかどうかは知らないが)。


410:デフォルトの名無しさん
07/05/02 21:18:49
cpanpのメリットがイマイチわからん

411:デフォルトの名無しさん
07/05/02 21:20:37
最近CPAN.pmがだいぶ進化したからCPANPLUS.pmの意義が相対的に薄くなったしねー

412:デフォルトの名無しさん
07/05/03 06:35:39
awkは多少かじったのですが、perlはまるっきりの初心者です。どなたかお知恵を貸して下さい。
2つのファイル a.txt と b.txt を比較して、条件にあった行を抽出、出力するスクリプトを作りたいのです。

具体的には、
[a.txt]
ID, field1, field2
1, 5.8, 7.3
2, 6.3, 8.2
3, 3.2, 4.1
4, 4.8, 4.0
5, 8.3, 10.2

[b.txt]
ID, field1, field2
1, 6.8, 7.7
3, 4.3, 5.5
4, 5.9, 4.9

というファイルがあったとき、b.txt のIDに数値が存在する行だけを a.txt から抽出して a2.txt として保存したいのです。

[a2.txt]
ID, field1, field2
1, 5.8, 7.3
3, 3.2, 4.1
4, 4.8, 4.0

と言った具合にです。よろしくお願いします。

413:デフォルトの名無しさん
07/05/03 07:47:00
#!/usr/bin/perl
use strict;
use warnings;
open my $a, '<', 'a.txt' or die;
open my $b, '<', 'b.txt' or die;
my %ids = map { $_ => 1 } map { (split /,/)[0] } <$b>;
while (<$a>) {
    my $id = (split /,/)[0];
    print if $ids{$id};
}

414:412
07/05/03 08:00:05
>>413さま
 早速のレス、ありがとうございます。助かりました。
 こんなに簡単にできちゃうんですね。しかし、私にはスクリプトの内容は不明...。解読して勉強させていただきます。

415:デフォルトの名無しさん
07/05/03 13:36:22
use IO::File;

sub func {
my $file = shift(@_);
my $input = IO::File->new($file,"r") or die;
ごにょごにょ
  ・
  ・
}

$filename = (ディレクトリからファイルネームをとるロジック);
&func($filename);

みたいに書くと、一番最初にいきなりファイルオープンのエラーが出ます。
その後、ファイルネームをとるロジックが走ってる模様…。
何故か解らないのですが原因解りますでしょうか。

416:デフォルトの名無しさん
07/05/03 13:48:01
>>415
原因はわかりますよ。
あんたが、そう動くようにプログラムを作ったから。

417:415
07/05/03 13:53:53
>>416
早い回答ありがとうございます。
やっぱり自分が悪いんですね。
調べてみます。

418:415
07/05/03 14:26:25
うーんやっぱり解らない…。
サブルーチンが先に実行される事なんてあるのか…?

419:デフォルトの名無しさん
07/05/03 14:50:10
>>415
まあエラーメッセージでも貼ってみ

420:415
07/05/03 15:05:12
>>419
そのようなファイルやディレクトリはありません at (何行目)
としか出ないんですが…。

421:デフォルトの名無しさん
07/05/03 15:08:03
>>420
訳したりせずにそのまま貼れ

422:415
07/05/03 15:16:54
そのようなファイルやディレクトリはありません at test.pl line 32.

だけです。
CentOS4.4、perl5.8.5です。

423:415
07/05/03 15:30:01
フルパス指定してなかった…。

>>422さん、親身になってくれてありがとうございます。
くだらないミスで申し訳ありません。
本当にすみませんでした。

424:デフォルトの名無しさん
07/05/03 15:40:40
>>423
s/422/421/g;

425:デフォルトの名無しさん
07/05/03 15:47:38
突っ込みどころはいろいろあるけど、エラーメッセージは自分のためにも他人のためにもわかりやすくすべし。

my $fp_in = IO::File->new($filename, "<") or die qq(cannot open '$filename': $!);


426:415
07/05/03 16:07:57
>>425
了解です。ただ or die $!;だけしてました。
連休中にコメントありがとうございました。

427:デフォルトの名無しさん
07/05/05 14:17:50
chompって何の略ですか?


428:デフォルトの名無しさん
07/05/05 14:26:54
>>427
略じゃないよ。
噛み切るとかそんな感じ。


429:デフォルトの名無しさん
07/05/05 14:41:24
chomp 【自動】 ~をムシャムシャ食う◆【同】champ

430:デフォルトの名無しさん
07/05/05 14:43:41
へー。ありがとうございました。

431:デフォルトの名無しさん
07/05/05 15:30:31
オブジェクト指向で書いていないので、巨大モジュールの分割がうまいこといかんのです><
具体的には、親パッケージが子パッケージをuseしているとき、
子パッケージから親パッケージのサブルーチンを呼べません。

Giko.pm
[-------
 package Giko;
 use Giko::Mona;
 (omaemonaサブルーチンをEXPORTしている)
 sub omaemona { .... }
-------]

Giko/Mona.pm
[-------
package Giko::Mona;
-------]

となっていた場合、
Giko::Monaの中でomaemonaを呼ぶ方法は、Giko::omaemonaしかないでしょうか?
Giko::Monaでuse Gikoはできないし、use base 'Giko';は違うみたいですし。

432:デフォルトの名無しさん
07/05/05 17:12:46
Encodeモジュールのfrom_toを用いて
「①」「②」や「Ⅰ」「Ⅱ」などを
sjis <-> euc-jp 変換すると文字化けしてしまいます。

回避するにはどうすればいいでしょうか?


433:デフォルトの名無しさん
07/05/05 19:33:33
>>432
つEncode::EUCJPMSのcp51932


434:デフォルトの名無しさん
07/05/05 20:32:56
それは拡張文字なので、 sjis じゃなく cp932 を指定。

435:デフォルトの名無しさん
07/05/05 20:40:22
単純に分割するなら、全部同じ名前空間に展開すればいいんじゃない

Giko/Mona.pm
[-------
package Giko::Mona;
package Giko;
-------]


436:431
07/05/06 01:14:39
遅レスで申し訳ないです。
>>435
なるほど。
まとめると巨大ファイルになりがちで不安だったのですが、
今のところはまだなんとか1ファイルにまとめられそうなので、
同じファイルスコープで仲良く共存してみます。
ありがとうございました。

437:デフォルトの名無しさん
07/05/06 17:12:14

    ( split /\//, $x )[0 .. bar];

リストの末尾要素を除いたリストを返す方法、知りませんか?
barをどう記述すりゃいいのやら。

Perl ならできそうな気がするんですが。思い当たりません。
検索してみたものの、それらしいものも見つけられません。

438:デフォルトの名無しさん
07/05/06 17:31:22
( @hoge, undef ) = split //, $foo ;
じゃダメなの?

439:デフォルトの名無しさん
07/05/06 17:43:01
>>437
尻尾だけ消すのじゃだめなの?

440:デフォルトの名無しさん
07/05/06 17:44:40
最後から2番目の要素をひとつ抜き出すだけなら (~)[-1]
でいいんだけど、範囲演算子で(~)[0..-1]とは書けないんだよな。

配列変数なら@x[0..$#x-1]という書き方もあるが、リストでは$#xに
相当するものが書けない。

とりあえずおもいついたのはこれ。

sub{@_[0..$#_-1]}->(~)


441:デフォルトの名無しさん
07/05/06 18:03:14
>>437
@list = split(/\/(?=.+\/)|\/.+$/, $x)

とかやってないで、全部入れてから$#list--すればいいんじゃね?

442:デフォルトの名無しさん
07/05/06 18:31:19
>>429
首チョンパの略と思ってた

443:デフォルトの名無しさん
07/05/06 18:38:52
まずchopありき。
やがてより安全なchomp生まれり。

444:デフォルトの名無しさん
07/05/06 18:52:28
え…普通にpop関数じゃだめなの

445:デフォルトの名無しさん
07/05/06 19:51:31
popの第1引数は左辺値つーかARRAYじゃないと×じゃ?


446:デフォルトの名無しさん
07/05/06 20:19:01
splice @{[split /\//, $x]}, 0, -1 というのはどうだ


447:デフォルトの名無しさん
07/05/06 20:35:56
ちょんぱ

448:デフォルトの名無しさん
07/05/06 21:07:48
# 悪い例
(split /\//, $x)[0..(split /\//, $x)-2]

449:デフォルトの名無しさん
07/05/06 21:21:14
>>448
scalar contextのsplitは@_を上書きしちゃうからねぇ。


450:デフォルトの名無しさん
07/05/06 22:19:22
(split m{/})[0..(s{/}{/}g)-1]

451:デフォルトの名無しさん
07/05/07 00:17:23
みんなよく頑張ったな。先生感心したぞ。

my $str = 'foo/bar/baz/quux';
sub p { printf ">>%d:[%s]\n", shift, join ',', @_ }

p(438, (my @arr, undef) = split m{/}, $str);
p(439, do { @arr = split m{/}, $str; pop @arr; join ',', @arr }); # & >>444-445
p(440, sub { @_[ 0 .. $#_ - 1 ] }->(split m{/}, $str));
p(441, split m{/(?=.+/)|/.+$}, $str);
p(446, splice @{[ split m{/}, $str ]}, 0, -1);
p(448, (split m{/}, $str)[ 0 .. (split m{/}, $str) - 2 ]);
p(450, (split m{/}, $str)[ 0 .. $str =~ tr|/|/| - 1 ]);
p(451, $str =~ m{(.+?)/}g);

452:デフォルトの名無しさん
07/05/07 00:52:33
>>451
my $str = 'foo/bar/baz/quux';

my $str = '/foo/bar/baz/quux/';

にすると、いろいろ違いが出てくるね。


453:デフォルトの名無しさん
07/05/07 00:58:21
>>451
重箱の隅つつき。

p(451 の行の正規表現。(.+?) ではなく(.*?) でなければ
split を用いた他の例と挙動が違うぞ。
$str = q{/foo/bar/baz/quux} で確かめろ。


454:437
07/05/07 01:10:11
多くのお返事ありがとうございました。

>440
単純な範囲演算子で記述できそうに思った私が考え足らずだったようです。
sub { @_[0 .. $#_ - 1] }->(split /\//, $x) は見た目にわかり易いですね。
いろいろ応用できそうだし。しかし、私は露とも思い至りませんでした。

>441
まぁ、そうなんですよね。

$file = "/usr/local/bin/bar"; # ファイル名が与えられて。。。
$fold = join "/", ~split /\//, $file を使った記述~; # フォルダ名を得る。

ここで余分に変数を使わず、可読性も損なわない方法がありそな気がしたもので。

>446
splice の第一引数はARRAYしかダメだと諦めてしまったのです。
リファレンスについて熟知すると、こんなやり方に気付くんですね。

自分の頭の硬さとリファレンスに対する理解の浅さを恥じて
精進したいと思います。
まず、>440 さんと >446 さんの方法、どっちを使うか悩みます。

455:デフォルトの名無しさん
07/05/07 01:17:53
>>454
いいからFile::Specを使え。

456:デフォルトの名無しさん
07/05/07 01:19:48
>>454
いや、可読性が低下するから、いったん配列に入れてからスライスした方がいいと思うぞ
上のは遊びなんだから

457:デフォルトの名無しさん
07/05/07 02:28:37
こういうよくありそうな処理が案外スラっとかけないもんなんだね。
Dだと [0 .. $ - 1] でいけるんだが。

458:デフォルトの名無しさん
07/05/07 05:57:16
>>456
しかし落ち着いて俯瞰すればこういう雑用の可読性を気にする時点でそのソース全体が残飯ですね。

459:デフォルトの名無しさん
07/05/07 08:33:53
超初心者でふが良いですか?

標準のキーボードから入力を受け取ってどうやれば入力を反映させれるかわからないです・・・

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while(<>){
if($_=m/3/){print"これはこねこ"};
};

↑これでは3を入力するたびに、これはこねこって出てくるんですが、

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while(<>){
if($_=m/3/){print"これはこねこ";$kyara=3}
elsif($_=m/2/){print"これはゴーレム";$kyara=2};
};

これのelsif文が実行されないぽいんですがなんででふか?

頭硬くてすみません・・・

460:デフォルトの名無しさん
07/05/07 09:30:09
> $_=m/3/
でなにをやっているのか良く考えてみ。


461:デフォルトの名無しさん
07/05/07 11:52:54
>>460さん>
$_=m/3/ の部分を$_==3 にすると、うまく行きました!

最初$_==3でエラーが出て、良くわからなくて正規表現にすればうまくいくかなとか思って$_=m/3/に直して、(他の部分も少し直して、)それで3の時うまくいったのでてっきり正解かと思いこんでました。

$_=m/3/を$_==3と同じ意味で使ったつもりだったけど、動作は違うんですね。
もうちょっと調べてきます。
ありがとうございました。

462:デフォルトの名無しさん
07/05/07 12:40:19
うまくいきました!
正規表現、はじめてで意味もよく知らずに=m/3/とかしてたけど、=~/3/とするのが正しかったんですね(汗
==3にすると数字以外の時の入力で(変数は数字ではありませんみたいな)無駄なエラーが出たけど=~/3/ならそういう変なエラーも出ないみたいなので=~/3/を使うことにしました!


$kyara=4;
while($kyara==4){
$_=<STDIN>;
if($_=~/3/){print"これはこねこ";$kyara=3}
elsif($_=~/2/){print"これはゴーレム";$kyara=2}
elsif($_=~/1/){print"これはドラゴン";$kyara=1};
};

もうちょっとがんばってきます!

463:連カキスマソ
07/05/07 13:11:33
もうちょっとがんばってきました(滝汗
if($_=~/3/){処理1}
elsif($_=~/2/){処理2}
とすると、3でも23でも32でも先に$_=~/3/にマッチしてしまう(32なんかは$_=~/2/にマッチさせたい)ので、ちょっと修正しました。


#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
$kyara=4;
while($kyara==4){
$_=<STDIN>;
if($_=~/3$/){print"あなたはお昼ね好きのこねこを選びました☆";$kyara=3}
elsif($_=~/2$/){print"あなたはお人よしのゴーレムを選びました☆";$kyara=2}
elsif($_=~/1$/){print"あなたは気の強いドラゴンを選びました☆";$kyara=1};
};
print "(番号=)$kyara";


これなら33111とかって入力でも3ではなく1のドラゴンとして判断してくれます☆

正規表現って便利ですね☆

>>460さん、アドバイス㌧クスでした!

464:デフォルトの名無しさん
07/05/07 13:18:31
一つ攻略おめ
そこで更に便利な連想配列をどうぞ

465:デフォルトの名無しさん
07/05/07 13:19:13
あっ、この場合だったら配列だけでいいのか

466:460
07/05/07 16:10:24
462

なんか前向きなやつだなw
どっかの知恵袋のとは大違いだ。

ちょっと補足しておくと、Perlの場合処理対象の
変数を省略できることが多い。
たとえば $_ =~ /1/ なら /1/とか。
$_ = m/1/ と書いちゃうと、マッチの結果を
$_ に代入と解釈されて前の値を壊しちゃう。
ほかにもいろいろあるが長くなるので書かない。
まあがんばれ。



467:デフォルトの名無しさん
07/05/07 16:18:01
>>459のチラ裏日記は、他人が見ても役に立ちそうだな。続けてくれ。

468:デフォルトの名無しさん
07/05/07 17:04:17
てか
$inkey = <STDIN>;
これで読み取ったときって改行コード入ってない?
そこらへんも気をつけたほうがいいかな

469:デフォルトの名無しさん
07/05/07 17:27:02
XML::Parser::PerlSAX のエラーハンドリングについて、どなたかご存知でしたら教えてください。
Parse対象のXMLにエラーがあった場合に、ユーザー関数をコールバックさせようと考えています。

デフォルトだと
mismatched tag at line **, column **, byte ***, at
/user/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/XML/Parser.pm
line 187

のように出力されてdieします。



470:デフォルトの名無しさん
07/05/07 17:27:31
URLリンク(search.cpan.org)

をみると、ParserがnewされるところでErrorHandlerに自分で作ったもの(例えばMyErrorHandler等)を指定すればよさそうなのですが、具体的になんという名前の関数を用意し、どのタイミングで呼び出されるかなど、よくわかりませんした。

すみませんが、どなたかお分かりでしたらアドバイスをください。


471:デフォルトの名無しさん
07/05/07 18:14:52
使ったことないので分からんけど
ErrorHandlerに無名サブルーチンを渡しておけばパースに失敗したときにコールバックしてくれるんじゃないの?

472:デフォルトの名無しさん
07/05/07 18:37:28
>>470
俺も使ったことないけど、フツーに考えて
$parser->{ErrorHandler}で例外をキャッチできるってことなんじゃなないの?

473:デフォルトの名無しさん
07/05/07 18:59:18
>>466さん&>>468さん>
㌧クスです!参考にして少し書き換えました!

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while (<>){
if (/[1-3]$/) {chop;$kyara=chop;last;}
};

if($kyara==1){print"あなたはお昼寝好きのこねこを選びました☆"}
elsif($kyara==2){print"あなたはお人好しのゴーレムを選びました☆"}
elsif($kyara==3){print"あなたは強気なドラゴンを選びました☆"};

while (<>){};

こんな感じに☆

>>464さん>
必要になってからがんがります☆(コラ

474:デフォルトの名無しさん
07/05/07 19:00:38
あ、よく見たら、ドラゴンとこねこが逆(汗

475:デフォルトの名無しさん
07/05/07 19:10:56
キメラは?キメラはいないの?

476:デフォルトの名無しさん
07/05/07 19:14:49
1しか押さないだろこれは・・・

477:デフォルトの名無しさん
07/05/07 19:27:33
>>475が「イサキは?」に見えた。
配列や printf を覚えて欲しくなるけど、楽しみながらコツコツやってそうでいいな。

478:デフォルトの名無しさん
07/05/07 19:38:06
>>475
ああ、大きなキメラが入るよ。 今年一番の大幅改良だ。

479:デフォルトの名無しさん
07/05/07 21:43:44
たった今Perlにprintfやsprintfがあることを知った。
俺は車輪を10も20も発明していたらしい。すばらしい!

480:デフォルトの名無しさん
07/05/07 23:31:32
むしろ、どういうルートで習得していけば
そいつらと鉢合わせずに済むか、を考えるのが難しいかも。

481:473
07/05/07 23:32:46
質問してもいいでしょうか。。

print system("cls");
と書くと、PCではちゃんと画面クリアしてくれるんですが、サーバにアップしたら画面クリアしてくれませんでした。
ブラウザの画面をクリアする方法って無いんでしょうか・・?

あと、サーバにアップしたら、

while (<>){
if (/[1-3]$/) {chop;$kyara=chop;last;}
};

という部分も全て無視されました。
たぶん、while(<>)の部分がサーバでは無視されてしまってるんだと思うんですが、
どうすれば良いですか?
HTMLでフォームを表示させてそこから入力させるしか無いのでしょうか?

482:デフォルトの名無しさん
07/05/08 00:03:55
clsはWinのコマンドだし (一応リンクは張ってはあるらしいが・・・)、
そもそも 「コンソールとブラウザの挙動を勉強してください」 としかいえない


ブラウザに対して print ""; でえぇんとちゃうのんかと


STDIN になんもデータ無いからあたりまえです

483:デフォルトの名無しさん
07/05/08 01:16:20
これはどう見ても新手の荒らし

484:デフォルトの名無しさん
07/05/08 02:59:42
>>481
荒らし以前に板違い。>>1

485:デフォルトの名無しさん
07/05/08 05:32:43
すみません。
CGI以外の純粋なperlのみって書いてありますね。
気をつけます。

>>482
なんとなく理解しました。
clsをclearとしても無理だったので普通にフォームからの入力にします。

ご迷惑かけてすみませんでしたm(__)m

486:デフォルトの名無しさん
07/05/08 09:09:04
>>478
「大幅改良っ!!キメラぁぁ!!おにいちゃんかっこいいいいぃぃぃい ぃくううううう!」

487:デフォルトの名無しさん
07/05/09 14:52:59
>>481
JavaScript 埋め込んでクリアすれば良いんじゃない?


488:デフォルトの名無しさん
07/05/10 13:07:53
すみません、
・ローカル変数の一覧を取得する方法
・ハッシュの内容をローカル変数に一括して設定する機能(PHPのextract()関数に相当する機能)
があれば教えてください。

489:デフォルトの名無しさん
07/05/10 13:32:01
>>488
use Dumpvalue とか。

hashの展開はこんなんでいけるだろ。
while (($key, $value) = each %hash) {
eval("\$$key = \$value");
}
ただし任意のキーが使われる場合はexploitになるんで別の方法で。

490:デフォルトの名無しさん
07/05/10 13:56:22
デバッガでも作ろうというのでなければハッシュのまま使ったほうが
いいと思うよ。たぶんろくなことにならない。


491:デフォルトの名無しさん
07/05/10 14:20:02
cpanなしでHTML::Entitiesをインストールする方法を教えていただけませんか。
「Perl "HTML::Entities" インストール」でぐぐってもヒットせず困ってます。

492:デフォルトの名無しさん
07/05/10 14:58:35
>>491
OSは?

493:デフォルトの名無しさん
07/05/10 15:06:48
ActivePerl(Win)だと初めから入ってるし、Unix系で「CPANなしで」ってのも
ピンと来ないし何だろう。「レン鯖で使いたい」なのかな。

494:491
07/05/10 15:50:52
>>492
Linuxです。Perl5.8。
>>493
その通り、海外のレンタルサーバーです。
ただ今はロ-カルのMacでやってるんで、CPANにトライしてみたんですが、最初にいろいろ英語できいてきて、適当に答えてたら設定がおかしくなったのか、
cpan install HTML::Entities
がfetchできないとかでインストールできませんでした。
CPANむずい・・・

495:デフォルトの名無しさん
07/05/10 16:01:10
>>494
要するに、ロ-カルのMacにインストールできずに
> CPANむずい・・・
と言ってるわけだ。

こんなこと言っている人がCPANなしでレンタルサーバにインストール
しようってわけね。考えるだけ時間の無駄というものでしょう。

496:デフォルトの名無しさん
07/05/10 16:04:37
>>491
READMEに書いてあるじゃん

497:デフォルトの名無しさん
07/05/10 16:18:17
HTML-Parser-*.tar.gz ひろってきて展開して
perl Makefile.PL && make && make install
だけどcpanの英語がわからんとか言ってるレベルじゃもっと無理じゃね?

498:491
07/05/10 18:34:51
>>497
HTML::EntitiesはHTML::Parserの一部ということでしょうか。
試しにHTML::Parserをインストールしてみると・・・たしかにHTML::Entitiesも印ストールされました。
貴重なヒントをありがとうございました。
#こんな情報どこにあるんですか。URLリンク(www.xav.com) とか見ても書いてないし。

ちなみにHTML::ParserはMacPortsをつかって
sudo port install p5-html-parser
でいけました。CPANは難しくて分からなかった人でもMacPortsなら楽勝!MacPorts万歳!


499:デフォルトの名無しさん
07/05/10 18:37:45
そ、それはよかった

500:デフォルトの名無しさん
07/05/10 19:02:37
>>498
URLリンク(search.cpan.org)

501:デフォルトの名無しさん
07/05/10 19:08:36
>>498
URLリンク(search.cpan.org) をブックマークしておくといいね。

502:デフォルトの名無しさん
07/05/10 19:08:43
>>498
cpanモジュールなんだからcpanで調べろよ。

search.cpan.orgでHTML::Entitiesをサーチすれば一番上に出てくる

URLリンク(search.cpan.org)

を見れば一発でわかるだろ。


503:デフォルトの名無しさん
07/05/10 22:17:13
Tkを使用して、GUIアプリを作成しています。

大きく二つのフレームから構成しています。
1.左フレーム
2.右フレーム

この二つのフレームにそれぞれScrollbarを設けたいのですが、
Frameウィジェットには何故か-yscrollbarオプション等が無く
Scrollbarウィジェットを動作させることができません。
Scrolledで強引に取り付けると、レイアウトがおかしくなります。
どうおかしくなるかというと、

1.Frame内部のウィジェットの配置が決まらない
(HTMLでいう、alignやvalignが効かない)
2.そもそも、実行時にワーニングのような表示が出る(実行はできる)

1.に関しては、スクロールバーを外せば正常に(期待通りに)配置されます。


Tkを使用される方は、こういうフレーム分けしたレイアウトで、
かつ各フレームにスクロールバーを表示させたい場合、どのような
ウィジェットの使い方をされるのか、教えていただけないでしょうか。

504:デフォルトの名無しさん
07/05/10 22:51:49
Paneというものを見つけました。
Tk::Pane provides a scrollable frame widget.
Once created it can be treated as a frame, except it is scrollable.

自己解決です。
スレ汚し申し訳ありません。

505:デフォルトの名無しさん
07/05/10 23:08:52
Tkのことは分からんけど、そういうときはコンテナにしたフレームの中に
それぞれウィジェットを作って、その中で更にスクロールバーを設けるんでないかい

506:デフォルトの名無しさん
07/05/10 23:09:22
ずこー
リロードしときゃよかった

507:デフォルトの名無しさん
07/05/11 02:34:36
($1, $2, $3, $4 ...)
に相当するような配列の表現はありますか?

508:デフォルトの名無しさん
07/05/11 02:56:54
もっと詳しく
できるならやろうと思ってることも

509:デフォルトの名無しさん
07/05/11 03:40:44
($name, $age, $sex) = ($1, $2, $3);
みたいな部分を、
($name, $age, $sex) = @foo;
とかで済ませられないかと

510:デフォルトの名無しさん
07/05/11 05:02:32
これじゃ駄目?

my $str = 'name=名前,age=年齢,sex=性別';
my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/;

正規表現がアホなのは見逃して。

511:デフォルトの名無しさん
07/05/11 08:22:51
おお
パターンマッチってリストで評価するとそれが返ってくるんだ
よくできてるなあ

でも、
my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/ || next;
という使い方はさすがに無理だった

512:デフォルトの名無しさん
07/05/11 09:18:49
>>511
ヒントは演算子の優先順位

(my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/) || next;

または

my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/ or next;

513:デフォルトの名無しさん
07/05/11 09:34:40
括弧の方にします

普通にパターンマッチをスカラーで評価した時は、
マッチしたかどうかを返すのに対して、
パターンマッチのリストでの評価の代入の評価は、
リストの要素数だから、動作は同じでも意味は違いますよね

514:デフォルトの名無しさん
07/05/11 09:47:23
从*・ 。.・)<SEXよりかはGENDERまたはGENの方がいいかなと思うの

515:デフォルトの名無しさん
07/05/11 11:34:00
ふつう、sex。

516:デフォルトの名無しさん
07/05/11 11:37:09
>>514
入会申込書とかの該当欄に「週2回」って書いたたちか?

517:デフォルトの名無しさん
07/05/11 11:54:30
なにそのゆとりんぐ回答


518:Aransk
07/05/11 13:09:15
>509
何かこちらが勘違いしていたら、ゴメン。
でも、
my @foo=qw(joe 25 male);
my ($name, $age, $sex) = @foo;
print $name,"\n";
print $age,"\n";
print $sex,"\n";
って普通に出来るけど?


519:デフォルトの名無しさん
07/05/11 13:12:30
じゃなくて、マッチングの結果のリストの表現方法のことです

520:デフォルトの名無しさん
07/05/11 13:19:37
ここまで回答出て勘違いするってどういうことだよw

521:デフォルトの名無しさん
07/05/11 17:13:50
>>511
木の実の問題だが、next / last を絡めると途端に可読性が低くなる
気がする。next を絡める予定なら普通に

next if $str !~ /name=(.*),age=(.*),sex=(.*)/ ;
my ($name, $age, $sex) = ( $1, $2, $3 );

でいいじゃんと遅レス。


522:デフォルトの名無しさん
07/05/11 17:41:10
質問です。
Webで拾った以下の数値切り上げ関数を使用しています。
----------------------------------------
$one = ceil(19.1); # $one = 20

sub ceil {
my $var = shift;
my $a = 0;
$a = 1 if($var > 0 and $var != int($var));
return int($var + $a);
}
----------------------------------------

しかし、このceil関数に、(4.4 * 6000)という数値(26400)を引数として計算すると、26401が帰ってきます。
perl -e 'print sprintf("%.50f", (4.4 * 6000));';
を実行すると、
26400.00000000000363797880709171295166015625000000000000
という結果が返ってきました。

これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?


523:デフォルトの名無しさん
07/05/11 17:54:28
なにを期待してるんだ?
そのceil関数は整数じゃなければ1足すってだけだろ

524:デフォルトの名無しさん
07/05/11 17:56:06
>>522
丸め誤差でググっとけ。

perl -e 'print sprintf("%.50f", int((4.4 * 6000) * 1e6) / 1e6);'

525:デフォルトの名無しさん
07/05/11 18:02:20
丸めには銀行方式が絡むか絡まないかがあるから気をつけろ
銀行の丸めは1桁が偶数のときに小数点以下があれば繰り上げだったっけ?
詳細忘れた

526:デフォルトの名無しさん
07/05/11 18:05:36
銀行は四捨六入で0.5のときは一の位を見て切上げか切捨てを行う。
今回は全く関係ない。

527:デフォルトの名無しさん
07/05/11 18:27:48
まず「期待したとおりの切り上げ結果」ってのがわからんのだが。

528:デフォルトの名無しさん
07/05/11 18:34:21
>>522
> これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?

そんなどこの馬の骨ともわからないサブルーチンを使わずに、CPANで
Math-RoundとかMath-Round-Varとか拾ってきて見てみる。

実地の科学技術計算で使われている、充分な仕様のものがあるはず。

529:デフォルトの名無しさん
07/05/11 19:10:59
付け焼刃的だが
$a = 1 if($var > 0 and $var != int($var));
ここの後半の比較式を
int($var) != int($var+0.9999・・・)
にするとか


530:デフォルトの名無しさん
07/05/11 20:54:42
CPANに落ちてるのも作者が有名人なのを除くと
どこの馬の骨かわからないきがしなくもない



531:デフォルトの名無しさん
07/05/11 21:10:46
>>530
有名な馬の骨もいるから気をつけな。

532:デフォルトの名無しさん
07/05/11 21:20:42
麻雀の丸めは四捨六入

533:デフォルトの名無しさん
07/05/11 21:24:12
>>521
現状はまさにそんな感じなんだけど、
($1, $2, $3) っていちいち書くのがなんか気持ち悪くて
どうせ内部で持ってそうなデータなのに
というのが質問の発端

534:デフォルトの名無しさん
07/05/11 21:25:39
そういえばINT関数って、負の数について、
数直線の右に丸めるか左に丸めるかが
言語によって違うよね

535:デフォルトの名無しさん
07/05/11 21:26:44
それで?

536:デフォルトの名無しさん
07/05/11 22:07:13
あるフォルダ内のファイル(個数や名前は分からない)を一つずつ読んでいくにはどうしたいいでしょうか?

537:デフォルトの名無しさん
07/05/11 22:10:48
ディレクトリを読んで、ファイル名を配列に入れて、
ループで回したら?

538:デフォルトの名無しさん
07/05/11 22:13:24
>>536
use File::Slurp;

してread_dir

539:デフォルトの名無しさん
07/05/11 22:13:51
opendir して、リストに対して readdir するか、readdir を while の中でぶん回して下さい
で、処理後は closedir で後始末を。

サブディレクトリも探したいなら再帰でググればヒントは見つかるかと思います

540:デフォルトの名無しさん
07/05/11 22:16:59
実は glob で>>537の1行めまで片づく要件なのかもしれない。

541:デフォルトの名無しさん
07/05/11 22:25:07
リストに入れないで済むならぶん回した方がいい

542:536
07/05/11 23:47:01
皆さんありがとうございました。
readdirをwhileでぶん回す方法でやってみます

543:デフォルトの名無しさん
07/05/12 00:51:52
サブディレクトリまで検索するならFile::Findを使うのが簡単。
Unixのfindを使ったことがあるならfind2perlでPerlのコードを生成できるよ。

File::Find
URLリンク(search.cpan.org)

544:デフォルトの名無しさん
07/05/12 02:54:05
深さのある配列を左から順番に呼んでフラットな配列を作りたいんですが、
よい方法ご存知の方いませんか
@a = ([1,2,3], [4,5,6], [[7,8],[9,0]]);
@b = flatten(@a); # 1,2,3,4,5,6,7,8,9,0

545:デフォルトの名無しさん
07/05/12 02:58:46
nkfと似たような動作するプログラムってPerlについてなかったっけ?

546:デフォルトの名無しさん
07/05/12 03:16:52
>>544
sub flatten(@) { map { ref $_ eq "ARRAY" ? flatten(@$_) : $_ } @_ }

こんなんどうよ。

547:デフォルトの名無しさん
07/05/12 03:25:10
回答しようとして>>546とほぼ同じ定義を書いていたが、
うごかなくて悩んでた。

eqじゃなくて==を使っていたぜorz


548:544
07/05/12 03:50:18
>>546-547
おお、ありがとうございます。
再帰を使うと意外とすっきり書けるもんですね。
頭が硬直化して思いつきませんでした。
ありがたく使わせていただきます。

549:デフォルトの名無しさん
07/05/12 04:16:20
ActivePerlの時は、File::Findは使わずに自前で書いた方がいいよ。
パスのダメ文字が不完全だから、想定外の動作をする。

550:デフォルトの名無しさん
07/05/12 04:17:18
×パスのダメ文字が不完全だから
○パスのダメ文字への対応が不完全だから

551:デフォルトの名無しさん
07/05/13 02:20:04
例えば「__LINE__ ってどういう意味だったかな?」とかと思ったとき
それをperldocで調べようとすると、どういう風にコマンド叩けばいい?
そういう調べものにはperldocは向かない?

552:デフォルトの名無しさん
07/05/13 03:04:18
podのディレクトリに移動してgrep

553:デフォルトの名無しさん
07/05/13 12:02:01
$perldoc perl
して
Reference Manualのカテゴリーからあたりを見つけられるぐらいには慣れておいても損はないかも

554:デフォルトの名無しさん
07/05/13 14:26:50
my $obj = new Foo::Bar::Baz($arg);
というコードで、クラス名を動的に指定するにはどうしたらいいですか。
$klass = 'Foo::Bar::Baz';
my $obj = eval "new $klass(¥$arg)";
$@ and die($@);
のようにevalを使うしかないのでしょうか。なんかもっとスマートな方法があるような気がします。

555:デフォルトの名無しさん
07/05/13 16:22:37 BE:264938764-PLT(13092)
newする時にevalしなくてもおk
むしろパッケージが別ファイルならロード時にevalしる

my $class = "Foo::Bar";
eval "require $class;"
die $@ if $@;
$class->new;

イマドキはUNIVERSAL::requireなんでしょうけど

556:デフォルトの名無しさん
07/05/13 16:45:48
普通に、こんなんでいいでしょ。
----
package Foo::Bar::Baz;
sub new{ bless [] }
sub qux{ print "qux!!" }

package main;
eval{
my $klass = "Foo::Bar::Baz";
my $obj = new $klass;
$obj->qux;
};

557:デフォルトの名無しさん
07/05/13 16:49:53
eval EXPR はインジェクションの可能性があるからなるだけ使わんほうがよいね。

558:デフォルトの名無しさん
07/05/13 19:08:29
>>557
この一連のコードで具体的にどうやって?w

559:デフォルトの名無しさん
07/05/13 19:20:02
そりゃサンプルコードなんだから汚染された文字列が紛れ込む分けなかろう

560:デフォルトの名無しさん
07/05/13 19:59:57
やはり妄想で危険を煽っただけか。その妄想を極めればプールに入っただけで受精するとか言い出す外基地になれるよ。

561:デフォルトの名無しさん
07/05/13 20:49:22
もうゴールデンウィークはおわったよ?

562:デフォルトの名無しさん
07/05/14 06:21:05
影さん「evalがあればどんなプログラムでも書けるぜ!」

563:デフォルトの名無しさん
07/05/14 13:44:05
文字列eval使わなくてもいいところで使うのはあんまり美しくないと思うけどな。
>>555のも eval { require $class }; のほうが綺麗だと俺は思う。

564:デフォルトの名無しさん
07/05/14 15:48:00
NET::POP3とMIME::Parserを使ってメールの送信元で振り分けて処理をするプログラムを
作りたいんだけど、headのfromってメルアドが入ってなかったりしてどこをみたらいいかわかりません。
送信元メルアドを参照するにはどこをみたらいいんでしょうか?

565:デフォルトの名無しさん
07/05/14 17:44:40
>>564
rfc2822を読め

566:デフォルトの名無しさん
07/05/15 00:07:34
>>563
それを実行したことある?

567:デフォルトの名無しさん
07/05/15 10:45:02
>>565
それじゃ何の答えにもなってないだろ馬鹿

>>564
ヘッダに送信元が正しく入っているかは保証されてないから入ってないときは取りようがないよ

568:デフォルトの名無しさん
07/05/15 11:15:16
>>565
これからは全ての質問に「仕様書読め」「解説書読め」で解決していくんですか?

569:デフォルトの名無しさん
07/05/15 11:26:10
Perlの質問じゃなくてメールの仕様に関する質問だからしゃあないのでは。
確かに不親切だけどね・・・


570:デフォルトの名無しさん
07/05/15 13:35:28
>>568
なぜそうしたいの?

571:デフォルトの名無しさん
07/05/15 14:19:50
570は小学校の国語をやり直した方がいいと思うの

572:デフォルトの名無しさん
07/05/15 14:34:27
いま算数やってるの

573:デフォルトの名無しさん
07/05/15 14:38:52
>>565 にレスしてる奴って全部 >>564 の自演だろ。
メールの仕様に関してはスレ違い。

574:デフォルトの名無しさん
07/05/15 14:45:29
おお、帰ってきた。>>565が黄泉の国から帰ってきた。

575:デフォルトの名無しさん
07/05/15 15:22:10
>>573
なんで>>564>>567が自分で回答すんだよw
まあみんなやさしめに行こうよ。

576:デフォルトの名無しさん
07/05/15 15:37:37
英語こわいからヤダヤダ
だからRFCなんか読むのもヤダヤダ

577:デフォルトの名無しさん
07/05/15 15:51:24
もしかして「RFC」という文字列が荒しを板中から集めてる?

578:デフォルトの名無しさん
07/05/15 15:55:46
全然荒れてねえだろwww

579:デフォルトの名無しさん
07/05/15 16:17:56
>>565は、RFCを読んだことがあるのを自慢したいだけ。

580:デフォルトの名無しさん
07/05/15 16:19:50
自慢てwwwゆとり乙www

581:デフォルトの名無しさん
07/05/15 16:52:34
>>575
他人を装って自分を擁護するのって結構あるからな。
別に珍しくもないから、一応そう書いただけ。

582:デフォルトの名無しさん
07/05/15 17:18:06
標準規格の類を挙げると必ず変な流れになるな。

583:デフォルトの名無しさん
07/05/15 17:28:10
めんどくせぇから書きたいように書けよ

584:デフォルトの名無しさん
07/05/15 21:53:54
昼間子供が書き散らしたようだな

585:デフォルトの名無しさん
07/05/15 22:52:22
>>584
やっと起きたか、ひきこもり君


586:デフォルトの名無しさん
07/05/15 23:36:02
どこを読めばわかるよってのも教え方の一つだと思うんだ

587:デフォルトの名無しさん
07/05/16 00:07:36
>>579
RFCを読んだことが自慢になると思っている時点で(ry

>>586
ざっとでも一通り目を通しておかないと他の部分の実装ですぐに詰まってまたスレ違いの質問してくるでしょ。
スタンドアローンアプリなら好きなように実装汁だけど
そもそもネットワークアプリは相互に協調するものなんだから
「とりあえず動いている」「自分だけよければいい」という存在は迷惑だろ。

588:デフォルトの名無しさん
07/05/16 00:17:48
どうせただのメールフィルタなんだからどうだってかまわんだろう

589:デフォルトの名無しさん
07/05/16 05:26:48
まぁ、仕様書は基本としても、それを守ってない場合も多々あるわけでw

590:デフォルトの名無しさん
07/05/16 07:24:45
そうそう、RFC読まなくていい言い訳は
探せば結構見つかるよねw

591:デフォルトの名無しさん
07/05/16 10:32:13
でもまぁ読むのだるいじゃん。
遠回りすぎるし。
必要だとは思うが。

592:デフォルトの名無しさん
07/05/16 13:12:16
104で電話番号聞いたら電話帳読めって返すようなもんだもんな

593:デフォルトの名無しさん
07/05/16 13:14:50
>>592
違うだろ。携帯販売店にどっかの会社の電話番号を聞くようなもん。
んなもん、104で聞け、つまりスレ違いだ。

594:デフォルトの名無しさん
07/05/16 13:24:53
ここを104番に例えられると認識している人間がいるのも怖ろしいな。


595:デフォルトの名無しさん
07/05/16 14:02:54
交番で道を尋ねたら「地図を見れ」ってのがしっくりくる

596:デフォルトの名無しさん
07/05/16 14:18:25
104や交番は仕事だけど、ここはただの掲示板だ

597:デフォルトの名無しさん
07/05/16 14:58:15
道に迷っている人に通りすがりの人が「地図板はあそこにある」と言ったら、
別の通りすがりの人が食ってかかっているわけか。
「地図の見方を知ってるのを自慢したいだけ!!」と叫びながら。


598:デフォルトの名無しさん
07/05/16 15:44:27
質問させて下さい

[初めてのPerl 3版]という本を読みながら勉強しているのですが、
3章の練習問題をしていて疑問に思いました。
@list = qw/ a b c d /;
print @list . "\n"; #こうすると、リストの個数が表示される。
print @list; #こうすると、リストの内容が表示される。
print @list , "\n"; #こうすると、リストの内容が表示される。

上記のように、3つの記述ほうほうで内容が変わってきます。
私が疑問に思ったのは、どうして"."で連結すると、リストの個数が
表示されるのでしょうか? また、","が急に出てきたのですが、どう
いった意味があるのでしょうか?

すみませんが、宜しくお願いします。



599:デフォルトの名無しさん
07/05/16 15:51:33
>>565が暴れてます

600:デフォルトの名無しさん
07/05/16 15:59:25
義務ってわけじゃないだろうけど質問スレなんだから質問に答えたくない奴は
スルーすればいいだけなんじゃねーの?
それをわざわざ嫌味ったらしく書き込むから多いから荒れるんだよ。
黙ってろよ。


601:デフォルトの名無しさん
07/05/16 16:15:12
>>598

print @list . "\n";
まず、配列(ここでいう@listね)をprintすると配列の中身をすべて出力するのね。
それで↑は、@listと\nをつなげてひとつの文字列としてる。
配列はスカラ参照するとその要素数を返すから、「配列の要素数+改行」というひとつの文字列として出力される。

print @list;
これは上で言ったとおりそのまま配列の中身をぶちまける。

print @list , "\n";
printは出力対象をカンマで区切って複数指定できるのね。
だから、↑の場合は一つ目の例と違って@listと\nは別物として並列に並んでるのね。
print @list;
print "\n";
と同じというわけ。
だから配列の中身+改行となる。

602:デフォルトの名無しさん
07/05/16 16:18:22
>>600
逆だろ。「RFCを読め」という回答があっという間に返ってきたのに、
それを気に入らなかった奴が騒いでいる。わざわざ嫌味ったらしくね。
黙っていればいいのにね。

603:598
07/05/16 16:32:22
>>601
スカラーとして参照されたから、要素数を返したんですね。
詳しく説明していただけたおかげで、理解できたと思います。

ありがとうございました。


604:デフォルトの名無しさん
07/05/16 16:36:58
>>601
部外者だが俺も勉強になった。ありがとう。

605:デフォルトの名無しさん
07/05/16 17:27:58
>>567>>568が発端になっているわけか。

まあみなさん、不足だと思ったら、攻撃しないで補うということで。

606:デフォルトの名無しさん
07/05/16 19:05:20
ボク今夜寝る時、ママにRFC読んでもらうんだ。

607:デフォルトの名無しさん
07/05/16 19:07:15
フーン

608:デフォルトの名無しさん
07/05/16 19:33:23
⊂二二二( ^ω^)二⊃ フーン

609:デフォルトの名無しさん
07/05/16 19:43:17
まぁ優しい俺が貼ってやるよ
URLリンク(www5d.biglobe.ne.jp)
え、みんなこれ全部読んだの??

610:デフォルトの名無しさん
07/05/16 19:48:27
荒らしてるのはいつも質問者
これ、豆知識な

611:デフォルトの名無しさん
07/05/16 19:57:54
そうなの?

612:デフォルトの名無しさん
07/05/16 20:17:47
そういえば質問者のフォロー全然ないな

613:デフォルトの名無しさん
07/05/16 21:26:11
暴れ杉だろう・・・
業務で使うときでも読まないのかだぜ?

614:デフォルトの名無しさん
07/05/16 21:34:58
さらに優しい俺が、>>565が指摘した該当文書を>>609から晒す

URLリンク(www.puni.net)

次の人:
 上の文章からFromの仕様が書いてある文章を見つけ、行番号等の場所を報告

さらに次の人:
 的確に抜粋して、ここに書く

以上で当スレのミッションは終了となる。

615:デフォルトの名無しさん
07/05/16 21:51:39
そーいや、番号がすぐ出てくるRFCって822(2822)と1149くらいだな、俺。


616:デフォルトの名無しさん
07/05/17 00:28:17
>>565は、rfc2822読むのをやめへんでぇ~

617:デフォルトの名無しさん
07/05/17 02:12:42
RFC自重

618:デフォルトの名無しさん
07/05/17 04:34:55
CRC556

619:デフォルトの名無しさん
07/05/17 07:08:02
そろそろスレ違いで引っ張るの止めないか?…
RFC 読もうが読ままいが、perl についての質問に該当しなかった訳だし
RTFM ってのは最低限わきまえとく事だし
(ようするに俺も RFC 嫁よって思ってる訳だけど)

620:デフォルトの名無しさん
07/05/17 10:16:00
   . ______________
   | i┬┬┬┬┬┬┬┬┬┬┬┬┬i |
   | |┼ ,r-l^i ‐┼y'⌒~}ー┼y'⌒~}ー┼| |
   | |┼と::_;;;:_}┼じ;_;:;ナ┼ヽ;:;:: :;;:;:;)┼| |
   | |┼┼┼┼┼┼┼┼┼┼┼┼┼| |
   | |┼f_:::_:;;;り┼{:;;;::_;;う┼( ;;:;:;:"")┼| |
   | |┼く:;;;_:;;Jー|ーじ;_;:;ナ┼f_::_::;;;;り┼| |
   | |┼┼┼┼┼┼┼┼┼┼┼┼┼| |
   |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  .|
     ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

とりあえず焼肉でも食って落ち着こうぜ

621:デフォルトの名無しさん
07/05/17 10:40:54
>>609
小説を読むわけじゃないんだから、必要なときに必要な箇所を読むんだよ。

622:デフォルトの名無しさん
07/05/17 19:06:20
つうか今回の事でRFCが頭に入ったww

623:デフォルトの名無しさん
07/05/17 20:59:23
パッケージの名前は「foo」のような小文字にするのか、それとも「Foo」のように
大文字で始めるのか、どちらがいいのでしょうか。
perl5.8.8のライブラリを見るとどちらもあるのですが、Perlの流儀だとどのような命名規則がいいのでしょうか。

624:デフォルトの名無しさん
07/05/17 21:24:06
>623
foo みたいに小文字で始まってるのは pragma 扱いだと思う。

625:デフォルトの名無しさん
07/05/17 21:28:28
根拠見っけてきた。

perldoc perlmodlib より
>Package/Module names are an exception to this rule. Perl informally
>reserves lowercase module names for 'pragma' modules like integer
>and strict. Other modules normally begin with a capital letter and
>use mixed case with no underscores (need to be short and portable).

626:デフォルトの名無しさん
07/05/17 23:08:09
pragmaが何かわかりませんが、とりあえず自作のパッケージは大文字で始めるのがいいということでしょうか。
どうもありがとうございます。

627:デフォルトの名無しさん
07/05/18 01:56:34
use strictとかは使ったことあるかお?そーいうことだお

628:デフォルトの名無しさん
07/05/18 02:52:38
pragmaっつーのは端的に言えばインタープリタの動作を変えるもんだ。
よく見かけるのは"strict", "warnings","lib", "overload", "vars", "constant", "blib"あたりかな。
あとは、マルチバイト圏の人が"utf8", "encoding", "open"を使ってたりすることあるな。

P.S
分からないことは恥ではない、分からないことを放置することが恥なのだ


629:デフォルトの名無しさん
07/05/18 03:08:16
baseも仲間に入れてあげてください;;


630:デフォルトの名無しさん
07/05/18 03:14:05
あ、めんごw
baseはOOで継承するときに使うやつな。
よく使うのに、度忘れしてたw


631:デフォルトの名無しさん
07/05/18 20:35:21
有限の整数の集合の中から偶数だけを取りだしてその数を2倍するといった
(1 2 3 4 5 6) -> (4 8 12)
みたいな処理を簡潔にperlで表現したいなら、どのように書くんでしょうか?

632:デフォルトの名無しさん
07/05/18 20:42:42
map { $_ * 2 } grep { $_ % 2 == 0 } (1,2,3,4,5,6)


633:デフォルトの名無しさん
07/05/18 21:20:39
自作のperl script にドラッグ&ドロップして使いたいんですが、
皆さん、どうされてます?
外部補助ツール等を使用しない方法で、perlのみで行いたいんです。
ググッてもうまくヒットしないので…恐縮ですが教えてください。

634:デフォルトの名無しさん
07/05/18 21:22:10
>>633
すいません。WindowsXPでactiveperlの環境です。

635:デフォルトの名無しさん
07/05/18 21:31:03
DropHandlerや{60254CA5-953B-11CF-8C96-00AA00B8708C}でググるといいと思うよ。

636:デフォルトの名無しさん
07/05/18 21:39:21
>>635
OS側の設定だったんですね。助かりました。

637:デフォルトの名無しさん
07/05/19 16:16:37
>>632
mapもgrepもおなじものだが、意味的に条件で抽出のときはgrepを使いたくなるな。

式が偽になったものは返値には残らないので
map { $_ % 2 == 0 && $_ * 2 } ( 1,2,3,4,5,6);
でもOK


638:デフォルトの名無しさん
07/05/19 16:46:07
いや、それだと空文字がたくさん残るだろ。

map { $_ % 2 ? () : $_ * 2 } (1,2,3,4,5,6);
としないと。

639:デフォルトの名無しさん
07/05/19 16:47:21
>638 =~ s/空文字/空文字列/;

640:デフォルトの名無しさん
07/05/20 00:28:19
mapとgrepが同じとな?あなおそろしあ

641:デフォルトの名無しさん
07/05/20 01:38:54
map !($_&1)&&$_<<1||()=> ( 1,2,3,4,5,6)
配列に 0 が入ってたらどうするんだろ
想定外でどうでもいいのかな?
これだと(当たり前だけど)要素の値が 0 の時には戻り値無し。

642:631
07/05/20 12:31:03
ありがとうございます。
Lispを勉強して、次はPerlにスイッチしたいと思っていて、なるべくLispスタイルで
プログラミングできるようにしたいと思っているんですが、二つ以上のリストを元にして
結果を返すような
(1 2 3 4 5) (6 7 8 9 10) -> ((1 6) (2 7) (3 8) (4 9) (5 10))
といった処理はどうするのでしょうか?mapの使いかたを見ると使えるのは$_だけみたいなのですが。

643:デフォルトの名無しさん
07/05/20 12:40:10
普通にmapでできるだろ
map {
 $a = $_;
 $b = shift @b;
 処理
} @a

644:デフォルトの名無しさん
07/05/20 12:43:41
どうすれば納得するのか知らんが、
とりあえずリファレンス使わないと、リストのリストとかはできんと思うが。

645:デフォルトの名無しさん
07/05/20 14:06:29
$,=q/,/;$\=qq/\n/;
print @$_ for foo([1 .. 5], [6 .. 10]);
sub foo { map [map shift @$_, @_], (1 .. (sort map scalar @$_, @_)[-1]) }

こんな感じか。

646:デフォルトの名無しさん
07/05/20 14:09:46
sub foo { map [map shift @$_, @_], (1 .. (sort {$b <=> $a} map scalar @$_, @_)[0]) }

間違えた。

647:デフォルトの名無しさん
07/05/20 15:07:14
>>642
っ[List::MoreUtils]

648:デフォルトの名無しさん
07/05/20 15:27:33
ある文字列を一文字単位で全部分解して、配列に格納させたいのですがうまくいきません。
(空白も含みます。)

$text = 'aあ かf漢字';

例えば、上の$textを分解して、

@array = ('a', 'あ', ' ', 'か', 'f', '漢', '字');

のような配列を作りたいのです。

splitを使って
@array = split(/[\w\s]/, $text);
としたのですが、何も格納されずうまく出来ませんでした。
どのようにすれば出来るでしょうか?

649:デフォルトの名無しさん
07/05/20 15:35:50
use encoding cp932; # ソースの文字コードにあわせる
$text = 'aあ かf漢字';
@array = split(//, $text);

650:648
07/05/20 15:47:43
>>649
何も指定しないと一文字単位で分解されるんですね。splitは。
その後、
while($text){
 push(@array, substr($text,0,1,''));
}
といったコードを思いついたのですが、
649さんのコードの方がすっきりしてるのでそちらを使わせていただきます。
ありがとうございました。

651:デフォルトの名無しさん
07/05/20 16:32:30
>>650
俺は初心者で、この前俺もそういうコード考えて使ってみてわかったんだが、
substrは1バイト単位で長さ見てるけど日本語は2バイトコード使ってたりしてて、
結局その>>650みたいなコードでひらがなやカタカナや漢字取り出すときにsubstr($text,0,1,'')ってところで2バイト中の1バイトしか取り出せなくて中途半端になるんだよな。
2バイト文字限定なら取り出す長さを2バイトにすれば問題無いし、アルファベットや数字は1バイトで問題無いけど。

>>649のコードなら、俺は大丈夫なのかどうかは知らないけど、なんとなく大丈夫っぽい感じする。

652:デフォルトの名無しさん
07/05/20 16:39:13
>>651
substrのOFFSETやLENGTHの単位は文字数だから、>>650でも
use encodingで文字コードを適切に指定すれば何の問題もないよ。

653:デフォルトの名無しさん
07/05/20 16:59:52
>>652トンクス

参考書見て、substrの説明に「文字数ではなくバイト数で取っていることがわかります。日本語の入った文字では使わないようにしましょう」
ってあったから、substrでは永遠に2バイト文字と1バイト数字アルファベットは同時に処理できないものと思ってました。
use encodingで指定すればsubstrでも2バイト文字部分は長さ1となるんですね。

use encodingでコード指定するのが大切ってことを理解しますた。

654:デフォルトの名無しさん
07/05/20 17:20:46
その機能入ったのはつい最近(といっても5年前だが)だから、古い本だったら書いてないだろうし、
厚みで値段稼いでるような本なら、そのあたりいい加減でも不思議じゃないな。

655:デフォルトの名無しさん
07/05/20 17:45:13
>>654
なるほど、確かに初版第1刷が2003年ってなってる。


初心者質問ですが
my@b=("$a[1]","$a[2]","$a[3]","$a[4]","$a[5]","$a[6]","$a[7]","$a[8]");

こういう書き方をもっと短く書けませんか?
既に@aには$a[0]や$a[9]から先にも変数が入ってる状態で、$a[1]~$a[8]までを@bに入れたいです。

$a[1~8]みたいな表現が存在するなら表現方法を教えてほしいです。

656:デフォルトの名無しさん
07/05/20 17:57:06
>655
@a[1..8] で OK。
キーワードはスライス。

ところで、なんで "" で囲ってるの?

657:デフォルトの名無しさん
07/05/20 17:58:21
文字列化する必要があるんじゃね?

my @b = map "$_", @a[1..8];

658:デフォルトの名無しさん
07/05/20 18:14:52
>>656>>657
激しくトンクス!
そういえばfor(0..7)とか使ってました。
@a[1..8]という書き方があったとは。


659:デフォルトの名無しさん
07/05/20 18:23:29
$a   @a
^これや^これの名前ってなんだっけ?

660:デフォルトの名無しさん
07/05/20 18:39:44
普通にドルとアットでいいんじゃない?
なんか$でプレフィクスとか見つけたけど。

@は配列ArrayのAを表し
$は・・・なんだっけ?Sからはじまるなんかの単語じゃなかったっけ?
%は/の左の丸がキーで、/の右の丸が値を示すんだっけ?
なんかそんな感じ。
どうせ声出して読まないし気にするまでも無いような・・・

661:デフォルトの名無しさん
07/05/20 18:45:22
ファニー文字?

662:デフォルトの名無しさん
07/05/20 18:57:19
ああ、思い出した。$はスカラーのS。

663:デフォルトの名無しさん
07/05/20 18:59:10
>>659,660,661
sigil だと思う。
sigilsと複数形にすることも多いが


664:デフォルトの名無しさん
07/05/20 19:10:35
ネットショップなんかで自動監視・購入できるスクリプトが組めるらしいのですが
どういったものなんでしょう。
役に立ちそうなサイトがあったら教えてください。

665:デフォルトの名無しさん
07/05/20 19:44:38
>>663
あーそれそれ。さんくす

666:デフォルトの名無しさん
07/05/20 20:34:14
なんかPerlスゲー人が書く魔法みたいなコードなんか紹介してください
友達が言ってたんですが他の言語だと20行くらいかかりそうな処理も1行で記述できるくらい魔法ちっくなことができるって聞いたんですが本当ですか?

667:デフォルトの名無しさん
07/05/20 20:51:05
本当です
すべてが魔法なので紹介しきれません

668:デフォルトの名無しさん
07/05/20 21:07:49
少なくともCOBOLで20行文の命令を1行にまとめることはできるよ。

669:デフォルトの名無しさん
07/05/20 21:14:04
確かにPerlを使えばどんな複雑な処理でも一行でかけるなw

670:デフォルトの名無しさん
07/05/20 21:31:15
何行で書けるとかPerlたん変態っぷりはそんなことじゃないだろ

671:デフォルトの名無しさん
07/05/20 21:36:44
python見習え

672:デフォルトの名無しさん
07/05/20 21:46:12
>>667-668
もっとやさしく!!

>>669
a + b; b + c; c + d; ... はい1行wwwwwとかは禁止なんです

>>670
もっとやらしく!!

673:デフォルトの名無しさん
07/05/20 22:03:30
>>666
では、とっておきの電卓プログラムを紹介しようか。
C++で書くと、何十ステップも必要だろう。

while(<>){print eval($_)}

674:デフォルトの名無しさん
07/05/20 22:23:07
>>673
カレントディレクトリ以下のファイルがすべて消えました!><

675:デフォルトの名無しさん
07/05/20 22:43:53
>>672
きもい

676:デフォルトの名無しさん
07/05/20 22:50:56
それも計算によって実現してるからな

677:デフォルトの名無しさん
07/05/20 22:55:32
>>674がマジなのか気になる。
>>673をしたらキーボードからどんな文も実行できてしまうよな?
>>674を書いて実行してキーボード触らずにマウスで閉じたら何も起きないよな?

恐怖体験アンビリーバブー

678:デフォルトの名無しさん
07/05/20 22:56:20
ちょっと安価ミスしたが気にしないでくれorz

679:デフォルトの名無しさん
07/05/20 23:18:11
1行で書けるかれしれんが、書く人の労力は20行だよ。

680:デフォルトの名無しさん
07/05/20 23:30:26
でも短く書く技術は知っておきたいかも。
サブルーチンは、多少汚くても短くまとめたいし。
なんか良いサイト無い?

681:デフォルトの名無しさん
07/05/20 23:31:39
結局、正規表現アクロバットきぼんってこと何でしょw

682:クロニクル ◆ob60wHXQlc
07/05/20 23:32:46
VISTAでACTIVE PERLをインストールしたいんですが、

Build 820 setup

CustomsetUP のところでInnstlationErroが出るんです。
初心者なのでわからないことがたくさんあります。
以前XPで何度かインストールしたのですが、VISTAになったとたんできなくて
苦労しております。どうかご教授お願いいたします。



683:デフォルトの名無しさん
07/05/20 23:34:48
>>680
一子相伝も特殊技術だから。

684:デフォルトの名無しさん
07/05/20 23:45:25
正規表現使ってアクロバットするのと、正規表現使わずに少し長いの書くのって、
正規表現使ったほうが早いとかある?

685:デフォルトの名無しさん
07/05/20 23:48:10
そんなの場合によるとしか言いようがないだろ。

686:デフォルトの名無しさん
07/05/20 23:51:35
>>680
このスレの前の方だけでもいくつかあると思うよ。
過去ログ辿ればもっとあるし。

687:デフォルトの名無しさん
07/05/21 00:12:00
結城浩の『Perlクイズ』の過去ログ漁ってみるとか
(結城さんではなく回答者が時々アクロバティック)

688:デフォルトの名無しさん
07/05/21 15:57:04
>>667のコメントだけで、後はスルーすれば良かったのにな

689:8
07/05/21 16:50:18
CGIを自由に使えるようになりたくて独学で勉強しようとしたのですがCGIはPERL
記述?だからと思いPERLの詳しくなればわかると思いこの板にきました。
PERLに強くなるにはなにを学べばいいですか?ラクダ本というのがいいとどっかで
見たのですが間違いないですか?
そもそもCGIを自由に使えるようになるのはPERLを詳しくなっても意味ないですか?
CGIを自由に扱えるようになりたいので勉強の仕方わかる方お願いします。

690:デフォルトの名無しさん
07/05/21 16:54:26
日本語がお上手ですね!

691:デフォルトの名無しさん
07/05/21 16:57:15
>>1
> CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
> CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
> (WEBプログラミング板 URLリンク(pc8.2ch.net) )

692:デフォルトの名無しさん
07/05/21 18:50:54
>>691
向こうでも相手にされていない件についてw

693:デフォルトの名無しさん
07/05/21 19:01:22
>689
かわいそうだからマヂレスしてあげるよ

勉強しなほうが身のため

694:8
07/05/21 19:01:30
気長に待ちますよ^^

695:デフォルトの名無しさん
07/05/21 19:01:48
相手にできる最低レベルってのはあるからな

696:8
07/05/21 19:02:41
勉強しなほうが身のため
なぜ!?



697:デフォルトの名無しさん
07/05/21 19:03:45
日本語でおk

698:8
07/05/21 19:07:37
相手にできる最低レベルってのはあるからな
悲しいこと言うなぁ・・

699:デフォルトの名無しさん
07/05/21 19:08:32
しゃぶれよ

700:デフォルトの名無しさん
07/05/21 19:11:06
とりあえず句読点を勉強しる!

701:デフォルトの名無しさん
07/05/21 19:37:26
こういう低レベルな質問はwebprogでやれよ

702:デフォルトの名無しさん
07/05/21 19:39:59
お前が >>8 氏でないことだけは確かだ。名前欄の詐称を止めろ
CGI を覚えるより何より、ここの使い方をまず真鍋

703:デフォルトの名無しさん
07/05/21 19:50:23
そして>699

704:デフォルトの名無しさん
07/05/21 21:19:43
>>689
マジレスするのもどうかと思うが、
CGIを勉強したいならラクダ本よりネズミ本がオヌヌメ。
Perlをきちんと習得したいなら、ラクダ本よりリャマ本をまず嫁。
リャマ→ラクダ→ネズミの順で読むといい。
後はWebProg板逝け。

705:デフォルトの名無しさん
07/05/21 21:23:45
逝く前にしゃぶれよ

706:8
07/05/21 21:24:52
ここは恐いインターネッツですね

707:デフォルトの名無しさん
07/05/21 21:38:57
リャマの次にラクダ読んだら死ぬって

タダで読めるPerl本
URLリンク(www.perl.org)
ネズミ(初版)
URLリンク(www.oreilly.com)

ただリャマだけは小遣い溜めてでも買うべきだと思うんです

708:デフォルトの名無しさん
07/05/21 23:06:21
個人的にはリャマの次にCookbookでもいいと思う。
ラクダも読み物として面白いけど、Cookbookのほうが実践的なテクニックを身に付けられるんでないかな。

709:デフォルトの名無しさん
07/05/21 23:57:50
CookbookもいいけどPBPも読んだほうがいいと思う
なんつーか、その、K○NTクローンが増えても困るっつーか

710:デフォルトの名無しさん
07/05/22 00:20:38
中途半端な伏字を使うやつは大抵頭が悪い

711:デフォルトの名無しさん
07/05/22 00:38:13
やっぱ王道は
○ャ○から入って、○○○と○○○○○○○○を併用さ。
ラクダ?○○○○○○c で十分



…中途半端じゃない伏せ字も頭悪い。

712:デフォルトの名無しさん
07/05/22 00:52:26
Perl Hacksでハァハァする

713:デフォルトの名無しさん
07/05/22 00:56:24
>>711
> ○ャ○から入って、○○○と○○○○○○○○を併用さ。
ジャバ、コボル、N88BASIC?

> ラクダ?○○○○○○c で十分
わがんね。

本題のほうは「なんでバレバレの伏せ字を使う人がいるのか」が昔から不思議。

714:デフォルトの名無しさん
07/05/22 01:04:42
perldoc

715:デフォルトの名無しさん
07/05/22 01:08:17
>>713
あえて理由付けするなら、検索に引っかからないため。
まぁ、やってる方の心理としては○○だと思うがw

716:713
07/05/22 01:20:11
>>714
ボケが思いつかなくて「わがんね」でした。手間をかけさせてごめんなさい。

>>715
うーん、検索ですか。なるほど。
でも、△△△にする○○の大半は××なだけなんでしょうね。

717:デフォルトの名無しさん
07/05/22 01:51:29
○○○○、○○○○○○○○。

718:デフォルトの名無しさん
07/05/22 02:37:09
はじめまして。最近Perlを使い始めた初心者です。

useを使用し、下位ディレクトリにあるモジュールを読み込むには

use ディレクトリ名::モジュール名;

なのはどの初級者本にも書いてあるのですが、
上位ディレクトリにあるモジュールの読み込み方が分かりません。
パスはどう書けばよろしいのでしょうか?


719:デフォルトの名無しさん
07/05/22 03:48:18
use lib

720:デフォルトの名無しさん
07/05/22 07:22:32
>>710
十代後半の女オタクの馴れ合いみたいで気持ち悪いよね。

721:デフォルトの名無しさん
07/05/22 08:20:44
○まん○

722:デフォルトの名無しさん
07/05/22 13:39:11
○ま○こ

723:デフォルトの名無しさん
07/05/22 15:24:14
○まんこ

724:デフォルトの名無しさん
07/05/22 15:43:31
8まんこ

725:デフォルトの名無しさん
07/05/22 15:58:39
レベルの低い会話はwebprogでやれ

726:デフォルトの名無しさん
07/05/22 16:30:10
>>719
ありがとうございました。できました。

727:デフォルトの名無しさん
07/05/22 18:07:33
>>725
爆笑

728:デフォルトの名無しさん
07/05/22 18:08:03
cgiでPOSTされたデータを標準入力から一度取得した後
同じプログラム内で再度、標準入力から取得することは可能ですか?

既存のプログラムに、入力チェックを追加したいのですが、2回目はデータが空になります(当たり前?
一応、seekしてみたのですが、うまく戻りそうにありません
バカな質問している気がしていますが、「そんなことできるワケねぇだろ、バカ」でも良いのでアドバイス下さい

729:デフォルトの名無しさん
07/05/22 18:11:19
ワークの変数にとっといたらいいんじゃないの?

730:デフォルトの名無しさん
07/05/22 18:23:30
>>728
>>1

731:デフォルトの名無しさん
07/05/22 18:25:33
標準入力がSEEKで戻れたらすごいな
過去に戻れるなんて素敵だぜ

732:デフォルトの名無しさん
07/05/22 18:26:16
なるほど、WEBプログラミング板で聞くのが良かった内容でしたか
すみませんでした
そちらで質問してみます

733:デフォルトの名無しさん
07/05/22 18:41:44
>>731
このコメントだけで十分な説明になってるな

734:デフォルトの名無しさん
07/05/22 19:03:04
CPAN探せばありそうだが普通に変数に入れといたほうが楽だろうな

735:デフォルトの名無しさん
07/05/22 20:34:55
リャマ本なんであんなに高いの?

736:デフォルトの名無しさん
07/05/22 20:36:07
古本買え

737:デフォルトの名無しさん
07/05/22 20:45:58
2版の厚さがちょうどよかったよね(´・ω・)

738:デフォルトの名無しさん
07/05/22 21:49:02
-P オプション で使えるCのプリプロセッサですが
起動が多少遅くなるので
別な方法がないか教えてもらえませんか

使用用途としては
下記のようなものです
単にifで分けると モジュール部もすべて読み込むようなので
両方ともないとエラーになりました
evalで囲めばそれっぽくうごきますが
しっくりきません。

#ifdef HOGEHOGE
use HOGEHOGE;
~~~
#else
use HOGEHOGE2;
~~~
#endif


739:デフォルトの名無しさん
07/05/22 22:51:27
>>738
UNIVERSAL::require 使えば解決するようなコトじゃないかな?


740:デフォルトの名無しさん
07/05/22 22:52:13
質問では、条件で分けたいのはuseだけじゃないっぽいけど:

use $ENV{'HOGEHOGE'};
とかして環境変数HOGEHOGEから渡せないかなと思ったがダメだった。


741:738
07/05/22 22:58:53
>>739-740
趣旨的には 740のとおり useだけじゃなくて
汎用的に使える方法がないかと(まぁ -Pで出来るんですがあんまり標準的じゃないような気がして)

目的としては、環境がある程度違っても
ソースを複数管理するのは面倒なので同一ソースで動かしたいです
下記のようなのも出来ると非常に助かります

#ifdef hogehoge
while(1) {
#endif
~~~~~
#ifdef hogehoge
}
#endif


742:デフォルトの名無しさん
07/05/22 23:39:45
evelじゃちょっと違うよな

743:デフォルトの名無しさん
07/05/22 23:41:58
BEGIN { eval }
かと思ったけどなんか違うよね

744:デフォルトの名無しさん
07/05/23 00:20:43
よく判らんのだが、
-P 使うからには、pure perl じゃなく C 関係?
それとも pure perl でホスト毎に挙動を変更したいの?

前者だったら、 Inline::C と後述を噛み合わせて…
後者だったら、ベタだけど Sys::Hostname で hostname ゲットして
BEGIN{if ( $hostname ...){}else{} } あたり?
後者なら、もっとべたべたにソース全般で挙動を分けられるし、
実際やってるけど、前者だったらやろうと云う気にもならぬ。
って素人の口出しすまぬ。

745:デフォルトの名無しさん
07/05/23 00:29:53
OOで書いて環境依存部分はサブクラスに分けるが良いよ

746:デフォルトの名無しさん
07/05/23 00:52:02
俺は環境依存部分は、モジュール化して突っ込んであるなあ
ソコでSys::Hostnameは使っているけど、もっと良い手があれば知りたいものだ

747:デフォルトの名無しさん
07/05/23 01:16:42
俺はwindowsローカル時はbatファイルで適当に環境変数設定して
その環境変数によってunix系の時と動作変えてる。

748:738
07/05/23 08:38:37
>>744
当面の目標としては
PurePerlでmod_perl2(ModPerl::RegistryPrefork)とFastCGIで
同一ソースを使えるようにしたいと思ってます
FastCGI対応にするためには
読み込みモジュールの差し替え(CGI->CGI::Fast)とループ処理が増えるので
738,741のようなことができないかなと思った次第です、
良い方法がないかなと

749:デフォルトの名無しさん
07/05/23 09:35:25
そんな用途かよ
Catalystあたりを参考にしれ

750:デフォルトの名無しさん
07/05/23 09:49:31
なるほどFastCGIか。
Rubyだとわりと簡単にFastCGI対応できるみたい。
Perlでも同じようにできないかな?

既存のCGIを変更無しでFastCGIに
URLリンク(sugi.nemui.org)

751:デフォルトの名無しさん
07/05/23 09:55:29
てか、CatalystとかCGI::Applicationとかのフレームワーク使えばいいじゃん。

Catalyst::Engine::FastCGI
URLリンク(search.cpan.org)

CGI::Application::FastCGI
URLリンク(search.cpan.org)

752:デフォルトの名無しさん
07/05/23 12:07:10
>>738がなんでわざわざWebProg板からこっちに着たのかわからない


753:デフォルトの名無しさん
07/05/23 14:12:31
すみませんが 質問させてください

あるファイル(数万行の数字データ)の上から1行ずつ順番に読み込んで
最終行になるとまた1行目に戻って・・・という作業をしたいのです
途中でプログラムを閉じて再開したときも次の行から開始が可能であれば
もう言うことナシですが,残念ながら自分では何とも出来ず

丸2日間ネット上で調べに調べ

srand();
open(FILE, "data.txt");
rand($.) < 1 and $line = $_ while <FILE>;
close(FILE);
$line =~ s/\n//g;

とランダムで1行読み込む仕様で妥協するのが限界でした
もし上記作業がperlで可能でしたら申し訳ないですが
教えていただけないでしょうか

可能な方いらっしゃいましたら どうかお願いします。

754:デフォルトの名無しさん
07/05/23 14:13:46
いつ終わるんだそれは

755:753
07/05/23 14:27:55
すみません
イカのような感じで半永久的に作業が続くわけでして・・・^^;

print <<"_HTML_";
Content-type: text/html

<html><head>
<meta http-equiv="refresh" content="5; url=aaa.cgi">

756:デフォルトの名無しさん
07/05/23 14:34:48
何行目まで読んだかどこかに書いとけばいいじゃん。

757:デフォルトの名無しさん
07/05/23 14:38:03
>>755の「イカ」がどっから出てくるのかがわからん。

とりあえずCGIは置いといて、まずファイルの入力の基本をググって調べればいいんじゃね

758:デフォルトの名無しさん
07/05/23 14:38:30
以下、だろ。

759:デフォルトの名無しさん
07/05/23 14:47:34
イカ=以下、がわからんじゃなくて
イカ=print <<・・、がどこから出て来たかわからん、ってことだよ

760:デフォルトの名無しさん
07/05/23 14:52:37
続きでなんか書こうとしてるんじゃないの?

761:デフォルトの名無しさん
07/05/23 14:54:09
>>759
以下のように、が、"<meta http-equiv="refresh" content="5; url=aaa.cgi">" を指してるんじゃないの?
大体、何を言わんとしてるかはわかる

762:753
07/05/23 14:56:30
わかんないヤツが説明すると伝わりにくいですね
すみません・・・

えーっと
5秒おきにaaa.cgiにアクセスしてIEの画面に数字を順番に
表示させたいだけなんです

753で書いた方法で $line の数値を表示させるだけと言えば
伝わりますかね・・・



763:デフォルトの名無しさん
07/05/23 15:02:20
webprogの所轄だが、行数をどこかに保存すればいいだけだろう?
CookieやURIのクエリ部分だとか、サーバ上のファイルとかメモリとか。

764:デフォルトの名無しさん
07/05/23 15:02:57
とりあえずWebProg板いってこいな

765:753
07/05/23 15:05:13
板違いでしたか すみません
どっちか悩んだあげくこっちに書いてしまいました

お邪魔しました

766:764
07/05/23 15:06:45
大体、数万行のテキストデータだとしてもかなりの容量になるだろ
対象マシンのメモリ可哀想だな。 しかも、IEがそのデータを表示仕切る前に
IE落ちるだろうし、表示仕切る前に5秒経って更新かかるだろうな。
しかも、更新しようにもかなりの負荷がかかってるからモッサリ。

ブラウザクラッシャーでも作ろうとしてるのか?

767:753
07/05/23 15:10:09
いえ 表示自体はその数万行のうち上から1行ずつでいいんです
1行目表示して5秒後には2行目・・・みたいな感じで。
順番に表示されるのを見て 手元のデータと比較していくだけの
単調な作業なんです

768:デフォルトの名無しさん
07/05/23 15:26:28
表示した行数を覚えておく方法は>>763でほぼ答えが出てるけど、ファイルの指定行を読むところはTie::Fileとか使えば楽だと思うよ。

769:デフォルトの名無しさん
07/05/23 15:56:50
ちょっ待って! さっきまで>>753が居た場所がイカ臭い

770:デフォルトの名無しさん
07/05/23 16:12:49
753のやりたいことを考えると、サーバ上で処理させず、
数万行のデータを手元に持ってきてjavascriptで順次表示させた方が増しな気がする。
何行目を表示させているかも、少し離して表示させておけば、中断したときには手書きでメモれば十分だろう。
表示開始行数は引数で与えれば再開できるし。

771:デフォルトの名無しさん
07/05/23 17:25:55
perlでいいじゃん

772:デフォルトの名無しさん
07/05/23 17:34:38
"Black Perl"

BEFOREHAND: close door, each window & exit; wait until time.
open spellbook, study, read (scan, select, tell us);
write it, print the hex while each watches,
reverse its length, write again;
kill spiders, pop them, chop, split, kill them.
unlink arms, shift, wait & listen (listening, wait),
sort the flock (then, warn the "goats" & kill the "sheep");
kill them, dump qualms, shift moralities,
values aside, each one;
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill the next sacrifice, each sacrifice,
wait, redo ritual until "all the spirits are pleased";
do it ("as they say").
do it(*everyone***must***participate***in***forbidden**s*e*x*).
return last victim; package body;
exit crypt (time, times & "half a time") & close it,
select (quickly) & warn your next victim;
AFTERWORDS: tell nobody.
wait, wait until time;
wait until next year, next decade;
sleep, sleep, die yourself,
die at last
# Larry Wall

これどういう意味?暇だったら訳してくれ

773:デフォルトの名無しさん
07/05/23 17:35:38
Webサーバー(Webブラウザ)使うのが必要条件なのかにもよるな。
Excelでも十分かもしれん。

774:デフォルトの名無しさん
07/05/23 17:42:02
local環境でいいんなら、1行読んで、25行ぐらい改行してからprintするだけじゃないの?
で、sleep(5)とか

775:デフォルトの名無しさん
07/05/23 18:14:28
>>773
excel だけど win は一万行平気で開く?

cat -n hoge.log | more で十分だったりw

776:デフォルトの名無しさん
07/05/23 18:26:06
>>772
ラクダ本3版Volume2に訳が出てるお

777:デフォルトの名無しさん
07/05/23 18:39:22
>>774
本当はそんな感じ(と、行番号カウンタか)でいいんだと思うよ。
Web鯖に吐かせるべき理由があるんだかどーなんだか。

778:デフォルトの名無しさん
07/05/23 18:45:09
webprog板でgrepとmapだとgrepの方が早いという意見があり確認してみました。
for >= grep > mapって感じみたいなのですがなんでmapだけこんなに遅いのでしょう?

■テストコード
use Benchmark qw/cmpthese/;
use strict;
use warnings;
my $LOOP = 100;
my @SEED = ('a'..'z','A'..'Z',0..9);
my @DATA = map {$SEED[int rand @SEED]} 1..10000;
my %TABLE = map {$_=>$SEED[int rand @SEED]} @SEED;
cmpthese($LOOP, {
#非破壊
'map1' => sub {my @hoge = map { $TABLE{$_} } @DATA; 1;},
'grep1' => sub {my @hoge;grep push(@hoge,$TABLE{$_}),@DATA;1;},
'for1' => sub {my @hoge;push(@hoge,$TABLE{$_}) for(@DATA);1;},
#破壊
'map2' => sub {map {$_=$TABLE{$_}} @DATA ;1;},
'grep2' => sub {grep $_=$TABLE{$_},@DATA;1;},
'for2' => sub {$_ = $TABLE{$_} for(@DATA);1;},
});


779:デフォルトの名無しさん
07/05/23 18:47:30
■結果 1回目
Rate map1 map2 for1 grep1 grep2 for2
map1 25.8/s -- -14% -32% -33% -66% -69%
map2 30.1/s 17% -- -21% -22% -60% -64%
for1 38.0/s 48% 26% -- -2% -50% -54%
grep1 38.6/s 50% 28% 2% -- -49% -53%
grep2 75.8/s 194% 152% 99% 96% -- -8%
for2 82.6/s 221% 174% 117% 114% 9% --
■結果 2回目
Rate map1 map2 grep1 for1 grep2 for2
map1 24.6/s -- -16% -33% -33% -71% -71%
map2 29.2/s 19% -- -20% -21% -65% -66%
grep1 36.6/s 49% 26% -- -1% -56% -57%
for1 36.9/s 50% 27% 1% -- -56% -57%
grep2 83.3/s 239% 186% 127% 126% -- -3%
for2 85.5/s 248% 193% 133% 132% 3% --
■結果 3回目
Rate map1 map2 grep1 for1 grep2 for2
map1 23.3/s -- -17% -33% -37% -72% -73%
map2 27.9/s 20% -- -20% -25% -66% -67%
grep1 35.0/s 50% 25% -- -6% -57% -59%
for1 37.0/s 59% 33% 6% -- -55% -56%
grep2 82.0/s 252% 193% 134% 121% -- -3%
for2 84.7/s 264% 203% 142% 129% 3% --


780:デフォルトの名無しさん
07/05/23 19:28:11
map1が遅いのはでかいリスト返してるから。
一つだけ全く別のことやってりゃそりゃ遅い罠。
map2が遅いのはfor2grep2と違ってブロック評価してるからだと思う。

とりあえず
'map1' => sub { my @hoge; map { push @hoge, $TABLE{$_} } @DATA; 1; },
'map2' => sub { map $_ = $TABLE{$_} , @DATA; 1; },
に書き換えたらグループごとの速度は大差なくなるはず。

関係ないけど最近のPerlのmapは
同じことやるforeachより速くなったりするのでびっくり。
古いバージョンなら戻り値使わない時は絶対forって言えたんだけどな。

781:デフォルトの名無しさん
07/05/23 19:30:42
一応貼っておく
Rate grep1 for1 map1 grep2 map2 for2
grep1 19.8/s -- -1% -3% -64% -64% -65%
for1 20.0/s 1% -- -2% -64% -64% -65%
map1 20.4/s 3% 2% -- -63% -63% -64%
grep2 55.2/s 179% 176% 171% -- -1% -3%
map2 55.5/s 180% 177% 172% 1% -- -3%
for2 57.0/s 188% 185% 180% 3% 3% --

782:デフォルトの名無しさん
07/05/23 20:02:21
その後の調べで
map2はsub {map {$_=$TABLE{$_};1;} @DATA ;1;}
とすると順位があがりました。余計なメモリコピーが発生してたみたいです。

さらに>>780さんの指摘を受けて
'map1' => sub {my @hoge;map push(@hoge,$TABLE{$_}),@DATA; 1;},
'map2' => sub {map $_=$TABLE{$_},@DATA ;1;},
に変更したところ若干forが優勢っぽいですがほとんど同じ結果になるようになりました。

組み込みの関数なのでperlのバージョンによって変わってくる部分もありそうですね。
テスト環境はperl v5.8.5でした。(書き忘れ)

大変わかりやすい説明ありがとうございました。


783:デフォルトの名無しさん
07/05/23 20:05:52
良くわからんがデータベース使え。

784:738
07/05/23 21:51:32
>>751
Catalystみてみます、サンクス

785:デフォルトの名無しさん
07/05/25 01:12:04
あーの、恐縮ですが質問なんですけど、
Perlでは初めてオブジェクト指向のコードを書いているのですが、
下記のようなコードでアロー演算子と行入力演算子が併用できなくて困っています。
一度他のローカル変数にファイルハンドルを代入してやればうまくいくのですが、
もっとスマートに、オブジェクトが持つファイルハンドルから行入力する方法はあるのでしょうか。

use strict;

sub parse
{
my $this = shift;
my @data = <$this->{fh_lex}>; # 文法エラー
# 下のコードなら成功
# my $fh = $this->{fh_lex};
# my @data = <$fh>;

for (@data) {
;# 省略
}

}

786:デフォルトの名無しさん
07/05/25 01:59:16
<>をファイル読み込みとして認識させるには、
括弧の中を $fh のような形をしたスカラ変数にしないとダメだから、
一時的に変数を作るしかないね。

my @data = sub{$_=shift;<$_>}->($this->{fh_lex}); とかw

787:デフォルトの名無しさん
07/05/25 02:08:24
ヒント:<()>

788:デフォルトの名無しさん
07/05/25 02:09:52
<()> はファイルグロブ。

789:デフォルトの名無しさん
07/05/25 02:22:28
<${this->{fh_lex}}>
とかダメ? 試してないけど。

790:デフォルトの名無しさん
07/05/25 02:31:13
>>789
ダメだよ。やってみたw

<>を放棄した技だけどw
my @data = readline $$this{fh_lex} ;

791:デフォルトの名無しさん
07/05/25 02:37:14
普通に<>の内部関数のreadline使って、
my @data = readline $this->{fh_lex};
でよかろ。

792:デフォルトの名無しさん
07/05/25 04:08:38
>>785
別に無理に1行に書かなくても地味に$fhに代入した方がよっぽど明示的で
よいコードに見える。
どうしてもっていうんなら、$thisがオブジェクトならオーバーロードを使ってみては?

793:デフォルトの名無しさん
07/05/25 18:39:22
遅レスだが

>>780
URLリンク(search.cpan.org)
> map in void context is no longer expensive. map is now context aware,
> and will not construct a list if called in void context.

perlstyle でやるなって言われてるのに、悪い癖を直そうとしない子が
あまりに多いから実装側でフォローした、と俺は解釈してる。

794:デフォルトの名無しさん
07/05/25 18:48:26
見た目すっきりするからついやっちゃうんだよね・・・

795:デフォルトの名無しさん
07/05/25 19:11:11
俺すごいだろって思ってついやっちゃうんだよな・・・

796:785
07/05/25 22:27:59
>>786-792
みなさんどうもありがとうございます。
やはりPerlとはいえ表記上の制約はあるんですね。
にも関わらず他の方法がいくつもあると言うのはさすがですが。
どれを使おうか迷ったのですが、とりあえず今回は、readlineを使うのが一番綺麗に見えたので、それを使わせてもらおうと思います。
本当に勉強になりました。

797:デフォルトの名無しさん
07/05/26 02:42:48
 長文にて失礼します。
 以下の[data.csv]ようなカンマ区切りのデータがあるとします。
 横軸がX座標、縦がY座、各格子の数値がZ座標(標高)を示しています。
 このデータを、[out.csv]のように変換したいのですが、2次元配列でつまずいてしまい、途方に暮れてしまいました。
 どなたかお知恵を授けて下さい。よろしくお願いします。
 あと、入力データのうち行頭が"#"で始まる行は無視する、というのはどうすればできるのでしょうか。合わせてご教授いただけると助かります。よろしくお願いします。

[data.csv]
, 1, 2, 3, 4
5, 12.63 , 33.82 , 31.71 , 29.73
4, 34.75 , 32.14 , 29.31 , 26.70
3, 33.55 , 30.27 , 27.17 , 23.43
2, 31.02 , 29.42 , 26.65 , 23.61
1, 28.00 , 27.04 , 25.39 , 22.60

[out.csv]
X,Y,Z
1,1,28.00
1,2,27.04
1,3,25.39
1,4,22.60
2,1,31.02
2,1,27.04
(中略)
5,3,31.71
5,4,29.73



798:デフォルトの名無しさん
07/05/26 03:41:35
>>797
宿題乙^^

799:デフォルトの名無しさん
07/05/26 04:09:08
>>797
さてコレをどれくらい短くできるだろうか

use strict;
open FILE, "data.csv";
my @data;
my @index;
my @ys;

for my $line (<FILE>) {
chomp $line;
unless (@index) {
@index = split(/\s*,\s*/, $line);
shift @index;
next;
}
my($y, @d) = split(/\s*,\s*/, $line);
push(@ys, $y);
for (my $i=0; $i < @d; $i++) {
$data[ $index[$i] ][ $y ] = $d[$i];
}
}
close FILE;

open FILE, ">out.csv";
for my $x (@index) {
for my $y (@ys) {
print FILE "$x, $y, $data[$x][$y]\n";
}
}

800:デフォルトの名無しさん
07/05/26 08:04:48
>>799
use strict;
open FILE, "data.csv";
my(@data, @index, @ys);
while(<FILE>) {
chomp;
my($y, @d) = split /\s*,\s*/;
@index = @d, next unless @index;
push @ys, $y;
$data[ $index[$_] ][$y] = $d[$_] for 0..@d-1;
}
open FILE, ">", "out.csv";
for my $x (sort {$a <=> $b} @index) {
for my $y (sort {$a <=> $b} @ys) {
print FILE "$x, $y, $data[$x][$y]\n";
}
}
close FILE;

801:デフォルトの名無しさん
07/05/26 08:26:14
一応質問者の為に一行サービスしといたけど。本嫁本。
こんなの例題に出てくるだろが。

open IN, "data.csv" ;
open OUT, ">", "out.csv" ;
print OUT "X,Y,Z\n" ;
(undef,my @index ) = split /,/, do{ $_ = <IN> ; s/\s+//g ; $_ } ;
for ( reverse (<IN>) ){
 s/\s+//g ;
 next if /^#/ ;
 my ( $index, @dat ) = split /,/ ;
 for my $i ( 0 .. $#dat ){
  print OUT join "," ,$index,$index[$i],$dat[$i] . "\n" ;
 }
}
close IN ;
close OUT ;

802:デフォルトの名無しさん
07/05/26 10:48:45
>>799-801
おまいらやさしいな

803:797
07/05/26 13:30:30
>>799-801
 皆さん、どうもありがとうございます。
 教えていただいたコードを読んで勉強します。
 ところで、私のような初心者向けの本にはどんなものがありますか?
現在手元には、「Perlの絵本」といわゆる「らくだ本」の2冊がありますが、前者はまったくの初心者向けで今回の質問の答えは見いだせません。
一方、後者は私には取っつきにくくて、ヒントが書いてあるのかも知れませんが、見つけられませんでした。
 なお、Visual BASICとTurbo PASCALはある程度勉強しました。
 近くに大きな本屋がないので、現物を手にとって見比べることができません。アドバイスをいただければ幸いです。よろしくお願いします。


804:デフォルトの名無しさん
07/05/26 14:26:34
リャマ本かクックブックあたり嫁

805:デフォルトの名無しさん
07/05/26 15:31:12
/(\b\w+)\1/
という正規表現が
hogehogeにマッチして
/(\b\w+\b)\1/
という正規表現が
hoge hogeにマッチしないのは何故なんでしょうか?

806:デフォルトの名無しさん
07/05/26 15:36:26
* キャプチャされるのは、正規表現ではなくマッチした文字列
* \b は文字を消費しない。

807:デフォルトの名無しさん
07/05/26 16:15:33
>>803
時間をかけて、「らくだ本」じっくりと2回読めばいい。
1回目は、解らない部分には「?」印を付けて、深追いしない。
2回目は、「?」印を付けた部分を重点的に読む。
その過程がなければ、らくだ本を辞書のように使うことはできない。

808:デフォルトの名無しさん
07/05/26 17:09:49
リャマ本の第四版まだかなー
本家だと2005年に出てるんだよね
ラクダさんも早く新しいの出して欲しいな

809:デフォルトの名無しさん
07/05/26 18:15:30
そういえば新しいの出るね。
"Mastering Perl" By brian d foy
URLリンク(www.oreilly.com)

810:デフォルトの名無しさん
07/05/26 19:24:22
大変にスマソ
ひょっとして use encoding でコード指定すると \w が日本語(文字)にもマッチする仕様?

811:803
07/05/26 20:02:47
>>807
 アドバイス、ありがとうございます。
 昔やった受験勉強と同じことですね。腰を据えて勉強します。

812:デフォルトの名無しさん
07/05/26 20:17:05
>>810
perl + 日本語には興味無いんで調べたが、perlunicode にまんま書いてあるぞ。
o Character classes in regular expressions match characters instead
of bytes and match against the character properties specified in
the Unicode properties database. "\w" can be used to match a
Japanese ideograph, for instance.


813:デフォルトの名無しさん
07/05/26 20:27:38
>>810
基本的には空白や記号類ではないような文字にマッチする。
通常は全ての言語の文字にマッチするけど、
use locale;すればロカールである程度は制御できるね。

814:デフォルトの名無しさん
07/05/26 20:39:14
>>812-813
おお、すまそ。そしてありが㌧
今更だけど jcode.pl からの乗り換えに躓いてました
精進してきます

815:デフォルトの名無しさん
07/05/26 21:20:04
懐かしいな jcode.pl ってまだあったんだ

cgiのもなんかライブラリあったな

816:デフォルトの名無しさん
07/05/26 21:22:41
cgi-lib.plナツカシス

817:デフォルトの名無しさん
07/05/26 23:38:11
>>816

ああ、それそれ!
名前忘れる位懐かしいw

818:気まぐれアナスイ
07/05/27 01:28:48
…。perl…。
perl.といえば、perldl-command.が…
!(-_Φ+){yes, So sexy.}


819:デフォルトの名無しさん
07/05/27 04:04:33
ログファイルを合成する処理で、困っています。

@log=("1.txt","2.txt","3.txt","4.txt");
foreach $filename(@log)
{
open(LOG,$filename) || &er_("Can't open $filename");
@lines = <LOG>;
close(LOG);
}

@linesの中に、全てのテキスト内容を合成させた物が
入ってほしいのですが、最後に代入した4.txtの内容しか
入ってくれません。なぜでしょうか。

また、foreachで廻すのを条件として、
改造案を指南いただけると嬉しいです。

820:デフォルトの名無しさん
07/05/27 04:22:02
@lines = <LOG>;

の部分を

my @tmplines = <LOG>;
push(@lines, @tmplines);

の2行に置き換えてください。
千奈美に最後のやつしか残らないのは、

@lines = <LOG>;

が上書きしてるからです。
だから最後の結果しか残らない。


821:デフォルトの名無しさん
07/05/27 06:28:04
>>820
ありがとうございます!できました。

822:デフォルトの名無しさん
07/05/27 18:20:34
cpanで
>Are you ready for manual configuration? [yes]
毎回、noを答えるんですけど、これ抑制できないんですか?


823:デフォルトの名無しさん
07/05/28 00:37:04
>>822
> Are you ready for manual configuration?
俺は個人macもsolarisもyes選択してカスタマイズしたから、
最初にnoを選んだ時の挙動は分らんが、抑制もくそもこれって
最初の一回きりだろ?俺の環境だと出てこないんだけど。

何か変な事やってないか?

824:デフォルトの名無しさん
07/05/31 15:48:16
>>546 の
sub flatten(@) { map { ref $_ eq "ARRAY" ? flatten(@$_) : $_ } @_ }」

flatten(@)は配列以外を引数に取れないということでしょうか?

あと
@deff = grep{ !{map{$_,1}@FileA }->{$_}}@FileB;
のmap{$_,1}@FileAなのですが{$_,1}はどういう式なのでしょうか

825:デフォルトの名無しさん
07/05/31 16:55:50
>>824
1) プロトタイプの@は残りの引数をすべてリストとして取り込むという意味。
  (@) にはあまり意味がないんだけど、perlsubでも読んどき。

2) map の引数のBLOCKはリストコンテキストで評価されるから、
  $_, 1 は $_ と 1 からなるリスト。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch