トップページ⇒php
1001コメント356KB

Perlコーディング初心者質問スレ Part 53

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0004nobodyさん2006/11/26(日) 14:41:45ID:???
関連スレ
CGI: Common Gateway Interface part 13
http://pc8.2ch.net/test/read.cgi/php/1126436361/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 9 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1143834740/

【 スクリプト改造依頼スレ 】(丸投げ) part5
http://pc8.2ch.net/test/read.cgi/php/1141174205/
0005nobodyさん2006/11/26(日) 14:51:35ID:tkb0DDKs
>>1乙
000612006/11/26(日) 17:42:11ID:???
貼り順まちがいた...orz
0007nobodyさん2006/11/26(日) 17:50:07ID:???
jcode.plでutf-8→eucの変換って行えないのでしょうか?

jcode::convert(\$Line,'euc');
0008nobodyさん2006/11/26(日) 19:05:37ID:???
UTF8非対応だから
0009nobodyさん2006/11/26(日) 22:01:06ID:???
いい加減Jcode.pmなりEncode.pm使おう
0010nobodyさん2006/11/26(日) 22:46:05ID:???
2chのように、時間に22:27:00:00まで表示するにはどうすれば良いのでしょうか?
0011nobodyさん2006/11/26(日) 23:15:07ID:???
表示されてないお
0012nobodyさん2006/11/26(日) 23:22:34ID:???
>>11
VIPでは00:00:00:00まで出るよ
0013 ◆TWARamEjuA 2006/11/27(月) 00:03:22ID:????BRZ(6677)
00:00:00.00ですね♪
Time::HiRes 使ってるです♪
0014nobodyさん2006/11/27(月) 01:00:43ID:???
>>13
どうもありがとうございます。
0015nobodyさん2006/11/27(月) 01:47:56ID:VGuJADoD
あぁ、そんな無駄なことに貴重なCPUサイクルを消費して・・・
0016nobodyさん2006/11/27(月) 04:01:18ID:???
関数のエラー時の戻り値って何にしてます?
0や-1を返す場合が多いと思いますが、undefにしない理由って何かあるんでしょうか。
undefなら0と同じくfunc() or dieなんて呼び方もできるし、undefの可能性ありと
常に思っておけばprint func()なんて不用意に書かなくなるかなと思ったんですが。

use warningでundefをprintするなと大量に警告されて、関数の書き方間違ったかなと
思ったりしました。

0017nobodyさん2006/11/27(月) 09:39:53ID:???
undefを返せばいいと思いますよ
私は以前から 0 or DATA で返してるので、今からそのクセを治すのに苦労しそう・・・
0018nobodyさん2006/11/27(月) 11:28:23ID:???
undef 一択
0019nobodyさん2006/11/27(月) 11:43:26ID:???
return ();

なんて記述もよく見かけるけど、これは
・リストコンテキストなら空リスト
・スカラコンテキストならundef
になるって事でおk?
0020nobodyさん2006/11/27(月) 14:23:58ID:???
>>19
むしろ return; だけでおk
0021nobodyさん2006/11/27(月) 15:21:54ID:???
return (); と return; の違いはなんじゃらほい?
0022nobodyさん2006/11/27(月) 16:19:33ID:???
2chの30秒規制みたいなのをつけたいんですが
どのようにすればいいでしょうか?
0023nobodyさん2006/11/27(月) 16:26:08ID:w7/znFw6
cookie
0024nobodyさん2006/11/27(月) 18:28:22ID:???
>>21
横だけど、
処理を意識して書くか perl に任せるかの違いじゃね?
呼び出し元にとってみればどっちも同じ挙動でしょ。
0025nobodyさん2006/11/27(月) 18:34:15ID:???
配列にundef代入したら要素数==1
0026nobodyさん2006/11/27(月) 18:53:55ID:???
>>16
分ってる人もいるっぽいが、
return () ; or return ; の二択しかないよ(実質一択)。
かなり有名なネタだ。

初心者スレなので参考 URL を。
ttp://d.hatena.ne.jp/hyuki/20060406
0027nobodyさん2006/11/27(月) 19:13:29ID:???
crypt (angokashitaimoji,'$1$$');

