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

【Perl】初心者コーナー Part16

■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo 02/09/15 15:11ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
00023PIO ◆3pIoOHKo 02/09/15 15:13ID:???
[過去ログ]
Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 知らん
Part15 http://pc.2ch.net/test/read.cgi/php/1028816385/

[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
0003nobodyさん02/09/15 15:31ID:???
乙
00043PIO ◆3pIoOHKo 02/09/15 15:34ID:???
>>3
うん。ちょっと疲れた
0005nobodyさん02/09/15 15:46ID:???
\\\\\\\\\\
\ ^ ^ \
| -@ @ -|
| △ |/
| / \/
\ ○< 新スレおめでとうございます
\ \
-----/ \
0006nobodyさん02/09/15 16:19ID:???
前スレ>>975
普通に\n教えてあげた方が早いんじゃ。。
0007nobodyさん02/09/15 16:25ID:???
コテハンで継続スレ立てるなヴォケ
0008nobodyさん02/09/15 17:25ID:???
>>7
削除依頼ヨロ
0009nobodyさん02/09/15 18:23ID:???
open(LOG,"+<$logfile");
flock(LOG,2);
@log=<LOG>;
@log = &format_log($maxlog,@log);
seek LOG,0,0;
print LOG @log;
truncate(LOG,tell);
close LOG;

みたいなのがあって意味はわかると思うんですが、
truncate(LOG,tell);
ってなくていいような気がするんですが、どうなんでしょう。
これが書いてある事でどんなメリットがあるのか教えてください。
0010nobodyさん02/09/15 18:38ID:???
>>9
truncate関数の意味がわからないのか。
それなら、検索すれば三秒で解決すると思うんだが。
0011nobodyさん02/09/15 18:42ID:???
>>10
だからファイルサイズを変更するなんて記述する事の意味を聞いているのですよ。
0012nobodyさん02/09/15 18:46ID:???
>11
ファイルサイズが前より小さくなった時に意味をなす。
0013902/09/15 18:51ID:???
>>12
らじゃ

スピードに影響があるらしいということで解決マーク。
0014nobodyさん02/09/15 19:29ID:???
>>1
氏ねカス
0015nobodyさん02/09/15 20:01ID:???
コテハンで継続スレ立てるなヴォケ
0016nobodyさん02/09/15 20:03ID:???


7 名前:nobodyさん 投稿日:2002/09/15(日) 16:25 ID:???
コテハンで継続スレ立てるなヴォケ


8 名前:nobodyさん 投稿日:2002/09/15(日) 17:25 ID:???
>>7
削除依頼ヨロ
0017nobodyさん02/09/15 20:04ID:???
↑馬鹿
0018nobodyさん02/09/15 20:07ID:???
>>10
( ´,_ゝ`)
0019nobodyさん02/09/15 20:19ID:???
コテハンで継続スレ建てるな。売名厨房か
0020nobodyさん02/09/15 20:29ID:???
日付をフォーマットし直す場合、
$time = sprintf("%02.d",$time);
よくこうしろと言われてますが、
$time = "0$time" if ($time<10);
こちらの方が軽くてイイと思うのですが
どうでしょうか?
0021nobodyさん02/09/15 20:40ID:PweXUHcd
sub abc{
foreach(@a){
push @line,"<small>$_</small>\n";
}
return @line;
}
とし、
@textpart=&abc();
とし、
print "<body>@textpart</body>";
のようにしたところ、
1行目は問題ないのですが2行目以降
必ず行頭に半角スペースが入ります。なんででしょう。
上記のプロセスは無関係でしょうか。
0022nobodyさん02/09/15 20:49ID:???
>>21
配列はデフォールトでは空白によって区切られたリストです
だからそれを展開すると空白も出力されます
ただし、"..."に入れないで、表に出せば空白は入りません
print "<body>", @textpart, "</body>";


0023nobodyさん02/09/15 20:49ID:???
>20
万が一、すでに$timeが02とかになっていた場合、002になってしまうからでは?
あまり大きくなく汎用性を気にしないならそれでもいいんじゃない?
0024nobodyさん02/09/15 20:50ID:???
>21
配列の区切り詞が半角スペースになってるから。
0025nobodyさん02/09/15 20:53ID:???
>>20
月、日、時間、分、秒のそれぞれに一桁か二桁かの判定(if文)を
入れるのが大変、というかそれによってsprintfより重くなってし
まうからではないでしょうか
一個だけなら、そんなに変わらないでしょうが



00262102/09/15 21:00ID:???
>>22>>24
レス感謝です。

>"..."に入れないで、表に出せば空白は入りません
試したら言われた通りになりました。
実際はヒアドキュメントの中に書いていたのでずっとわからずにいました。
ありがとうございました。
0027nobodyさん02/09/15 21:06ID:WvlaRVTE
2chのスレッドをファイルに取得したいのですが普通に取得すると
HTTP/1.1 302 Found

が返ってきてうまく取得できないのです。
スレッド一覧はうまく取得できるのですが。

こんな感じで$input_fileにhtmlファイルを取得していますが
何かリクエストのコマンドに工夫が必要なのでしょうか?

socket(S, 2, 1, 0);
connect(S, $name);
select(S); $| = 1; select(stdout);
print S "GET $path HTTP/1.0\n";
print S "Host: $host\n";
print S "Connection: close\n\n";
$str=join("",(">",$input_file));
open(FOUT,$str);
while(<S>) {
print FOUT $_;
}
close(FOUT);
00283PIO ◆3pIoOHKo 02/09/15 21:32ID:???
unlink(">>19");
0029nobodyさん02/09/15 21:35ID:???
>28
コテハンでスレ立てるのはともかく、そこで煽るなよ。

>27
LWPは使えないの?
0030nobodyさん02/09/15 21:37ID:???
delete(">>19");
undef(">>19");
We thank you, Mr. 3PIO!
0031nobodyさん02/09/15 22:45ID:???
>>28=>>30
マジ引いた
0032nobodyさん02/09/15 22:50ID:???
コテハンで継続スレ建てるな。売名厨房か
0033nobodyさん02/09/15 22:50ID:???
>>27
>open(FOUT,$str);
↑ open(FOUT,$str)|| die $!; の方が良いのでは?
2chのdat生取りはそれなりに作法が有ったんじゃ無いか
それと、生Socket使うよりIO::Socketとか29の言う様にLWPなんて
便利な物があるので、そっちを勧める
wgetに放り込むとか  (w


// 固定に異常に粘着する猿はコイツなので気にしないように
http://pc.2ch.net/test/read.cgi/php/1029945604/l50
0034nobodyさん02/09/15 22:52ID:???
コテハンで継続スレ建てるな。売名厨房か
0035nobodyさん02/09/15 22:55ID:???
Part3でも同じことがありましたな〜
0036nobodyさん02/09/15 22:55ID:???
▼社会的弱者↓
   彡川川川キチガイミ〜
   川川川/  \|〜 プゥ〜ン    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ‖|‖ ◎---◎|〜   クサイ   / この板では俺様以外は固定を名乗るな!
  川川‖    3  ヽ〜      <  XSとParrotが使えて、PERL5.8をコンパイル
  川川   ∴)д(∴)〜        \ 出来る俺様を差し置いて固定とはなんだ!!
  川川      〜 /〜 カタカタカタ \  俺は一日中Perlを触ってるプロだ
  川川‖    〜 /‖ _____  \ PerlCCもhernessも使える
 川川川川___/‖  |  | ̄ ̄\ \  \ 上級者の俺のイソターネットを見てくれ!!
   /  ヒキコモリ  \__| 低収入 | ̄ ̄|  \ http://hiero_pl.tripod.co.jp/
  /  \__>>34   |  |    |__|      \____________
  | \  中卒 |つ   |__|__/ /    
  / アホ ̄ ̄  | ̄ ̄ ̄ ̄|  〔 ̄ ̄〕
0037nobodyさん02/09/15 23:02ID:???
糞固定必死だなw
0038nobodyさん02/09/15 23:11ID:???
>>23
>>25
前ベンチマークで計った記憶があるのですが、
全て変換してもsprintfの方が重たいんですよね。
sprintf使った方がシンプルで見やすいからでしょうか?
0039nobodyさん02/09/15 23:20ID:???
>>38
0$time if (...);

こんなのがダサイとも気持ち悪いとも思わないのならどっちでもヨロシ
一兆回ループするなら速い方が良いかもね
00402702/09/15 23:27ID:d22Bbzx7
>>27です。

>>29 >>33
レスありがとうございます。
2chのスレッド取得はどんな作法があるのか調べてるのですが
よくわからないです。
Irvineではうまく落とせますね。
0041nobodyさん02/09/15 23:28ID:???
ハッシュをスカラーコンテキストで評価すると
xx/yyみたいに表示されますが、さっぱり意味がわかりません。
誰か小学生にも分かるように教えて下さい
0042nobodyさん02/09/15 23:33ID:vqb5QhHr
CGI.pmを使用しています。

print
 header(-charset=>'euc-jp'), start_html("INPUT"),
 "性別: ", radio_group(-name=>'sex', -values=>['男', '女'],
 -default=>'-', -labels=>\%labels), br,
……

例えばラジオボタンを上記のような記述で記述すると
param('sex') に"男"あるいは"女"が渡されてきます。
2バイト文字を使って条件判断をするのはちょっと気持ち悪いのですが、
表示文字をアルファベットにするわけにも行きません。
直接2バイト文字の条件判断を使わず、帰ってくる値を簡単な変数(0,1やm,f等)に置き換えることは出来ませんでしょうか。
0043nobodyさん02/09/16 01:22ID:???
>>42
ハッシュで定義しとけばいいじゃん
@sex{('男', '女')}= (0, 1);

$sex= %sex{param('sex')};
0044nobodyさん02/09/16 01:58ID:???
質問です。

まず、aaa.html に <!--#exec cgi="bbb.pl" --> と記述しておきます。
で、ccc.html から aaa.html に飛ぶと、
もちろん $ENV{'QUERY_STRING'} は ccc.html になりますよね。

そうじゃなくて、aaa.html を参照したい時にはどうすればよいでしょうか?
環境変数にそんなのないですよね…?
0045nobodyさん02/09/16 02:12ID:???
$ENV{'QUERY_STRING'} がaaa.htmlになるのか?
00464402/09/16 03:34ID:UarIxOyF
>>45
> $ENV{'QUERY_STRING'} がaaa.htmlになるのか?
失礼しました…。
$ENV{'HTTP_REFERER'}の間違いです。すんません。
00474402/09/16 03:38ID:???
自己解決しました。
$ENV{'DOCUMENT_URI'}ですね。ありがとうございました。
0048nobodyさん02/09/16 03:47ID:???
>>44 vs. >>46
ぜーんぜん違うじゃんかよ
$ENV{'HTTP_REFERER'}は、bbb.plが呼ばれたページだから
aaa.htmlとなるはず
0049b02/09/16 03:49ID:oqHfjXJ7
http://profiles.yahoo.co.jp/tengaiten2002
0050nobodyさん02/09/16 06:18ID:???
>>39
そういうことですよね
ありがとうございました
0051 ◆JAPH9PWA 02/09/16 09:10ID:???
>>20>>38
私が以前ベンチマークしたらsprintfの方が速かったけどなぁ。
ちなみにどんなコードでテストした?
00523PIO ◆3pIoOHKo 02/09/16 12:02ID:???
>>31
いや、>>30は俺じゃない
00534202/09/16 12:22ID:m4c9VqI1
>>43
ご回答ありがとうございます。
つまり、そういう方法で置き換えることしか方法が無いということですね。
イチイチ置き換えないといけないとなるとCGI.pm使うのも微妙なところだなぁ。

ちなみにそちらの方法を試したら動きませんでした(^^;
今直してます。
0054nobodyさん02/09/16 13:00ID:???
>>52 コテハンで継続スレ建てるな。売名厨房
00553PIO ◆3pIoOHKo 02/09/16 15:01ID:???
$_ =~ s/>>54/あぼーん/;
0056nobodyさん02/09/16 15:05ID:???
s/3PIO ◆3pIoOHKo/あぼーん/g;
0057nobodyさん02/09/16 15:10ID:???
>55
>29と同じ事を言わせるな。
スレ立て自体は感謝してる。
だが煽りにのって煽り返すなよ。
そんなだから延々煽られるんだろうが・・・。

コテハン煽りを放置できないならコテハン使うな。
名無しに戻れ。
じゃなければこのスレから去ってくれ。
真面目に返答してるコテハンまで悪い目で見られるだろ。
頼むから。

初心者スレを潰したいわけじゃないだろう?
あんた自身の手でこのスレをクソスレにでもしたいのか?
0058nobodyさん02/09/16 15:10ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
00593PIO ◆3pIoOHKo 02/09/16 15:11ID:???
while (1) { unlink(">>56"); }
ず〜っと氏んでろ
00603PIO ◆3pIoOHKo 02/09/16 15:11ID:???
>>57
へいへい
0061nobodyさん02/09/16 15:24ID:???
コテハン云々以前に3PIO ◆3pIoOHKoは厨であることが決定しますた
0062nobodyさん02/09/16 15:53ID:???
私は自分の名前を入力してあってるかあってないかと言うことを聞いてくるスクリプトをつくりたいのですが

print "あなたのお名前を入力してください:"; chomp($name = <STDIN>);
do
{
print "あなたのお名前は",$name,"さんですね?\n";
print "YES:0NO:1\n"; $logic = <STDIN>; print "\n"; chomp($logic);
if ($logic == 0)
{
print "やはりそうでしたか";
}
elsif ($logic == 1)
{
print "嘘はつかないでください\n";
}
else
{
print"YESかNOかで答えてください";
}
}
until($logic == 0);

と作りました。しかし0か1かを入力するところを0,1以外で入力するとelse構文のないようが表示されず
終了してしまいます。
なぜでしょうか?
0063nobodyさん02/09/16 16:18ID:???
>>62
eqで文字列比較にしてみてわ
0064nobodyさん02/09/16 16:20ID:???
わかりました。がんばってみます。
ありがとう
0065This is perl, version 5.003_0702/09/16 17:56ID:???
$str =~ /$hoge/;

という場合、$hoge の値として ? とか ( ) とかの
記号が入ってる場合、その記号を文字そのものとして
パターンマッチさせるにはどうすればいいんでしょか?
0066 ◆JAPH9PWA 02/09/16 18:08ID:???
$str =~ /\Q$hoge\E/;
# \Q はquotemeta()の頭文字で\Eはendの意かなぁ…
0067This is perl, version 5.003_0702/09/16 18:11ID:???
どもです〜!!
0068 ◆JAPH9PWA 02/09/16 18:12ID:???
ってマルチかい…。
まともな回答を望んでいるなら一言くらい何か書いた方がいいよ。
00694202/09/16 23:48ID:m4c9VqI1
どうも、CGI.pmのラジオボタンで質問した者です。
結局色々やっても>>43さんの方法は出来ませんでした。(TT

あとこの方法は非常に長いパラメータがついてしまうと大変な気がするのですが、、、、
例えば男、女ではなく
print
"問1: ", radio_group(-name=>'sex', -values=>[
'2ちゃんねるは諸言語のプログラミングを学ぶ上で非常に有用なコミュニティであり、云々〜(以下永延と)と思う',
'2ちゃんねるはどちらかというと学ぶと言うよりは遊び感覚で参加すべきであり云々〜(以下小一時間)だと思う'
],・・・・・・・・・・・・・

な感じだと文章をパラメータにして置き換えなければいけないんですよね。

こりゃ困ったな。。。
0070nobodyさん02/09/17 05:04ID:yqtkGr1m
windows上でPerlを使ってるんですが

opendir(DIR,"./");
while($_ = readdir(DIR)){
 print "$_," . (stat)[9] . "\n";
}
closedir(DIR);

とやっても、ファイルの更新時間が見れません。
statがWindowsでサポートされていないのであれば、
ほかに代わる方法ないでしょうか?
00717102/09/17 08:09ID:???
イメージカウンタを作っています。
gifcat.pl を使って

open(PUT, ">counter.gif");
flock(PUT, 2);
binmode(PUT);# MS-DOS や Windows の場合に必要です。

foreach $gif (@num)
{
$int = $imgpath . $gif;
$imagefile = "$int . .gif";
push(@getimg, $imagefile);
}

print PUT &gifcat'gifcat("@getimg");
print <PUT>;
flock(PUT, 8);
close(PUT);

というコーディングをしたんですが、うまく表示できませんでした。
gifcat.plの使い方がおかしいのでしょうか?

0072nobodyさん02/09/17 08:19ID:???
>>70
ちゃんと出とるはず
perldoc -f stat
9 mtime last modify time in seconds since the epoch
(The epoch was at 00:00 January 1, 1970 GMT.)
# modifyはmodifiedの間違いじゃない?

0073nobodyさん02/09/17 08:24ID:???
>>71
$imagefile = "$int . .gif";
=>$imagefile = $int . ".gif";
でしょ

0074かるぴすうぉ〜た02/09/17 08:55ID:yqtkGr1m
>>72
それが、私の環境では、出ないんです。
Perlのバージョンは
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
OSは、Windows2000。
0075nobodyさん02/09/17 09:00ID:yqtkGr1m
ああ、コテハン入れたままになってた、、打つ。

仕方がないので、ファイルの書きこみ時、最後の行にでもtimeの値を書きこんで
随時それを読み込んで参照することで、しばらくは解決させることにします。
もし、ファイルに対して直接更新時間にアクセスできるような処理方法があったら
おながいしうます。
0076 ◆JAPH9PWA 02/09/17 09:07ID:???
>>70,>>75
そんなはず無いんだけどね。そのPerlが壊れてるなら別だけど。
実際私の環境(ActivePerl631, WinME)だとそのコードだと正常に動くし。

それとももしかしてopendirの引数にカレントディレクトリ以外の値を与えてる?
それだと失敗するよ。
00777102/09/17 09:10ID:???
>>73
&gifcat に"$int.gif"("1.gif""2.gif"...)を渡したいんです。
それとも、GIF画像自体を渡すんでしょうか・・・

スレ違いかも失礼
0078nobodyさん02/09/17 09:16ID:???
>>70,>>75
おらwin98SEのActivePerlのv5.6.0 built for MSWin32-x86-multi-threadだけ
ど問題なく動いてるYo

0079nobodyさん02/09/17 09:20ID:???
>>77
だから、
$imagefile = "$int . .gif";
じゃ1\ .\ .gifとか2\ .\ .gigっていうファイル名になっちゃうんじゃないって
言ってるんだけど('\ 'ってのは半角空白ね)
0080nobodyさん02/09/17 09:26ID:???
>>77
答えてるヤシがいるんだからいちいち
スレ違いかも失礼
なんて書くなよ
0081nobodyさん02/09/17 11:52ID:???
$line が16バイト以上なら14バイトまで削って .. をつけるようにしたいです
自分なりにも考えました

if(length $line > 16){
    $line = (join "", (split "", $line)[0..13]) . "..";
}

これよりもっと効率のいい方法がありそうだと思うのですがあったら教えてください
■ このスレッドは過去ログ倉庫に格納されています