↑このようなほうほうで暗号可したのですが
アルファベットのほかに、どのような記号が使われるのでしょうか?
リストがのってるサイトがあったらお願いします。
0028nobodyさん2006/11/27(月) 19:21:19ID:???
>>27
perldoc -f crypt
0029nobodyさん2006/11/27(月) 19:27:39ID:???
>>28
?
0030nobodyさん2006/11/27(月) 20:00:40ID:???
>>27
perlでは決まっていないので使用するシステムのcryptライブラリのマニュアルなどを
参照。たとえばこんなの。

ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/crypt.3.html
0031nobodyさん2006/11/27(月) 20:05:25ID:???
>>30
どうもありがとうございます
0032nobodyさん2006/11/27(月) 21:24:09ID:???
お聞きしたいのですが
CGIファイルの中身って見ることってできるんでしょうか?
HTMLは見れますが
CGIの中身って見れませんよね?
CGIの中身というのは、.cgiファイルのうp前の状態です。
0033nobodyさん2006/11/27(月) 21:27:54ID:???
鯖の設定によっては見れる
0034nobodyさん2006/11/27(月) 21:56:02ID:???
>>33
返信ありがとうございます。
どのような設定をすれば見れなくできますかね?
有料鯖なのですが
わたしでもその設定はいじれるのでしょうか?
0035nobodyさん2006/11/27(月) 22:10:03ID:???
.htaccessで
または全ディレクトリにindex.htmlを
0036nobodyさん2006/11/27(月) 22:14:13ID:???
CGIのソースの読める読めないはindex.htmlがどうとかそういう問題とは違わないか?

とりあえず>>34の使っている鯖がCGI可なのかどうかが問題だ。
そういえばちょっと前にCGI不可の鯖に.cgiで置いてソース晒してた椰子が居たなあ…。
0037162006/11/27(月) 22:21:07ID:???
みなさん、どうもありがとうございます!
特に>>25,>>26 ありがとう

今日まさにこんなことやりそうになってました。undef返したら真なんですね。
(@array = &func()) or 〜

return;と書くとリストコンテキストでは空の配列を、スカラコンテキストでは
undefを返す、つまり
return wantarray ? () : undef;
と書くのといっしょってことですね。危うく間違った理解で突き進むところでした。
0038nobodyさん2006/11/27(月) 22:23:31ID:???
undefを返すなら、definedでチェックするようにしようぜ
0039nobodyさん2006/11/27(月) 22:58:38ID:???
>>35-36
どうもありがとうございます。
.htaccessで設定できるのでしょうか?
やりかたがのってるサイトが見つからないので
よかったら教えてください
0040nobodyさん2006/11/27(月) 23:13:26ID:???
>>39
その前にちゃんとCGIが動く鯖なんだろうね?
0041nobodyさん2006/11/27(月) 23:13:59ID:???
>>40
はい
0042nobodyさん2006/11/27(月) 23:19:09ID:???
それなら適切にパーミッションを設定してやれば
ブラウザでアクセスしていきなりソース丸見えという事はないと思うよ。
0043nobodyさん2006/11/27(月) 23:19:55ID:???
とりあえず実行属性つけちゃえば問題ない
0044nobodyさん2006/11/27(月) 23:25:23ID:???
>>42
ブラウザというのは、「IE」や「Sleipnir」のことでしょうか?
>>43
やってみます。
0045nobodyさん2006/11/27(月) 23:26:52ID:???
知識が底辺過ぎるし、スレ違いというか板違いなので終了
0046162006/11/27(月) 23:35:54ID:???
昔、CGIのソース丸出ししたことあるなあ。当時は原因不明だったけど、
大方htaccessの設定だったんだろうなあ。下記とかかな。

AddHandler cgi-script .cgi
0047nobodyさん2006/11/28(火) 00:12:50ID:???
>>46
httpd.confですかね?
0048nobodyさん2006/11/28(火) 00:15:03ID:???
htaccessを無視するのか
おまえ酷すぎ
0049nobodyさん2006/11/28(火) 00:40:58ID:???
httpd.confであってるんだけど、レンタルサーバだといじれないので、
httpd.confの設定をhtaccessで上書きするってこと。

全然はずしてるかもしれないけど、CGIは基本的にcgi-bin内で実行、
それ以外はhtaccessいじってね、っていう仕様なのかもね。
0050nobodyさん2006/11/28(火) 00:43:31ID:???
ほぉほぉ
0051nobodyさん2006/11/28(火) 00:44:27ID:???
ありがとうございます。
0052nobodyさん2006/11/28(火) 00:45:28ID:5n8a+rNm
文字列の入った変数中に、指定した文字が
ある場合true、ない場合falseを返す変数があったら教えてください。
0053nobodyさん2006/11/28(火) 00:46:41ID:???
index
0054nobodyさん2006/11/28(火) 00:47:22ID:???
どうしてもTRUE|FALSEでほしいなら自前の関数でラッピングしてください
0055nobodyさん2006/11/28(火) 00:48:20ID:???
return undef;の話はPerlベストプラクティスに載ってるね。
0056nobodyさん2006/11/28(火) 02:23:57ID:???
<FORM action="a.cgi" method="POST">
#いろいろな項目入力
<INPUT type="submit" value="実行a">
</FORM>

実行aボタンを押すと、a.cgiが実行されますが、
実行aボタンを押して同時に下のb.cgiを実行する
方法ありますでしょうか。

<FORM action="b.cgi" method="POST">
#いろいろな項目入力
<INPUT type="submit" value="実行b">
</FORM>

a.cgiの処理コードの中に、b.cgiの処理コードを
書くぐらいしか思いつきません。

よろしくお願いします。
0057nobodyさん2006/11/28(火) 05:30:21ID:PG2nYwJ4
こんな時間にすいません。誰かいたら教えて下さい
phpで例えば<?php include("○○.php"); ?>というのがあります。
これは○○.phpを上の記述を書いたphpに表示させることができます。

perl(cgi)も同様なことできますでしょうか?
index.cgiにabc.cgiを表示させたいんですけど。
やり方ありましたら教えて下さい m(_ _"m)ペコリ
0058nobodyさん2006/11/28(火) 09:44:54ID:???
>>56
一つの体で、別々の場所に行く電車に乗れますか?
自分で思いついた方法で大丈夫です。

>>57
つ require、or module
0059nobodyさん2006/11/28(火) 10:10:33ID:???
>>58
レスありがとうございます
軽くしらべてみたんですが難しいですね
それでできればいいんですが・・・
がんばってみます
0060nobodyさん2006/11/28(火) 10:44:39ID:???
>>58
多重影分身すればいいのか
0061nobodyさん2006/11/28(火) 10:54:01ID:???
チャクラが人並以上に必要だってばよ
0062nobodyさん2006/11/28(火) 14:47:00ID:???
@grepedarray = grep(/^[A-Z]/,@array);
こういう文に置換 - s/ / / -を組み合わせたいのですが出力が上手く表示できません
どうしたらよいでしょうか?
0063nobodyさん2006/11/28(火) 15:01:43ID:???
ようわからんが map も使えば?
0064nobodyさん2006/11/28(火) 15:08:26ID:???
@grepedarray = map { /^o^\ } grep(/^[A-Z]/,@array);
0065nobodyさん2006/11/28(火) 15:13:05ID:???
ちょw 誰が フッジサーン 使えと言ったwwwww
0066nobodyさん2006/11/28(火) 15:16:09ID:???
map {push(@grepedarray) if(s///);} @array;
これでもおk?
0067662006/11/28(火) 15:21:19ID:???
連投すまん
push(@grepedarray)
じゃなくて
push(@grepedarray, $_)
じゃないとだめかも
0068nobodyさん2006/11/28(火) 15:55:32ID:???
それならforeach使えばいいのに。
0069nobodyさん2006/11/28(火) 19:55:31ID:???
>>66-67
それはダメ。mapを使うなら、返り値を利用するべき。
0070nobodyさん2006/11/28(火) 19:56:25ID:???
ごめん、「ダメ」はいいすぎた。あくまで「おすすめできない」って事でひとつ・・・
0071nobodyさん2006/11/28(火) 20:59:18ID:???
素直に block で
@grepedarray = grep { s/ / / ; /^[A-Z]/ } @array ;
@grepedarray = grep { $flag ++ if /^[A-Z]/ ; s/ / / ; $flag } @array ;
じゃ駄目なのか?(適当に書いたが)
0072nobodyさん2006/11/28(火) 21:04:48ID:???
取得しない値まで置換とかする必要ないだろ・・・常識的に考えて・・・
0073712006/11/28(火) 21:17:03ID:???
>>72
そうだ罠。(実際書く時には当然もっと丁寧に if 文書くけどさw)

ただ @array に grep でアクセスした後、map or foreach で
アクセスするなら実質 2 回のループなわけで…。
そっちも十分に無駄っぽいよね。
0074nobodyさん2006/11/28(火) 21:34:23ID:???
そんな事言ってたらPerlでプログラミングできませんよ(´・ω・)
もっと富豪的に
0075nobodyさん2006/11/28(火) 21:43:35ID:???
grep 使ってる時点で十分富豪w
0076 ◆TWARamEjuA 2006/11/28(火) 22:00:53ID:????BRZ(6677)
@grepedarray = grep {
 /^[A-Z]/
  ? s/ / /
   ? 1
   : 1
  : undef
 } @array;
0077nobodyさん2006/11/28(火) 22:05:24ID:???
ここらへんで誰かが Bench ってくるとエスパー
0078nobodyさん2006/11/28(火) 22:10:11ID:???
ふと思ったんだが、処理速度のbenchならBenchmark.pmだけど
メモリのbenchってどうやんだ?やる方法ある?
0079nobodyさん2006/11/28(火) 22:24:28ID:???
>>76
そう来るならこっちの方がもっとスマート
grep { /^[A-Z]/ ? s/ / / || 1 : undef } @array;
0080nobodyさん2006/11/28(火) 22:39:36ID:???
だったら grep { /^[A-Z]/ and s/ / / || 1 } @array; でもいくね?
0081nobodyさん2006/11/28(火) 22:43:03ID:???
そうデスorz...
0082nobodyさん2006/11/28(火) 22:48:03ID:???
>>78
Windowsじゃ動かんし使ったことも無いのだけれど、
forkしてから走らせて使用メモリサイズを調べるmemchならあるね…
ttp://search.cpan.org/~salva/Memchmark-0.01/lib/Memchmark.pm
freeで確保した領域をOSに返しちゃうタイプのライブラリだとそもそも成立しない方法っぽい

それから、Perlをデバッグオプションつきでコンパイルしておけば、
色々メモリ関連情報が調べられるんだったと記憶しているけれど、
どの程度できるのかよく知らんです。
0083nobodyさん2006/11/28(火) 22:54:46ID:???
>>82
> Memchmark.pm
ああ!それがあったか。試してみよ。THX!
0084nobodyさん2006/11/29(水) 00:11:52ID:YenD9j36
25桁*1000万件の重複しない数値データをcsvファイルに格納させるため、
以下のようなプログラムを書きました。


my %no;

for (my $cnt = 1; $cnt <= 10000000; $cnt++) {
my $s_no = main::create_no();

$no{$s_no} = 1;


if(!open(FH, ">>./no.csv")){
print "Error " . __LINE__ . "\n";
exit;
}
flock(FH, 2);
print FH $s_no . "\r\n";
flock(FH, 8);
close(FH);
}


create_no内では
if(not exists $no{$c_no}){ return $c_no; }
このようにハッシュのexsistsを使用して重複チェックをかけているのですが、
やはりメモリを大量に消費してしまうため、900万あたりからものすごい時間が
かかってしまいます。

効率的な方法があればどうかご教示ください。
恐れ入りますが宜しくお願いいたします。
0085nobodyさん2006/11/29(水) 00:19:15ID:???
25桁で連番で1000万件書き出す
桁数が決まってるのでバイナリアクセスで

filepos1 = rnd * 総レコード数
filepos2 = rnd * 総レコード数

この pos1 と pos2 を入れ替え
あとは好きな回数だけswapすればいいかと思います

すべての件をメモリに保持しないので仕様メモリは極小で済みますが、
ディスクI/O がかなり発生します。
0086nobodyさん2006/11/29(水) 00:59:08ID:???
>>85
ご教示有難うございます。

この方法ですと、1000万回ファイルを読み込む、という
解釈で宜しいでしょうか。
0087nobodyさん2006/11/29(水) 01:15:11ID:???
50万回シャッフルする場合は

1000万回ライト
50万回シーク
50万回リード
50万回シーク
50万回ライト

って感じです
0088nobodyさん2006/11/29(水) 01:15:58ID:???
Perl5.8以降なら、こんな事もできます。
http://blog.livedoor.jp/dankogai/archives/50681645.html
0089nobodyさん2006/11/29(水) 22:03:44ID:???
>>58
お礼すごい遅れました。
ありがとうございました。
0090nobodyさん2006/11/29(水) 23:37:00ID:???
>>62です。
みなさん色々ありがとうございました。
0091nobodyさん2006/11/29(水) 23:58:32ID:???
@grepedarray = grep { /win/ and s/win/BIG/ } @array;

$cnt = grep(/win/,@array);

print "大文字\n@grepedarray\n計$cnt個\n";

この文で$cntの部分が 計0個とでてしまんですが何が問題なんでしょう?
0092nobodyさん2006/11/30(木) 00:14:17ID:???
>>91
grep{} 内の $_ は元 array の要素のエイリアスだから、
一行目にて $_ を直接変更してしまっている。それがやなら
@grepedarray = map { $foo = $_ ; $foo =〜 s/win/BIG/ ; $foo } grep { /win/ } @array ;
てなかんじで map 中で $foo にいったん代入してから変更する事
ちなみに上の map 中の $_ も @array の要素のエイリアス( s/// したら変更されちまう)
0093nobodyさん2006/11/30(木) 00:17:52ID:???
map っていまいちつかいどころ分からない
ブロックで囲っちゃえばいいじゃんとか思うのだが
0094nobodyさん2006/11/30(木) 00:18:50ID:???
×一行目にて $_ を直接変更してしまっている。それがやなら
○一行目にて元要素を直接変更してしまっている。それがやなら
0095nobodyさん2006/11/30(木) 00:30:46ID:???
>>92さん
ありがとうございます。理解できました。^^
0096nobodyさん2006/11/30(木) 00:32:28ID:???
>>93
例を挙げるとシュワルツ変換には必須。
my @array = ( '1,2', '2,1' ) ;
my @sorted = map { $_->[0] }
        sort { $a->[1]<=>$b->[1] }
        map { [ $_, (split /,/, $_ )[1]] } @array ;
上を普通の for 文で書くと捨て array を数個書くはめになり、7 行以上になることは確定。
とは言いながらも使うかどうかは完全に趣味の問題
0097nobodyさん2006/11/30(木) 01:25:15ID:???
>>93
何を抜かしてるのかと思ったら、ここ WebProg 板なのね…。
0098nobodyさん2006/11/30(木) 02:58:21ID:???
>>93
たとえばだけど、ハッシュを引数に取るサブルーチンに
foo( map { $_ => $hash{$_} =~ /^\d+$/ ? $hash{$_} * 2 : "str".$hash{$_} } keys %hash);
などと使えて便利。
0099 ◆TWARamEjuA 2006/11/30(木) 07:00:27ID:????BRZ(6677)
my $Now_date = sprintf qq|%04d/%02d/%02d|, # 日付を生成
map {
$_->[0] += 1900;
$_->[1]++;
@$_
} [(localtime)[5,4,3]];
0100nobodyさん2006/11/30(木) 08:57:31ID:???
>>99
…さすがにそれは普通に sub に渡すだろ
my $Now_date = sprintf qq|%04d/%02d/%02d|,
sub { $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
もしくは
my $Now_date
  = sub{ sprintf qq|%04d/%02d/%02d|, $_[5]+1900, $_[4]+1, $_[3]}->(localtime) ;
0101nobodyさん2006/11/30(木) 10:53:04ID:???
>>9
Jcode.pm は知らんけど、Encode.pm は重い。
一般的な掲示板CGIで use Encode; しただけで、2〜3割CPU負荷が高くなった。

0102nobodyさん2006/11/30(木) 10:55:09ID:???
ファイルを開く時に、

open(FILEHANDLE, ">> filename") ;

という書き方をしますよね。

この書き方はファイル名がダブルクォーテーションで囲われないのでいまいち好きになれません。

例えば、ファイル名が " test.txt" (半角スペースが左にある) だった場合にはどうすればいいんでしょうか?
0103nobodyさん2006/11/30(木) 11:08:52ID:???
>>102
open(FILEHANDLE, ">>", " test.txt");
■ このスレッドは過去ログ倉庫に格納されています