乙
\\\\\\\\\\ \ ^ ^ \ | -@ @ -| | △ |/ | / \/ \ ○< 新スレおめでとうございます \ \ -----/ \
前スレ
>>975 普通に\n教えてあげた方が早いんじゃ。。
コテハンで継続スレ立てるなヴォケ
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); ってなくていいような気がするんですが、どうなんでしょう。 これが書いてある事でどんなメリットがあるのか教えてください。
>>9 truncate関数の意味がわからないのか。
それなら、検索すれば三秒で解決すると思うんだが。
>>10 だからファイルサイズを変更するなんて記述する事の意味を聞いているのですよ。
>11 ファイルサイズが前より小さくなった時に意味をなす。
13 :
9 :02/09/15 18:51 ID:???
>>12 らじゃ
スピードに影響があるらしいということで解決マーク。
コテハンで継続スレ立てるなヴォケ
7 名前:nobodyさん 投稿日:2002/09/15(日) 16:25 ID:???
コテハンで継続スレ立てるなヴォケ
8 名前:nobodyさん 投稿日:2002/09/15(日) 17:25 ID:???
>>7 削除依頼ヨロ
↑馬鹿
コテハンで継続スレ建てるな。売名厨房か
日付をフォーマットし直す場合、 $time = sprintf("%02.d",$time); よくこうしろと言われてますが、 $time = "0$time" if ($time<10); こちらの方が軽くてイイと思うのですが どうでしょうか?
21 :
nobodyさん :02/09/15 20:40 ID:PweXUHcd
sub abc{ foreach(@a){ push @line,"<small>$_</small>\n"; } return @line; } とし、 @textpart=&abc(); とし、 print "<body>@textpart</body>"; のようにしたところ、 1行目は問題ないのですが2行目以降 必ず行頭に半角スペースが入ります。なんででしょう。 上記のプロセスは無関係でしょうか。
>>21 配列はデフォールトでは空白によって区切られたリストです
だからそれを展開すると空白も出力されます
ただし、"..."に入れないで、表に出せば空白は入りません
print "<body>", @textpart, "</body>";
>20 万が一、すでに$timeが02とかになっていた場合、002になってしまうからでは? あまり大きくなく汎用性を気にしないならそれでもいいんじゃない?
>21 配列の区切り詞が半角スペースになってるから。
>>20 月、日、時間、分、秒のそれぞれに一桁か二桁かの判定(if文)を
入れるのが大変、というかそれによってsprintfより重くなってし
まうからではないでしょうか
一個だけなら、そんなに変わらないでしょうが
26 :
21 :02/09/15 21:00 ID:???
>>22 >>24 レス感謝です。
>"..."に入れないで、表に出せば空白は入りません
試したら言われた通りになりました。
実際はヒアドキュメントの中に書いていたのでずっとわからずにいました。
ありがとうございました。
27 :
nobodyさん :02/09/15 21:06 ID: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);
>28 コテハンでスレ立てるのはともかく、そこで煽るなよ。 >27 LWPは使えないの?
delete("
>>19 ");
undef("
>>19 ");
We thank you, Mr. 3PIO!
コテハンで継続スレ建てるな。売名厨房か
コテハンで継続スレ建てるな。売名厨房か
Part3でも同じことがありましたな〜
▼社会的弱者↓
彡川川川キチガイミ〜
川川川/ \|〜 プゥ〜ン / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
‖|‖ ◎---◎|〜 クサイ / この板では俺様以外は固定を名乗るな!
川川‖ 3 ヽ〜 < XSとParrotが使えて、PERL5.8をコンパイル
川川 ∴)д(∴)〜 \ 出来る俺様を差し置いて固定とはなんだ!!
川川 〜 /〜 カタカタカタ \ 俺は一日中Perlを触ってるプロだ
川川‖ 〜 /‖ _____ \ PerlCCもhernessも使える
川川川川___/‖ | | ̄ ̄\ \ \ 上級者の俺のイソターネットを見てくれ!!
/ ヒキコモリ \__| 低収入 | ̄ ̄| \
http://hiero_pl.tripod.co.jp/ / \__
>>34 | | |__| \____________
| \ 中卒 |つ |__|__/ /
/ アホ ̄ ̄ | ̄ ̄ ̄ ̄| 〔 ̄ ̄〕
糞固定必死だなw
>>23 >>25 前ベンチマークで計った記憶があるのですが、
全て変換してもsprintfの方が重たいんですよね。
sprintf使った方がシンプルで見やすいからでしょうか?
>>38 0$time if (...);
こんなのがダサイとも気持ち悪いとも思わないのならどっちでもヨロシ
一兆回ループするなら速い方が良いかもね
40 :
27 :02/09/15 23:27 ID:d22Bbzx7
>>27 です。
>>29 >>33 レスありがとうございます。
2chのスレッド取得はどんな作法があるのか調べてるのですが
よくわからないです。
Irvineではうまく落とせますね。
ハッシュをスカラーコンテキストで評価すると xx/yyみたいに表示されますが、さっぱり意味がわかりません。 誰か小学生にも分かるように教えて下さい
42 :
nobodyさん :02/09/15 23:33 ID: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等)に置き換えることは出来ませんでしょうか。
>>42 ハッシュで定義しとけばいいじゃん
@sex{('男', '女')}= (0, 1);
$sex= %sex{param('sex')};
質問です。 まず、aaa.html に <!--#exec cgi="bbb.pl" --> と記述しておきます。 で、ccc.html から aaa.html に飛ぶと、 もちろん $ENV{'QUERY_STRING'} は ccc.html になりますよね。 そうじゃなくて、aaa.html を参照したい時にはどうすればよいでしょうか? 環境変数にそんなのないですよね…?
$ENV{'QUERY_STRING'} がaaa.htmlになるのか?
46 :
44 :02/09/16 03:34 ID:UarIxOyF
>>45 > $ENV{'QUERY_STRING'} がaaa.htmlになるのか?
失礼しました…。
$ENV{'HTTP_REFERER'}の間違いです。すんません。
47 :
44 :02/09/16 03:38 ID:???
自己解決しました。 $ENV{'DOCUMENT_URI'}ですね。ありがとうございました。
>>44 vs.
>>46 ぜーんぜん違うじゃんかよ
$ENV{'HTTP_REFERER'}は、bbb.plが呼ばれたページだから
aaa.htmlとなるはず
49 :
b :02/09/16 03:49 ID:oqHfjXJ7
>>39 そういうことですよね
ありがとうございました
>>20 >>38 私が以前ベンチマークしたらsprintfの方が速かったけどなぁ。
ちなみにどんなコードでテストした?
53 :
42 :02/09/16 12:22 ID:m4c9VqI1
>>43 ご回答ありがとうございます。
つまり、そういう方法で置き換えることしか方法が無いということですね。
イチイチ置き換えないといけないとなるとCGI.pm使うのも微妙なところだなぁ。
ちなみにそちらの方法を試したら動きませんでした(^^;
今直してます。
s/3PIO ◆3pIoOHKo/あぼーん/g;
>55 >29と同じ事を言わせるな。 スレ立て自体は感謝してる。 だが煽りにのって煽り返すなよ。 そんなだから延々煽られるんだろうが・・・。 コテハン煽りを放置できないならコテハン使うな。 名無しに戻れ。 じゃなければこのスレから去ってくれ。 真面目に返答してるコテハンまで悪い目で見られるだろ。 頼むから。 初心者スレを潰したいわけじゃないだろう? あんた自身の手でこのスレをクソスレにでもしたいのか?
while (1) { unlink("
>>56 "); }
ず〜っと氏んでろ
コテハン云々以前に3PIO ◆3pIoOHKoは厨であることが決定しますた
私は自分の名前を入力してあってるかあってないかと言うことを聞いてくるスクリプトをつくりたいのですが 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構文のないようが表示されず 終了してしまいます。 なぜでしょうか?
わかりました。がんばってみます。 ありがとう
$str =~ /$hoge/; という場合、$hoge の値として ? とか ( ) とかの 記号が入ってる場合、その記号を文字そのものとして パターンマッチさせるにはどうすればいいんでしょか?
$str =~ /\Q$hoge\E/; # \Q はquotemeta()の頭文字で\Eはendの意かなぁ…
どもです〜!!
ってマルチかい…。 まともな回答を望んでいるなら一言くらい何か書いた方がいいよ。
69 :
42 :02/09/16 23:48 ID:m4c9VqI1
どうも、CGI.pmのラジオボタンで質問した者です。
結局色々やっても
>>43 さんの方法は出来ませんでした。(TT
あとこの方法は非常に長いパラメータがついてしまうと大変な気がするのですが、、、、
例えば男、女ではなく
print
"問1: ", radio_group(-name=>'sex', -values=>[
'2ちゃんねるは諸言語のプログラミングを学ぶ上で非常に有用なコミュニティであり、云々〜(以下永延と)と思う',
'2ちゃんねるはどちらかというと学ぶと言うよりは遊び感覚で参加すべきであり云々〜(以下小一時間)だと思う'
],・・・・・・・・・・・・・
な感じだと文章をパラメータにして置き換えなければいけないんですよね。
こりゃ困ったな。。。
70 :
nobodyさん :02/09/17 05:04 ID:yqtkGr1m
windows上でPerlを使ってるんですが opendir(DIR,"./"); while($_ = readdir(DIR)){ print "$_," . (stat)[9] . "\n"; } closedir(DIR); とやっても、ファイルの更新時間が見れません。 statがWindowsでサポートされていないのであれば、 ほかに代わる方法ないでしょうか?
71 :
71 :02/09/17 08:09 ID:???
イメージカウンタを作っています。 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の使い方がおかしいのでしょうか?
>>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の間違いじゃない?
>>71 $imagefile = "$int . .gif";
=>$imagefile = $int . ".gif";
でしょ
74 :
かるぴすうぉ〜た :02/09/17 08:55 ID:yqtkGr1m
>>72 それが、私の環境では、出ないんです。
Perlのバージョンは
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
OSは、Windows2000。
75 :
nobodyさん :02/09/17 09:00 ID:yqtkGr1m
ああ、コテハン入れたままになってた、、打つ。 仕方がないので、ファイルの書きこみ時、最後の行にでもtimeの値を書きこんで 随時それを読み込んで参照することで、しばらくは解決させることにします。 もし、ファイルに対して直接更新時間にアクセスできるような処理方法があったら おながいしうます。
>>70 ,
>>75 そんなはず無いんだけどね。そのPerlが壊れてるなら別だけど。
実際私の環境(ActivePerl631, WinME)だとそのコードだと正常に動くし。
それとももしかしてopendirの引数にカレントディレクトリ以外の値を与えてる?
それだと失敗するよ。
77 :
71 :02/09/17 09:10 ID:???
>>73 &gifcat に"$int.gif"("1.gif""2.gif"...)を渡したいんです。
それとも、GIF画像自体を渡すんでしょうか・・・
スレ違いかも失礼
>>70 ,
>>75 おらwin98SEのActivePerlのv5.6.0 built for MSWin32-x86-multi-threadだけ
ど問題なく動いてるYo
>>77 だから、
$imagefile = "$int . .gif";
じゃ1\ .\ .gifとか2\ .\ .gigっていうファイル名になっちゃうんじゃないって
言ってるんだけど('\ 'ってのは半角空白ね)
>>77 答えてるヤシがいるんだからいちいち
スレ違いかも失礼
なんて書くなよ
$line が16バイト以上なら14バイトまで削って .. をつけるようにしたいです 自分なりにも考えました if(length $line > 16){ $line = (join "", (split "", $line)[0..13]) . ".."; } これよりもっと効率のいい方法がありそうだと思うのですがあったら教えてください
substr
84 :
71 :02/09/17 12:54 ID:???
>79 納得 >80 ごめん
85 :
71 :02/09/17 13:12 ID:???
71のコードをデバッグしてみました。 >79が原因でパスが間違っていたのと、変数名がサブルーチン部分と 重複しているものがありました。 >73=77さん、>80さん、ありがとうございますた!
86 :
86 :02/09/17 15:28 ID:???
cgiにアクセスした時、最初はパスワードの入力画面だけが表示され パスワードを入力すると管理画面に入る、というのを行いたいです。 暗号処理はいらないです。うまいやり方を教えてください。 お願いします。
>86 if(パスワードが送信されてきた){ &管理画面; }else{ &パスワード入力画面; }
>>70 >>76 さんの答えがビンゴだと思うけど一応。
opendir DIR, ($dir = './');
print(scalar gmtime((stat $dir . $file)[9]), ' ', $file, "\n")
while $file = readdir DIR;
closedir DIR;
用途によっては stat よりファイルテスト演算子の方がいいかも。
>86 do { &パスワード入力画面; } until($password == <INPUT>) とか
あやや、>87さんとかぶった・・・ すみません〜
91 :
nobodyさん :02/09/17 16:43 ID:bZ09p6Xo
ファイルを作成するとき間違ってchomd 6666と記述したら、 ---S--x-w-[000]という削除できないファイルができてしまったのですが 管理者に削除してもらわないと無理でしょうか?
>>91 unlink(削除したいファイル);
を実行しても消せなければ管理者さんにすがろう
93 :
91 :02/09/17 17:31 ID:???
unlinkでも消せませんでした。 管理者にすがってみます。 ありがとうございました。
95 :
3PIO ◆3pIoOHKo :02/09/17 21:11 ID:0b85vBv+
>>57 昨日は本当にスマンかった
今度から気を付ける。
許してくれm(__)m
もう帰って来んなよ
3PIO ◆3pIoOHKo だって ( ´,_ゝ`) プッ
98 :
nobodyさん :02/09/17 23:47 ID:nVaQI6CN
私は今CGIの勉強中で本を買って自サーバーを立ててそこでテストしながら勉強中です。 そこでテストすると500InternetServerErrorが出てしまいます。 まったく内容の同じサンプルCGIを自サーバーで開くと問題なく作動します。 スクリプトは何回も確認しましたが間違ってはいないようです。 保存時の文字コードが関係あるようなのですが、調べてもなかなかわかりません。 cgiはメモ帳で作成しています。OSはXPで自サーバーはApacheです。 どうすれば正常に作動するのでしょう?
>そこでテストすると500InternetServerErrorが出てしまいます。 そこで って、どこ?
100 :
98 :02/09/17 23:53 ID:nVaQI6CN
>>99 文章拙くてすみません。
そこで = 自サーバー(Apache)です。
>>98 確かね、500 Internal Server Error になると、
そのエラーページの最後の方に「エラーログ
見ればもっと詳しい事が分るかも」って書いてあ
るんだよ。違う?
もしかして IE だと読めないんだっけ?
>>100 いや、その直後の行で「問題なく動作します」って書いてるよ?
103 :
98 :02/09/18 00:04 ID:P3Sos/ey
そうなんです。 教本に付属しているCDのサンプルCGIはきちんと動作しています。 が、まったく同じ内容の私の作ったCGIはエラーになってしまうのです。 保存時の文字コードによっては文字化けして表示されたりもするので文字 コードではないかと思うのですが、いろいろな文字コードで保存していま すがどれもうまく作動しません。 原因は他にあるのでしょうか?
>>103 まったく同じ内容で動作が違うわけがないだろ。見直せ
きみの誤字・脱字までわかるわけないだろ!
105 :
98 :02/09/18 00:17 ID:P3Sos/ey
>>104 うーん、何回も見直してみたのですが……。
全角、半角も見直してみましたが間違ってはいないようです。
文字コードは関係ないのでしょうか?
107 :
98 :02/09/18 00:22 ID:P3Sos/ey
>>106 はい、比べて見ました。
どっちも1342バイトでした。
もしかしてもっと根本的な何かなんでしょうか?
Apacheを再インストールしてみます。
……普通は有り得ない現象なのでしょうか?
>>107 サンプルファイル名を自作CGI名にリネームして動作しなけりゃ
キャッシュだろ
109 :
98 :02/09/18 00:30 ID:P3Sos/ey
>>108 同じ名前で試してみました。
やっぱり動作しません。
キャッシュっていうのは、インターネット一時ファイルを削除すると言うことでしょうか?
110 :
98 :02/09/18 00:37 ID:P3Sos/ey
いろいろ質問してすみません。 もう眠るので落ちます。 ご意見ありがとうございました。
111 :
nobodyさん :02/09/18 01:20 ID:8kqybO5F
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock の排他制御を使わせてもらおうと思っているのですが
return \%lfh if (time - $1 > $lfh{timeout} and
rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time));
last;
ここの部分がいまいち何をしているのかわかりません。
特に\%lfhというエスケープ演算子の後のハッシュはどういう意味なんでしょうか?
>>98 セミコロンがコロンになってるとかそういうミスじゃないの?
>>111 参照渡し。
113 :
111 :02/09/18 02:27 ID:8kqybO5F
>>112 さん
ありがとう!少しスッキリしました。
>>98 サンプルのディレクトリにはjcode.plがあるが、
キミのディレクトリには無い。
とか、
キミのファイル名が日本語だから(XP上で日本語じゃダメなのかは不明)
とか。
115 :
nobodyさん :02/09/18 08:56 ID:4xK36YHq
>>98 コマンドプロンプトで
perl -cw filename.cgi
しろ
116 :
nobodyさん :02/09/18 09:45 ID:04tSnTX3
perlでFTPモジュールを使ってファイルのアップ・ダウンを やりたいのですが、特定の環境・ホストの組み合わせによっては 出来ない場合があります。 ログインまでは出来るのですが、なぜかリスト取得(nlst)や ファイルのput・getができません(pwdやcwdはできます…)。 エラーが出るわけではなく、タイムアウトしてしまいます。 どうすればいいでしょうか。以下、ソースです。 #ここから use Net::FTP; $ftp = Net::FTP->new($ftphost, Debug => $ftpdbg, Passive => $passive)||die "Net::FTP FAILED"; $ftp->login($ftpuser,$ftppass); $ftp->ascii(); $ftp->cwd("web/cgi-bin"); @files = $ftp->dir(); print join("\n",@files)."\n\n"; #ここまで このソースを別環境で試してみたところ、問題無く 動きました…。ちなみに、当方LANからのADSL接続です。
Net::FTPのpasv()の項を見よ。
118 :
116 :02/09/18 10:54 ID:04tSnTX3
>117 接続先のftpサーバはPassive->0にしないとつながらないのです。 pasv()はPassiveに移行するコマンドですよね? もしかしてデータポートの問題でしょうか。コマンドは 通るけどデータの受け渡しが出来ないので…。
119 :
42=69 :02/09/18 13:38 ID:g3HNafQf
まだ出来ません。。。
120 :
nobodyさん :02/09/18 14:00 ID:CaL1DwkZ
>>42 -values=>['M', 'F'],
で
%labels = (M => '男', F => '女', ) ;
じゃだめなの。
>>116 他のFTPクライアント(何でもいい)はその動かない環境で
PASVモードを使わないで接続できているのでしょうか?
データポートの問題には違いないけど。
123 :
nobodyさん :02/09/18 23:45 ID:z0adaCjs
&&と&、|と||の違いがよくわかりません。 if文で試してもどちらも同じような挙動をします。 &&、||は数値比較ということのようで、解説サイトで if(($a==2) && ($b==2)) というような例を見ましたが、($a==2)は数値を返すのでしょうか。 print (1==1); ###1を出力 print (1==2); ###なにも表示されず よくわかりません。よろしくお願いします。
124 :
116 :02/09/18 23:54 ID:hRbwuJFL
>121 netpro01.html読んできました。ということは Firewallの内側からftpする場合はpasv()する ということですね。なるほど。 >122 他のFTPソフトでも、その動かないFTPサイトにはpasvか否かを問わず 同じ状況(ログインできるけどnlstやput・getができない)です。 それもそれで困っているのですが。仕方なくtelnetでつないで1ファイル ずつftpしてます。 状況としては「クライアント→サーバはOK、サーバ→クライアントだと データポートが食い違っている」ということ? なのかな。
125 :
nobodyさん :02/09/19 00:25 ID:qg0OuaDd
文字列1,文字列2,数値1,文字列3,数値2 といったフォーマットのcsvファイルを読み出して、もし上下(下の行)の 文字列2と数値1が同じならば、別のcsvファイルに”上下”の 文字列1と当然ながら、同じ値の文字列2、数値1を出力するのはどうやればよいのでしょうか。 (csvファイルの入力、出力は大体分かっているつもりです。内部的な処理が分かりません) また、仮に上下の文字列2、数値1が合わない場合(行自体が奇数だったりした場合) 文字列3、数値2を上下で比べて同様の事をしたいのですがこの方法も分かりませぬ。 よろしくお願いします。
126 :
125 :02/09/19 00:29 ID:qg0OuaDd
補足: AAA1,ABC,123,DEF,456(改行) AAA2,ABC,123,DDD,444(改行) というcsvファイルがあったなら、別のcsvファイルに AAA1,AAA2,ABC,123 というのを出力したい、という意味です。 また、 AAA1,ABC,123,DDD,444(改行) AAA2,ADD,777,DDD,444(改行) ならば、同様に、別のcsvファイルに AAA1,AAA2,DDD,444 というのを出力したいということです。 よろしくお願いします。
>>123 &&と&、|と||が同じ挙動なんてことはない。
&&は左と右の条件が両方成り立ったとき真、
||は左と右の条件が少なくとも一つ成り立ったとき真。
真てのは1を返し、偽は0を返すから条件が成り立たなければ
上の論理演算子を評価したとき、1が出てきたり0が出てきた
りするのは当然。こいうのは戻り値という。
>>123 ×真てのは1を返し、偽は0を返すから条件が成り立たなければ
○真てのは1を返し、偽は0を返すから
>>125 -
>>126 こいうことかな?
while(<>){
chomp;
split /,/;
if ($o1 eq ($f1 = $_[1]) && $o2 == ($f2 = $_[2])) {
print "$o0,$_[0],$_[1],$_[2]\n";
} else {
print "$o0,$_[0],$_[3],$_[4]\n" unless $. == 1;
}
$o0 = $_[0];
$o1 = $f1;
$o2 = $f2;
}
131 :
nobodyさん :02/09/19 05:08 ID:Ab8J7aLw
>質問者へ あのよ、プログラムの質問なんだから無理に文章にしないで ・プログラム概略 プログラムの説明、使用目的など ・環境 OS、使用アプリ、関連アプリなど ・入力 データ入力の方法、データ形式など ・処理 プログラム内で行うデータ加工、計算、アルゴリズムなど ・出力 出力データ形式、出力先など ・問題点 不具合の説明 ・自分なりの解決法(試したもの) 自分で試した方法 ・ソース 問題となっているプログラムソース このくらいの箇条書きに整理して質問しろよ。書いてるうちに問題が解決する 場合もあるだろ。 どうも、解り辛い書き込みが多いよ。
>>123 if($a eq '1' && $b eq '1'){
print "$aと$bが1なので表示しました。";
}
if($a eq '1' || $b eq '1'){
print "$aか$bが1なので表示しました。";
}
こんな感じ。
133 :
nobodyさん :02/09/19 10:58 ID:IJ0KtDTA
$day = 3; $day = sprintf("%02d",$day); これを実行すると$dayが03になることはわかったのですが、 「%02d」の「2」は何を意味していますか?
>>123 ビット演算とか比較演算って知ってる?
解説書でも読めば必ず書いてあると思うんだが。
とりあえず出てきた演算子のperlでの分類と意味を書く。
・比較演算子
== 等しければ真、そうでなければ偽
・ビット演算子
| ビット演算した論理和(OR) (ex. 2|5 -> 7)
& ビット演算した論理積(AND)(ex. 2&5 -> 0)
・論理演算子
|| 真偽の論理和 (ex. 2||5 -> 2)
&& 真偽の論理積 (ex. 2&&5 -> 5)
ビット演算はその名の通りビットごとの演算がされる。
論理演算は、perlではundef,0,""以外は全て真なので
||なら最初の真の値、&&なら最後の真の値になると思って良い。
>>124 その状況でPASVが使えないならFTP接続は無理。
FW管理人と相談してね。
->はアロー演算子?というツッコミはなしでおながいします。。。
>>133 二桁の意味。
ちなみに%02dのそれぞれに意味がある。
% フォーマットを指定するよ宣言
0 隙間は0で埋めてね
2 2桁より少ないときにね
d 10進整数で表記してね
>>125-126 >>130 漏れはこう解釈したが
open O1, ">1.txt";
open O2, ">2.txt";
while(<>){
chomp;
split /,/;
if ($o[1] eq $_[1] && $o[2] == $_[2]) {
print O1 "$o[0],$_[0],$_[1],$_[2]\n";
} elsif ($o[3] eq $_[3] && $o[4] == $_[4]) {
print O2 "$o[0],$_[0],$_[3],$_[4]\n";
}
@o = @_;
}
>135 詳しい解説ありがとうございます。
>>128 さん、
>>132 さん、
>>134 さん、どうもありがとうございました。
>>134 さんの例で理解できました。
単に真偽を取り扱う場合は&&でも&でも同じということですね。
0&1 はビット比較で0=偽
0&&1 論理演算で0=偽
>>138 でも普通、真偽判定にビット演算子は使わない。
その文で何の処理をしているか読み下しにくくなるからね。
あとこういう場合、&& より and、|| より or を使う癖をつけとくと
後々幸せになれるかも知れない。数値として比較する時は
==、文字列として比較する時は eq、という区別もはっきり
させとくと尚良し。
$a = 0; $b = 1;
if ($a = 1 and $b == 1) {
print "$aと$bが1なので表示しました。";
}
$a = 0; $b = 0;
if ($a == 1 or $b = 1) {
print "$aか$bが1なので表示しました。";
}
>139 一応つっこんでおくと、下から3行目=が1個足りない。
上も足りてないみたいだね。 それで昔失敗したんだよなぁ。 懐かしい。
>>140 >>141 よく見よう。上の条件文は ($a = 1) && ($b == 1) と等価、
下の条件文は ($a == 1) || ($b = 1) と等価だ。
つまり代入の結果の値をそのまま条件に使っている。(w
&& と || は代入演算子より優先順位が高いが、
and と or は低いから括弧が不要。
>142 それだと、print文の内容が不自然なんだが?
144 :
518 :02/09/19 20:32 ID:???
ごめん、$ をエスケープするの忘れてたね。(w $a = 0; $b = 1; # $a = 1 で $a の値は 1 # ($a = 1) の式の値は 1 で真なので and の右の式も評価する。 # $b == 1 は真、両方真なので if ブロックに入る。 if ($a = 1 and $b == 1) { # 条件文を解釈した時点で $a = 1, $b = 1 print '$a と \$b が 1 なので表示しました。'; } $a = 0; $b = 0; # $a == 1 は偽なので or の右の式も評価する。 # $b = 1 で $b の値は 1 # ($b = 1) の式の値は 1 で真なので if ブロックに入る。 if ($a == 1 or $b = 1) { # 条件文を解釈した時点で $a = 0, $b = 1 print '$a か $b が 1 なので表示しました。'; }
145 :
nobodyさん :02/09/20 03:12 ID:tkLzuZ53
文字列の配列のソートとか、また単なる文字列比較とかするときに アスキー配列ではなくて日本語辞書(?)の並びで簡単に扱う方法はありませんか。 たとえば、 あアいイ〜かカがガきキぎ〜(空文字が最後) みたいな感じです。 普通にperlで並べたデータベースをexcelで編集して並べなおすと辻褄が 合わなくなってしまいます。 よろしくお願いします。
ADSLモデムの設定でIPフィルタ(擬似ファイアウォール)の 設定を一部解除したらFTPできるようになりますた。 ♪勉強に〜なりましたっ。
>>146 ご回答ありがとうございます。
僕も調べてみたんですが、見つかりませんでした。
自分で辞書順配列作ってやるしかないのかなあ。
やってみます。
>> 149 超素人なので、僕の作ったものは役立たずだと思いますw。 とりあえず比較だけで、&jcomp($a,$b)が1,0,-1を返す関数から初めてみます。
152 :
146 :02/09/20 16:34 ID:???
154 :
146 :02/09/20 17:53 ID:???
156 :
nobodyさん :02/09/20 19:00 ID:VWOOYV2p
Perlスクリプトの負荷軽減に関する質問です。 あるスクリプトの負荷軽減をしたいのです。 一般論として、 1.コメントを削除するのは軽減につながる? 2.処理はなるべくサブルーチン化するほうが負荷が軽減する? 3.サブルーチンは別ファイルにしてrequireするより、1ファイルにしたほうが負荷軽減になる? その他負荷軽減のセオリーなどあるのでしょうか。 ポインタなど教えていただければ幸いですm(_ _)m
1 - × 数十MBものコメントがあればまた別かもしれないけど。 2 - × ケースによって異なるけど、サブルーチンかすると付加は重くなる。 ただし不可の為だけにインラインかを進めるのはナンセンス。 3 - △ ケースによる。大量の「プログラム開始時には必要かどうか分からない処理」がある場合は別ファイル化したほうがいいこともある。 負荷軽減で重要なのは上記のような小細工よりもアルゴリズムだろうね。 あとはPerl以外の言語を使うとか。
あー、誤字・変換ミス多し。
配布系のCGI見て勉強した人にありがちな すべての処理を1つのCGIで済ませるタイプのプログラムだと 適当なとこでぶった切って適当なところでrequireするように するだけでずいぶん効率UPできると思われ...
Perlにも関数のオーバーヘッドの負荷云々ってあるの?
全部inlineで書いた場合のコンパイル時間にくらべたら たかがしれてるんでは・・・
requireって結構負荷高いと思ってたんだけど誤解?ファイルアクセスとか メモリとか… 実際に別けてベンチ取ると処理時間が倍近く遅くなるんだけど。 本当に滅多に使わないような部分(管理モードとか)ならともかく ファイルサイズが巨大にならない限りは極力別けないようにしてた。
>>162 関数化できる部分も展開した状態で書いた状態をさしてました。
>>163 それが本当だと
AutoSplitとAutoLoader使って書かれてる
CPANモジュールって多数ありますけど、
あえて効率悪くしてるのでしょうか?
>>163 に同意。
CPANのも「なんでこの程度でAutoLoader使ってるの?」ってモジュールばかりだよ。
すべての処理を1つのCGIで済ませるタイプの場合 1回の起動でよばれない部分が大半なきもするんですが... またCPANモジュールの場合、モジュールがモジュール呼んで って繰り返す場合がおおいので、AutoLoaderなかったら それこそ無駄なコンパイル、無駄なメモリがたっぷりなきがします #具体例もなしに不毛なきがしてきた...
いらない部分までコンパイルするのが無駄って理屈はわかる。 ただ、この場合は一つのファイルの一度のコンパイルで全てが終わるって事も わかる。 処理してからコンパイルするんじゃなくてコンパイルしてから 処理するんでしょ? って事はコンパイル後に外部を呼んだら外部もコンパイル、又は 全てを再コンパイルって事にはならんの?
requireは遷移して初めて読み込み/コンパイルが行われるはず... (useは最初によまれちゃいますけど...) むちゃくちゃ強引な例) if(1){ require "a.pl";#ここに遷移したとき初めてコンパイルされる }else{ require "b.pl";#つまりこっちはコンパイルされない } ちがいましたっけ?
もうちっとまともに書くと (AutoLoader簡易版の一例) sub AUTOLOAD {#定義されていない関数があると呼ばれる my $file = $AUTOLOAD; $file =~ s!::!/!g; if(eval{require "$file.pl";}){ die('ダメっぽい')if($AUTOLOAD{$file}); $AUTOLOAD{$file}=1; return &{$AUTOLOAD}(@_); } return undef; } とかしてあげると、ある関数が呼ばれたとき 初めて読み込んでコンパイルされ、 2回目以降は関数が存在するので AUTOLOADは呼ばれないって動きになるものだと... #突っ込まれるとなんか自身がなくなってしまう^^;
さあ、そろそろ誰か裁定を下してくれ。
if(1){ require "a.pl";#ここに遷移したとき初めてコンパイルされる }else{ require "b.pl";#つまりこっちはコンパイルされない } 動かなきゃそこに行くことは分からないんでしょ? 動くならそもそもコンパイルの必要が無いと思うんだけど。
172 :
171 :02/09/20 23:45 ID:???
呼ばれないのがコンパイルされないって事はわかってる。 ただ、コンパイル>requierがあった>コンパイルって二度手間に なるんじゃないかと言ってるわけで。
PerlではYO- コンパイルをYO- 2段階でやってるからYO- 2度手間にはならねーYO!
>>168 それはもちろんそう。というか、そうじゃなきゃAutoLoaderの実装に苦労するよ…
で、内部のpp_requireのコード読んでたら妙なことみっけ
#!perl -w
sub Loader::new{
return bless{}, $_[0];
}
sub Loader::INC{
my($self, $file) = @_;
print "ファイル $file が要求されました\n";
return "/path/to/$file.pm"; # フルパスを返す
}
@INC = (Loader->new());
require foo;
__END__
こんなの何処かに書いてあったっけ?
INC()の挙動が妙なんで実験機能かなぁ。
>>173 じゃ、分岐で外部を呼んだときは最低でも3段階になるって事?
>>175 だから、2段階だって。。。以下の動作わかる?
if (0){ use Hoge; }
>>176 Hogeから外部を呼んだらまた…って、ああそうか
Perlはインタプリタだったっけか。
ごめん勘違い。
もとの話からずいぶんずれてきた?^^; (ってじぶんのせいかな(汗)
179 :
156 :02/09/21 03:05 ID:mTosX4PH
なるほど。
勉強になります。
ちなみにわたしのスクリプトは書いてあるルーチンをか必ずすべて使うスクリプトなので
1-3すべて無意味っぽいですね。
アルゴリズム見直しかあ。手に負えなそうtt
奇特な方がソースみてくれるの期待して公開してるスクリプト晒しときます。
http://tokada.s19.xrea.com/ 今負荷率みてみたらあほみたいなアクセスは減ってるみたいで、
負荷も落ちついてるみたいですが。
しまった、危篤な人演じようと思ったら PCインストールしたばっかでtarとgz解凍できる ソフトがないΣ( ̄ロ ̄;)
181 :
156 :02/09/21 04:22 ID:???
>>181 180 じゃないけど、俺流で書き換えて遊んで(・∀・)イイ?
183 :
156 :02/09/21 04:42 ID:???
改変・再配布自由なのでどーぞー もしよければ、改変したものを公開していただけるとうれしいです。 勉強になるしw
ぱっと見の感想 1.不要なコード,極端なコメント,不要な変数、ループの削除 2.局所化されてない変数ありません?(不確か) 3.関数内での定数の宣言,requireの廃止 4.Random2ch.pl,linksFromHtml.plの統合 5.インデントの調整 すると、もちっとよさげかなぁ?とかおもいますが、 Socket周りをちゃんとするのはえらいと思う
(つづき) 毎回HTTPのリクエストしないで、 解析結果を保存しておいて、一定期間内のアクセスであれば 保存したデータを使うようにするだけで、 結構スピードアップしそう。 ネットワークの開くのって結構コスト高いっすよね? って感じかなぁ?
コレかわいくて気に入ってるんだけど^^; おやすみなさい。  ̄ ̄ ̄V  ̄ ̄ ̄ ̄ ̄ ̄ ̄ .∧∧ エビフリャー ,.、,(゚Д゚ ) /i ;'`;、. :,.:∪`゙:゙:`''':,'.´ -‐i '、;:.: .、.:',.: .:: _;.;. :.‐'゙゙~  ̄ `` U U
187 :
156 :02/09/21 06:53 ID:???
>>184 なるほど参考になります。
ソースを再検討してみます。
>>185 たしかにbbsmenu.htmlは"比較的"静的なので1日ごとの更新でもいいかもしれませんね。
subback.htmlはどうしよう。更新時間の匙かげんが難そう。
まあどちらも
ファイルがない||更新時間以前のファイルがある場合、HTTPリクエストしてlocalに保存する。
そうでない場合localのファイルに対して処理する。
ってかんじですかね。
>>186 おやすみなさい^^
GETの前にHEADで更新を確認したら?
189 :
156 :02/09/21 07:06 ID:???
>>188 なるほど。bbsmenu.htmlはそれでよさげ
190 :
182 :02/09/21 10:28 ID:???
みんないつねてるんだろ(汗 connectの回数減らさないと体感できる遅さの原因になりやすいので KEEP-ALIVEとかちゃんと使わないとまずそうですね。
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
193 :
156 :02/09/21 11:53 ID:???
>>190 。。。。。。。。。
すげーーーーー
あまりのエレガントさにびびりました。
わたしの元ソースと比べるべくもないですな。
ハハハハハハハハ
めちゃくちゃ示唆に富んでるソースだし。。。。
ただ私のPerlへの理解度が追いついてない部分があるので、ラクダ本と突き合わせながらじっくり読ませてもらいます。
ここに質問してよかったです。
ありがとー
#こんな時に明日からしばらく出かけなくちゃいけないtt
#どっぷり漬かりたいのにtt
194 :
156 :02/09/21 12:02 ID:mTosX4PH
>>192 おはよーございますw
KEEP-ALIVEですか。ほうほう。
はじめて聞きます(汗
字面からは、一度ソケットひらいて通信してそのまま次の通信をするって感じとか想像するんですが、
大外ししてるかな。。。。
資料あさりたいですが、後日ってことになりそうです。
すみませんtt
195 :
nobodyさん :02/09/21 12:57 ID:/+fRFKXb
jcode.plを用いてテキストファイル(EUC)をsjisに置き換える物をつくったんですが 正しく動きません。見てもらえませんでしょうか・・・ require "./jcode.pl"; open(IN, "aaa.txt"); $xxx = <IN>; close(IN); &jcode'convert($xxx,'sjis'); open (FILEOUT, ">aaa.txt"); print FILEOUT $xxx; close (FILEOUT);
*xxx or \$xxx
197 :
195 :02/09/21 13:40 ID:/+fRFKXb
自己解決?
ほえー、こんなスレあったんだァ。。。。 ぼく小学生だけとPerlのことはなんでも聞いてよ!
54 名前:3PIO ◆3pIoOHKo :02/09/13 22:21 ID:???
俺のサイトは全てCGIを経由しないと表示できないようにしてる
リモホしだいでどんなページにでもジャンプさせてるぞ
56 名前:Name_Not_Found :02/09/14 12:20 ID:???
>>54 鯖のことを少しは考えてやれ・・・
自分の鯖なら別にいいが。
57 名前:3PIO ◆3pIoOHKo :02/09/15 21:39 ID:???
>>56 トップページの表示にかなり時間がかかる
苦情が鯖の管理人からきたらどうにかする
で、質問は?
202 :
nobodyさん :02/09/21 15:22 ID:acWgwkOR
質問なんですが、 とりあえず初心者本読んでperlをちょっと勉強したんですが、 Web上でよくみる掲示板のソースを見ると もう何がナンだか分からなくなって、 でももっと勉強すれば理解できるようになりますか? 才能とか関係ないっすよね?
>202 才能は必要。 努力しつづけるという才能が。 途中で諦め、投げ捨てるような人には無理。 要は根気だ。 俺は根気があるのは才能だと思ってる。
204 :
b :02/09/21 15:31 ID:ererLzW2
>>202 が見ているのがHTMLのソースとかだったら爆尿
207 :
nobodyさん :02/09/21 18:19 ID:0Otbw0Zc
ば! く! にょ! ウウウウウウゥゥ!
ザバーーーーーーー
Perl/CGIのソースと 右クリックの「ソースの表示」は違うぞ というか基本的なHTMLの知識があればそれぐらいわかるだろ
211 :
202 :02/09/21 18:41 ID:/+fRFKXb
根気は無いですが、男根ならあります。 だめでしょうか?
212 :
nobodyさん :02/09/21 18:44 ID:f7+ObQJd
01,田代,まさし,40歳, 02,田代,花子,40歳, 03,泉,まさし,40歳, 04,泉,ピン子,60歳, 05,泉,茂千代,118歳, 06,… 07,…続く 例えば上記のようなデータから 田代に該当 2 泉に該当 3 … まさし 2 花子 1 ピン子 1 茂千代 1 … 40歳 3 60歳 1 118歳 1 … というふうに列の重複数をすべて書き出したいんです。 どしたらいいでしょうか?
213 :
nobodyさん :02/09/21 19:33 ID:acWgwkOR
なんか俺の偽者がいっぱいいるなぁ ソースはちゃんとダウンロードしたCGIファイルを見てるよ
>>212 乱暴なやり方。
my @data = qw(
01,田代,まさし,40歳,
02,田代,花子,40歳,
03,泉,まさし,40歳,
04,泉,ピン子,60歳,
05,泉,茂千代,118歳,
);
my %count;
foreach (@data) {
foreach (split /,/) {
$count{$_}++;
}
}
foreach (sort keys %count) {
print($_, 'に該当 ', $count{$_}, "\n");
}
>>214 ありがとうございます。動きました!
別ファイルにデータを置いてるので、
$data='data.txt';
open(IN,"$data");
@data = <IN>;
close(IN);
として大丈夫でした。
あつかましくも追加で…上記データで言うと名字の部分と年齢の部分というふうに
特定の列のみ抽出することは出来るでしょうか?
>215 できる。 どうやればできると思う?
217 :
nobodyさん :02/09/21 21:37 ID:f7+ObQJd
>217
>>214 さんが示している例がどうして動くのか、理解しましょう。
そうするとどこが問題点か解るはずです。
まず、その問題点を探してみて下さい。
ヽ(´▽`)ノ while(<IN>){ chomp; my @data = split(/,/); push(@{$count{$data[$IDX]}},\@data); } for(sort keys %count){ printf("%sに該当%d\n",$_,scalar @{$count{$_}}); }
GyRCJCokXiQoJGkySyRAJEohKhsoQg
221 :
nobodyさん :02/09/22 00:49 ID:bAgDqIKf
ユーザー名とパスワード認証後、各ユーザー”別”のデータをcsvから読み出すにはどうしたら 良いのでしょうか。 イメージとしてはYahooや、ポイント制のあるEコマースサイトの様な機能なんですが。 もう少し具体的に書きますと、 ・ユーザーID,パスワード,ポイント 以下同じ構文のcsv みたいなcsvファイルを使って ・そのcsvに記載されてあるID,パス認証 ・認証後、”同じ列”にあるポイントの表示 というような事はどうすればよいのでしょうか。 よろしくお願いします。
>>221 やる手順は解っているわけだから、実際にやってみてどの部分でつまづいてるの?
223 :
nobodyさん :02/09/22 01:16 ID:bAgDqIKf
>>222 さん
初歩的なID,パスワード認証
(csvを読み込んで、変数に格納、それとFORMの数値を見比べてイコールなら移動)
まではわかるのですが、
その後のcsvから、ポイントの取り出しが分かりません。
縦の関係は分かっても、横の関係が分からない、というか何というか。
よろしくお願いします。
>>223 splitっていうか、分割できないでIDどう取るわけ?
すっげー非効率なことしてる気がしてきた。
まぁCSV落とされないようにね。
IDとパスは暗号化しておいて欲しいな。
226 :
222 :02/09/22 01:55 ID:???
認証後のポイントの取り出し方は、シュウォーツ変換を利用して ユーザIDを比較して取り出せば? ($point)= map{ $_->[0] eq 'id' ? $_->[2] : () }map{ chop, [split(/,/, $_, 3)]} <DATA>;
227 :
222 :02/09/22 02:09 ID:???
チョット修正 my $point; ($point)=map{ $_->[0] eq 'id' ? $_->[2] : () }map{ $point?last:chop, [split(/,/, $_, 3)]} <DATA>;
228 :
nobodyさん :02/09/22 12:03 ID:dGvJOxY3
IDパスワードを暗号化しないとどうなるの?
IDのほうは暗号化しなくてもいいんじゃねー?
cpan.jpというドメインを取得したのですが なんか使い道ないかなぁ。。。 CPANミラーする程度しかおもいつかなくて、、、 (すれ違い?)
231 :
nobodyさん :02/09/22 16:28 ID:Fc82peeX
お
いるよな、こういう「ドメイン取ったぜ!使い道ないけど」厨房
JPAH隊長!PPMサーバーが撃沈してます!
Perlネットゲームの管理人の発言です。 かずあき(1001) > いや、アップロードしたプログラムは実行効率上げるためにコメント行を全てカットしてあるから、正直なにが書いてあるかウチ本 人にもわかんないのよ (9/22(日)20:06 ) 実行効率上がるんですか?変わらない気がするんですけど。
#がある行は読み込んでから、無視される。
>234 ナノ秒単位でなら上がるかも。
237 :
nobodyさん :02/09/22 21:21 ID:dGvJOxY3
ただCGIを動かす物を作りたいんですが、 <img src="xx.cgi">で起動させた後、空白を表示させる方法が分かりません。 ヒントをください
>>237 xxx.cgi
print "text/html\n\n";
print " ";
>237 なんかいかにも「こっそりIP抜きたい」っていうやり方だね・・・。
240 :
237 :02/09/22 22:37 ID:dGvJOxY3
>>238 CGIの方に(xxx.cgi)
print "text/html\n\n";
print " ";
htmlの方に
<img src="xxx.cgi">
と書いてもCGIは実行されるのですが、html側は□に×(画像が表示できない状態)
になってしまいます。なんでしょうか?
>>239 違いますよ
>240 イマイチ信用できないな。 でも、まぁ、ヒントだけ。 ・1*1の透過GIF ・バイナリモード
>>240 えっ、ホントにやったの?
あなたhtmlをちゃんと理解してます?
画像ファイルを入れなきゃ画像は表示されませんYo
<a href="xxx.cgi">
<img src="nantoka.gif">
</a>
単純に1x1の画像にlocationでいいんじゃないの?
244 :
237 :02/09/22 22:52 ID:dGvJOxY3
print "Content-type: image/gif\n\n"; print `/bin/cat space.gif`; で解決しました。が/bin/catの意味が分かりません。 どんな意味をもってるんですか?
245 :
nobodyさん :02/09/22 23:05 ID:aEiiJGxo
ど初心者です。 HTMLで書いてから printとか付けたしてったら エラーでまくりです。 とりあえず「"」の前にはちゃんと「\」を書いてますが それ以外にも「\」を書かないといけない文字ってありますか?
>245 山のように。
248 :
nobodyさん :02/09/22 23:12 ID:aEiiJGxo
>>246 マジですか?
出来ればよく使うタグで\をしなきゃいけない文字教えて下さい。
249 :
nobodyさん :02/09/22 23:29 ID:Ao5uw2aw
aというサブルーチンを100回動かすとして同時に3個動かすにはどうしたらいいんでしょうか? 1個終われば次の1個がはじまって。。。 と、言う内容で。
250 :
nobodyさん :02/09/22 23:42 ID:aEiiJGxo
>>247 正規表現スレ見たけど、何がなんだか全然分からん。
教えて。
>>249 マシン上に、少なくとも3つはCPUが必要でしょう
252 :
nobodyさん :02/09/23 00:00 ID:Igutub/E
>>251 forkとやらの関数でaが一度に多数流れるのは見たんですが多すぎて逆に遅くなってしまいます。
んで、3個ぐらいに制限したいなと・・・
>>248 とりあえず、すべての文字に\つけとけば安心だ。
>>248 print "<a href="a.html">表示<a>"; #エラー
print \"<a href=\"a.html\">表示<a>\"; #エラー
print "<a href=\"a.html\">表示<a>" #エラー
print "<a href=\"a.html\">表示<a>"; #エラーじゃないけどSJISだと文字化け
print "<a href=\"a.html\">表\示<a>"; #OK
print "<a href=\"mailto:
[email protected] \">メアド<a>"; #エラー
print "<a href=\"mailto:meidohuku\@moemoe.ne.jp\">メアド<a>"; #OK
>>232 厨でもなんでもいいけど、、、
面白い(興味を持てる)事したいだけなんだけどね。
(すれ違いってより、聞くとこ間違ったカナ)
面白いことでも何でも、すればぁ?
261 :
nobodyさん :02/09/23 04:59 ID:v/9sXn0J
よく local よりも my を使えとか言われるけど、 たとえば関数なんかで func{ local ($a,@b) = @_; } ってやる場合、my にできないよね? こういう場合って、local でやるしかないかな〜、、 配列とか引き渡す場合、どうやってる?
262 :
nobodyさん :02/09/23 05:06 ID:v/9sXn0J
ごめん、素で間違えた。 func{ local ($a,*b) = @_; print "変数の中身は→$a\n"; print "配列の最初の要素は→$b[0]\n"; } たとえば、こう言う風に使うとき @a = (1,2,3,4,5); &func('オマエモナー',*a);
263 :
nobodyさん :02/09/23 05:10 ID:v/9sXn0J
連カキスマソ
>>262 の例で、
my $a = 'あほか?';
my @b = (1,2,3,4,5);
&func($a,*b);
で実行するとエラー出るよね??
my $a = 'あほか?';
local @b = (1,2,3,4,5);
&func($a,*b);
だったら、OKでした。なんか my と local が同じソース内に、ごっちゃになってるのが
気に入らないので、結局
local $a = 'あほか?';
local @b = (1,2,3,4,5);
&func($a,*b);
と、local で統一することに、、、でも、周りからは my 使えと、、、
>>261-263 my $a = 'あほか?';
my @b = (1,2,3,4,5);
&func($a,\@b);
func{
my($a,$b) = @_;
print "変数の中身は→$a\n";
print "配列の最初の要素は→$$b[0]\n";
}
my $a = 'あほか?'; my @b = (1,2,3,4,5); &func($a,\@b); sub func{ my($a,$b) = @_; print "変数の中身は→$a\n"; print "配列の最初の要素は→$b->[0]\n"; }
>>261-263 答えは既に出ているから、
あなたが勉強するべきキーワードを挙げておくね。
・型グロブ
・my と local の違い
・リファレンス
268 :
nobodyさん :02/09/23 09:10 ID:lfiSBGtK
質問がありますのでどなたか教えて戴けると嬉しいです。 掲示板のような形のcgiで、フォーム入力で受け取った半角数字(1とか5とか)を数値として扱って、それを計算に使いたいのですが、そのままだとログ部分が空白になってしまったんです。 たとえば、 名前<INPUT TYPE="text" NAME="name" SIZE=25> 年齢<INPUT TYPE="text" NAME="tosi" SIZE=25> こういうフォームに入力してもらい、名前・nobody 年齢・18才と入れると「nobodyさんの50年後は68才です!」と表示したいんです。 それで、「$abc = $tosi + 50;」としてみたのですが、その部分のログが空白になってしまうだけでした。 どうすれば、フォームから受け取った数字で計算出来るのでしょうか? 計算が間違っていないかは、 #!/usr/bin/perl print "Content-type: text/html\n\n"; $tosi = 18; $abc = $tosi + 50; print "$nameさんの50年後は$abc才です!\n"; exit; というだけので試して、間違っていないと確認しました。 名前は通常通り記入出来るのですが、年だけ空白の状態です。 どうすれば良いのか教えて下さい。
>268 きっちり出るが。
>>269 え。出ます?あれ、どうしてだろ。
$abc = $tosi + 50;
をいれるところはどこでも良いんでしょうか?
>270 常識的な範囲なら。 #!/usr/bin/perl より前に書いたりとかexit;より後ろに書いたらもちろん無理だが。
>>270 require "cgi-lib.pl";
# require "jcode.pl";
&ReadParse;
$tosi = $in{"tosi"};
してんでしょね。
>>272 仮に$tosiが空だとしても+の数値が入るはずだが…
プログラムの流れを読み間違えて$abc = $tosi + 50;をやる前に $abcを使ってるとか。 $abcを出す直前に計算させてもダメ?
>>271 ん、それは大丈夫でした。けど、でもやっぱりだめなんです。
どうしてなんでしょう…。ログファイルに書き込めてないのでしょうか。
えと、もうちょっと考えてみます。簡単な筈なんですよね?
>>272 あっ、すいません。今気がつきました。
自分で1から組んでるやつじゃなくてですね、インサイドウェブさんのX-BBS Lineをちょっとだけ弄ったんです。
ですから、plとか全然使ってないみたいなんです。もしかしてそこがダメだったんですか?
>>273 それが入らないんです。もしかしたら
>>272 さんの仰る
$tosi = $in{"tosi"};をしてないからなんでしょうか?
>>274 はい、$abcは計算と、最後の表示にしか使っていないのです。
それで計算もちゃんと表示する前にしているのですが…。
改造でやってるなら改造スレへ・・・と言いたいが、変数のスコープが届いてないという可能性を一応言ってみる。
>>277 改造…依頼じゃないような気がしたので。申し訳ございません。
アドバイス有り難うございました。
取り敢えず楽しようとしないで自分で1からやってみます。
>>276 0 + 50 はいくつ?
$abcを計算の後に使ってるなら空って事はないだろ。
その動作じゃ通らないブロックの中で計算してるとかじゃないか?
あと、フォームから送られたデータは勝手には変数に入らないよ。
入れる処理を自分で追加しないと。
どなたか教えて下さい。
掲示板で投稿された "
http:// 〜"で始まるURLに自動リンクを貼りたいのですが、
その際に、リンクして行った人を数えるため、link.cgiにurlを渡してリンクさせ
ようと思ったのですが、
$message =~ s/([^=^\"]|^)(http\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+]+)/$1<a href=\"$2\">$2</a>/g;
$url = $2;
$url_ec = $2;
$url_ec =~ s/(\W)/'%'.unpack("H2", $1)/ego;
$url_ec =~ tr/ /+/;
$message =~ s/<a\ href=\"\Q$url\E\"/<a href=\"link.cgi?url=$url_ec\"/g;
このように書くと、最後だけがlink.cgi呼び出しになって、
それ以前のものは、通常にリンクされてしまいます。
link.cgiにエンコードしたurlを完全に渡す方法を教えて下さい。
>>280 $message =~ s/([^=^\"]|^)(http\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+]+)/$1<a href=\"$2\">$2</a>/g;
がめちゃくちゃだよ。
正規表現道場で鍛えた方がいい。
>>279 $tosi = $in{"tosi"};
が、データを変数に入れるって事ですよね?
ですがこれはjcode.plを使った時だけとかじゃ…ないのでしょうか。
このもともとのcgiにも使われていないんです。
>282 じゃあそのスクリプトはどうやって入力データを変数に格納してるんだ?
>>282 jcode.plはコメントにしてるだろうが。
変数を取り込んでるのは、cgi.plだあよ。
最近のは、use CGI;とかじゃねの。
286 :
280 :02/09/23 12:32 ID:???
>>281 正規表現道場で少し勉強して来ました。URLの正規表現は変えようと思います。
>>283 ありがとうございます。
でも、それだとURLエンコードが出来ないので困っています。
link.cgiに渡すURLは、エンコード済みのものにしたいのですが。
>>286 正規表現道場2chで待ってたけどこなかったじゃん。
urlに日本語なんか入ってねだろ。
288 :
280 :02/09/23 12:55 ID:???
>>288 エンコード云々の問題じゃないでしょ。
&もメタ文字だからエスケープすれ。
>>283 さんのじゃだめなんか?
その後、&link.cgi(metaquote($message))じゃだめなんか?
$tai=なんかしたい文字列 m/\Q$tai\E/
291 :
nobodyさん :02/09/23 13:34 ID:pjFAvyv+
httpドキュメントを取得するための関数をつくりました。 1度目の呼び出しはうまくいくのですが、2度目以降は 「現在処理中の操作です」というメッセージが出て ソケットの育成ができません。なぜなんでしょうか? 関数の一部を抜粋 $socket = IO::Socket::INET->new( PeerAddr => $host, PeerPort => $port, Timeout => '30' ); # 以下が実行されてしまい「現在実行中の操作です」と表示される。 unless ($socket) { print "socket: $!"; }
>>291 close($socket);
でしょうか
293 :
291 :02/09/23 14:42 ID:pjFAvyv+
>>292 関数の最後にclose($socket);と書いてみると
今度は、以下のようなエラーメッセージが出ました。
やはり2度目のソケット育成に失敗しているみたいです。
Can't use an undefined value as a symbol reference at ./test.pl line 185, <FILE> line 35.
socket: 現在処理中の操作です
コード抜粋
181:unless ($socket) {
182: print "socket: $!";
183:}
184:
185:print $socket "GET $url HTTP/1.1\n";
186:print $socket "Host: $host\n";
187:print $socket "Connection: close\n\n";
294 :
282 :02/09/23 15:06 ID:???
書き込めない…?
>>295 スマソ書き込めた。
>>294 > $nini = $comment + 50;#ここに、年齢の式を書いてみました。
の位置が違う。
>>294 そのスクリプト、セキュリティ上問題があるから、
おすすめしない。
>>297 私は、
>>294 さんではないんですが、
cgi.libもCGI.pmも何も使わずにユーザーの入力を直接受け取る
っていうのは、初めて見たのですが、結構多いんでしょうか。
foreach $data(@data){ 処理 } という文で、例えば@data[0]を処理している場合にのみ別の処理に分岐させるには どうしたらいいでしょうか? つまり、@dataのなかの今何行目をあつかっているのかを得たいのですが・・。 if(@data[0]){&print;} とやってもうまくいきませんでした。
300 :
297 :02/09/23 17:07 ID:???
301 :
299 :02/09/23 17:10 ID:???
処理の中に$a++;とかやって数えていくしかないのでしょうか? なんかスマートな方法がありそうなんですが・・
302 :
297 :02/09/23 17:12 ID:???
>>301 $x_x=@data;
for($i=0;$i<=$x_x;$i++){
if($i eq 0){
&別の処理{};
print $date[$i];
}else{
print $date[$i];
}
↑適当
304 :
294 :02/09/23 17:34 ID:???
>>296 >>297 ありがとうございました。そうですか、問題があるのなら使用を諦めようと思います。
やはり自分で最初からもう一度頑張ってみますね。
取り敢えず入門書でも買って来よう…
>>300 ,
>>302 Oh, thanks.
日本語訳まずいね。最初のとこだけでも、原文では、
「POSTのCONTENT_LENGTHと同じバイト数をSTDINから盲目的に
読むプログラムやGETのデコードでQUERY_STRINGをひっつかむプログラム
」って書いてあるのに、和訳では、
「$ENV{CONTENT_LENGTH} や$ENV{QUERY_STRING}を含んだプログラム」
ってなってるよ。他にもいっぱい誤訳あるけど・・・
308 :
306 :02/09/23 17:42 ID:???
>>305 だから
>>300 読むといいよ。そこには、うまく動かないこともあるって
書いてあるけど、あのスクリプトは、その上、受け取った変数、
例えば、$commentをそのまま検証しないでif文に入れてるから、
exec文でも書いてあったらやばいんじゃないかってことだと。
309 :
306 :02/09/23 17:44 ID:???
310 :
297 :02/09/23 17:45 ID:???
311 :
306 :02/09/23 17:54 ID:???
>>310 あらよ、thanks again!
訳者にはスマソ。
リファレンスのことで少々不安な点があります。 ハッシュデータをサブルーチンへ渡そうと思うのですが、 %DAT = ( "2by4" => "8", "4by8" => "32"); &D_write(\%DAT); sub D_write { my($data) = $_[0]; print"これがデータ : $$data{'2by4'}"; return 1; } まず"\%DAT"でリファレンスを渡しますが、その受け取りが普通の変数なのは"メモリの番地自体"を収めているから という認識で良いのでしょうか? また、さらにその値自体を参照したいときは1次参照なので$を1つだけ加えて"$$"になるという考え方でよいのでしょうか?
>>312 $aは${a}って書けるのはわかるよね?
なら $$data{'2by4'} は ${$data}{'2by4'} ってなるのもわかるよね?
なら %$data (%{$data}) ってなるのもわかるよね?
そゆこと。
314 :
299 :02/09/23 20:28 ID:???
&make;
sub make{
foreach $data(@file){
$_=split(/,/,$data);
&print;
$a++;
if($a eq 10){last;}
}
}
sub print{
$list=<<"_HTML_";
$list
$_[1]$_[2]$_[3]
_HTML_
}
299です。
>>303 さんレスありがとうございます。
勉強中の身でもうひとつ…
上記の例で、CSVデータから頭10件を取り出して表示したいのですが、
foreachで強制的に10件カウントしたら終わらせているのですが
こうじゃなくて普通にforあるいはwhileで書いたらどうなりますか?
@fileから取り出す記述が分からないです。
また速度は変わりますか?
どうも適当にかじってるので基本的なものが出来てないです。
315 :
306 :02/09/23 20:35 ID:???
>>314 @fileから最初の10要素を取り出す:
for $i (0 .. 9) {
print $file[$i], "\n";
}
316 :
nobodyさん :02/09/23 20:49 ID:iHNT8XWd
質問です。 フォームに入力した文字が半角じゃないといけない所が全角だったり、 入力する数がおかしかったりする時に 間違ってますよと表示するにはどうすればいいですか?
317 :
さやか :02/09/23 21:07 ID:UR9fVmIX
http://dream.lib.net/room/cgi/e_ps.html これのps_user.cgiだと思うんですが588行あたりが
たぶんネックです。
さやかは、後から登録した奴は下に表示したいんです
検索エンジンって、フリーでもらえる奴はみんな
後から登録されたサイトが上に出るじゃないですか
それを逆にしたいんです。
難しいです。こんな質問してるさやかは嫌いですか?
私体も弱いんです。男の人も怖いし。優しい人いないかな?
ちなみに男って言われました。文章が男っぽいのかな?
私の周りにはくわしい人いません。男の人ならくわしい人いそうですが
男の人さやか苦手です。女子高生です!←男の人ってこうかくと
優しくなるらしいですね。うそじゃないですよ。
>>316 それだけの説明では、こう答えるしかない。
$入力された文字列 =~ /半角を表す正規表現/ or &間違ってますよと表示
$入力された数字 =~ /数字以外を表す正規表現/ or &間違ってますよと表示
それぞれの正規表現は頑張って調べてね。
>>317 質問者が誰かなんてどうでもいいんだよ。
なんで人を小馬鹿にしたような質問の仕方するかなぁ。
優しい人?そんな聞き方されて喜んで答える奴はタダのスケベだろ。
つーかそんな聞き方されたら答える気無くなるつーの。
答えが欲しけりゃ
普 通 に 聞 け 。
>>317 セクースさせてくれるなら今から行って手とり足とり答えてあげますが何か
321 :
さやか :02/09/23 21:42 ID:UR9fVmIX
質問の仕方は悪かったです。
でも、さやかにはくわしい人いないの・・・。
迷惑だったですよね・・・。
すいません。一から勉強します。
>>320 ショックです。
そんな酷い事いわれると。
>>316 SJISならこんな感じかな
if(length($in{kana}) > $kana_max ||
length($in{eigo}) > $eigo_max ||
length($in{suuji}) > $suuji_max){error('文字多いよ');}
if($in{kana} =~ /[^\x20\xa7-\xdd]/i){error('半角カナで入れてね');}
if($in{eigo} =~ /[^\x20a-z]/i){error('半角英字で入れてね');}
if($in{suuji} =~ /[^\x20\d]/){error('半角数字で入れてね');}
>>321 ここは匿名掲示板だからね
相手の概要はわからないほうが色々と都合が良いのよ
むしろ余計な情報は邪魔
>>317 > ps_user.cgiだと思うんですが588行あたりがたぶんネックです。
そう考えた理由を説明できる?
325 :
さやか :02/09/23 21:56 ID:UR9fVmIX
>>323 登録するときにlinkdata.dat に書き込みますよね
seek(ファイルハンドル,0,0)
これを0→2にしてもだめだったです。
たぶんこれが悪の正体です↓
while(<IO>){
if (index($_,">$siteyrl<")!=-1){
@y2=split(//<>/,$_);
close(IO);
とにかくこの辺がキーだと思います。苦しい。
326 :
さやか :02/09/23 22:06 ID:UR9fVmIX
>>324 さん、そちらに行ってみます。
なんかロールプレイングみたい!
>>322 > if($in{suuji} =~ /[^\x20\d]/){error('半角数字で入れてね');}
理解して参考にする人はいいが、丸写しする人は困るよな。
$n = '2' . "\x20" . '3';
print $n . "\n";
print $n + 0;
相手が出していない条件を黙って付け加えるのは危険だよ。
>>318 きみは or の使い方をもっと勉強したほうがいいよ
329 :
318 :02/09/23 23:58 ID:???
ごめん、素で間違えた。 半角→半角以外 or→andだね。
人の書いたソースを見て思ったのですが ファイルを読み込み・書き込みする場合、 +<、+>の入出力両用をあまり使用しないのは何故でしょうか?
もうひとつ ファイルサイズを求める場合 $size1=(stat( $filename))[7];#statを用いて $size2=(-s $filename)#ファイルテスト演算子 それぞれの違い・利点は何でしょう?
>>330 意外と(存在|使い方)を知らない人が多いから。
…じゃ、答にならない?
使える場面では気にせず使えばいいよ。
>>331 # stat の返す 13 要素から成るリストを作り、その 8 番目の要素を得る
$size1 = ( stat $filename )[7];
# ファイルサイズのみスカラー値として得る
$size2 = -s $filename;
perl のソース確認したワケじゃないけど、内部的には大差ない気が。
でもたった一つの要素の為にリスト吐かせるのはバカらしいと思う。
「8 番目」よりは「-s」の方が、パっと見で分かりやすいし。
>>330 作業を終えるまでオンメモリで行ける小規模なものなら+<は使うが
巨大なログをテンポラリに小出ししながら記録していく場合は
ログへの直書きは必要無いので普通に読みテンポラリに普通に書く。
331は速度的にはどっちも似たようなもんだね。
statは他の情報も取れるし一度使えば後で何度でも結果が
使いまわせるのでタイプが面倒じゃないならstatのが
良いかも。
334 :
294 :02/09/24 08:49 ID:???
質問です。 jcode.plとcgi-lib.plを使って自分で最初からしたら割と出来たような気がするのですが、また何か失敗してしまったようなのです。 $name = $in{'name'}; $a1 = $in{'a1'}; $a2 = $in{'a2'}; $a3 = $in{'a3'}; 〜〜〜以下続く $a15 = $in{'a15'}; $b1 = $a1 * 3; $b2 = $a2 * 6; $b3 = $a3 * 5; $b4 = $a4 * 3; $b5 = $a5 * 3; $c = $b1 + $b2 + $b3 + $b4 + $b5; $b6 = $a6 * 3; 〜〜(略) $b10 = $a10 * 3; $d = $b6 + $b7 + $b8 + $b9 + $b10; (もう一度繰り返して15まで終わらせて、最後の式を$eにします) $f = $c + $d + $e として、 print "$name … $c : $d : $e : 「$f」\n"; と示すと、「1、2、3、4、5、1、2、………5」と入力したとすると 名前 … 57 :=@:=@: 「156」 と示されてしまうのです。 ログを見てみると、<>57<>45<>54<>156<>となっていて、同じ数字を入力して同じ計算をしても違う数字になっていて…。一番最初のはあっているのですが。計算の仕方を間違えてしまっているのでしょうか?
>>334 表示が乱れるのは、変数の直前に全角スペースがあるから。
336 :
334 :02/09/24 12:18 ID:???
>>335 ありがとうございます!急いで修正します。
…では、計算がおかしいのはどうしてでしょうか。
<>57<>57<>57<>171<>にならないとおかしい筈なのですが…。
337 :
nobodyさん :02/09/24 13:59 ID:aoR+W3Ks
テキストファイルにCSV形式で **,***,***,***,**,*** **,***,***,***,**,*** **,***,***,***,**,*** とデータ(データは動的)が入っています。 これを配列data[][] にいれるのどうしたらいいのでしょうか? すいません教えてください。 だれかやさしい人お願いします
open(FILE,$file); while(<>){ @date=split(/,/,$_); }
339 :
訂正 :02/09/24 14:30 ID:???
open(FILE,$file); while(<FILE>){ @date=split(/,/,$_); }
>>337 答えないのはやさしくない人ですか?
最悪な聞き方…
漏れはやさしくないから答だけ書く (w my @data; open F, $csv; while (<F>) { chomp; $data[$. - 1] = [ split /,/ ]; }
「だれかやさしい人お願いします」は余計では^^; (ここ数日変な質問のしかたする人が目立つ気がする) open(CSV,$filename); my@data=map{chomp;[split/,/]}<CSV>; close(CSV);
343 :
nobodyさん :02/09/24 14:59 ID:4thlbHdp
つい最近、「すぐわかるPerl」でPerlを勉強し始めたものですが、 # findpattern while (<STDIN>) { if (/Jackson$/) { print; } } findpattern < people.txt と、本のとおりにやって、Jacksonで終わるデータだけを出力したいのに、 何も出力せずに終わってしまいます。 いろいろ試してみましたが、文字列の末尾にマッチさせる$のときだけ うまくいかないようです。 原因がわかりません。 どこがおかしいんでしょうか?
>>343 文字列の末尾にある改行を取り除いてない。
レンタルサーバに設置した掲示板やチャットの実行速度を測る方法って どうすればいいんでしょうか。 ベンチマーク?で検索してもいまいちわからないもので..おながいします。
>>345 下の2行をスクリプトの2行目辺りに置いて
use Benchmark;
$start = new Benchmark;
下の3行をexitする直前にでも置いとけば?
$last = new Benchmark;
$bench = timediff($last,$start);
print timestr($bench);
347 :
nobodyさん :02/09/24 15:11 ID:4thlbHdp
>>344 while (<STDIN>) {
chomp;
if (/Jackson$/) {
print;
}
}
でしょうか?
ダメでした。
>>347 ああ、STDINか。POSTデータ?
while(<STDIN>){print "[$_]";}
一度こんな感じでどんな形でデータが入って来てるか見てみ。
>>343 テキストファイルの行末に \r (キャリッジリターン)
が付いていたりしない?
>>346 1 wallclock secs ( 0.10 usr + 0.01 sys = 0.11 CPU)
てなカンジのものがでてきますた
哀しいかな読みとれません
意味を教えていただけると幸いでつ
352 :
nobodyさん :02/09/24 15:43 ID:4thlbHdp
>>349 こんなかんじでした。
[Micheal Jackson
][Janet Jackson
][Joe Jackson
][Joni Mitchel
][Jackson 5
][Micheal Johnson
][Jon Anderson
][Sade
]
末尾に何かがあるみたいですが、
chomp;を入れると、"]"しか表示されませんでした。
>>350 キャリッジリターンとは改行コードのことでしょうか?
取り除く方法はchompでは間違ってますか?
上の結果を見ると、違うっぽいですがわかりません。
353 :
b :02/09/24 15:43 ID:PxGGzvM0
ちょっと質問が在るです。 %giko = ( "1" => "1gorula", "2" => "2dorula", "3" => "itteyosi"); %mona = ( "2" => "2cher"); この2つのハッシュから %abone = ( "1" => "1gorula", "2" => "2cher", "3" => "itteyosi"); を作ろうとしたら while (($key, $value) = each(%giko)) { if( defined($mona{"$key"}) ){ $giko{"$key"} = $mona{"$key"}; } } とかやるしかないんでしょうか? これだと %mona = ( "2" => "2cher", "4" => "sindeyosi"); のような形式に対応できないし、もっと簡潔な方法は無いかなと思うのですが・・・。
>>352 /Jackson\r$/ でマッチするなら、キャリッジリターン
が付いてる。Unix 上だよね?
>>355 ありがとうございます。
Cygwin 上でしたが、できました!
もし、よろしければ、\r について教えて下さい。
Unix 上では \n の変わりに \r を使うのでしょうか?
で、chomp は \n は取り除けても \r は無理ってことですか?
357 :
355 :02/09/24 16:13 ID:???
>>356 Unix 上なら普通 \r なんか使わない (\n しか使わない) ので、
問題は起きない。
DOS (Windows) 上だと、自動的に \r が入力から取り除かれるのかな?
Cygwin はよく分らない。
詳しい人の解説キボンヌ。
358 :
nobodyさん :02/09/24 16:19 ID:aoR+W3Ks
>>テキストファイルにCSV形式で >>**,***,***,***,**,*** >>**,***,***,***,**,*** >>**,***,***,***,**,*** >>とデータ(データは動的)が入っています。 >>これを配列data[][] >>にいれるのどうしたらいいのでしょうか if(!open IN,'< Q1.dat'){ print "オープンエラー"; } @list=<IN>;$row=0; foreach $rec(@list){ @data=split("/,/",$rec); for($j=0;$j<8;$j++){ $mondai[$i][$j]=$data[$j]; print "($i)(($j)$mondai[$i][$j]\n"; print "$mondai[$i][$j]\n"; } $row++; } これじゃだめなのですか? わかりません PERLの超初心者
>>354 %abone = (%giko, %mona);
>>358 TMTOWTDI (There's More Than One Way To Do It) .
362 :
356 :02/09/24 16:38 ID:???
>>360 とても参考になりました。
ありがとうございます。
364 :
354 :02/09/24 17:00 ID:???
>>359 おお美しい。凄い簡単に済ませますね。
ありがとうございました。
undef $a; undef $b; undef $x; これを1行にまとめられますか
$a = $b = $x = undef;
undef $a=$b=$c;じゃ駄目なんけ。
369 :
69 :02/09/24 23:32 ID:???
だめだ、CGI.pm使いこなせねぇ。
$titleを10文字で切り揃えたい、 最初から10文字無いものは後ろに空白で(10-title文字数)を入れて揃えるとして どうしたらいいのでしょうか? $title = substr($title,0,10); if(length($title) < 10){$title = sprintf(???????,$title)}; 多分こんな感じでしょうか? 御教授願います〜
$title= substr($title.' 'x10, 0, 10);
$x = 100; open ( IN, "$file" ) ; foreach ( 1 .. $x ) { $data = <IN>; print "$data\n" ; } close (IN) ; 1行づつデータを読み込み表示しているのですが、 たとえばこれだとデータのもともとの行数が100行以下ですと データが無い行は空白がprintされてしまいます。 データがある最後の行が終わったら読み込みをやめるには どうしたらいいのでしょうか?
374 :
373 :02/09/25 02:21 ID:???
とりあえず if ( $data ){ print "$data\n" ; } にすればいいのか
open ( IN, "$file" ) ; while(<IN>){ print; } close(IN);
open(IN, $file); while (<IN>){ print; last if $. == 100; }
100行までしか読み込まなくていいのか。
というか、>373て存在しない行まで読み込んでそうだけど 大丈夫なのか?
というか、
>>373 はwhileを知らなくて
まぁ100回くらい繰り返しときゃ大丈夫だろって事だったり
もしそうなら一番スマートなのは
open(IN, "$file");
print while (<IN>);
close(IN);
jcode.pl の h2z_euc って使えます? &jcode::h2z_ecu( \$str ); ってしてもスペースしか出ないんです。 &jcode::tr( \$str, '0-9A-Za-z', '0-9A-Za-z' ); は、ちゃんと置換してくれるんですけど。
381 :
380 :02/09/25 02:38 ID:???
>380 ecuはeucね。 ソースの中では間違ってない。
>>373 質問とは関係ないけどforeachは配列操作で回数指定ならforかと
どっちでも動くのを承知で使うにしてもやっぱforかと
>>379 print while (<IN>);
↓
print <IN>;
384 :
373 :02/09/25 02:48 ID:???
>>378 そうなんです。
>>375-379 よくわからないのは、openされた$fileから
何の変数に入れていることになるんですか?
print; はprint "$_"; ということですか?
>>384 >print; はprint "$_"; ということですか?
そう。
print; = print STDOUT "$_";
>>385 print;≠print STDOUT "$_";
print;=print STDOUT $_;
387 :
373 :02/09/25 02:55 ID:???
ということは、 while (<IN>); は while ($_ = <IN>); ですか?
突如人が居なくなる罠。
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
if (($a eq "xxx") or ($a eq "yyy")) { は if ($a eq "xxx" or "yyy") { と同じ意味?
>391 全然違う。
\⊂ というような記述があって、サブルーチンに飛んでいるのですが これは⊂と全く同じ意味なのでしょうか \の意味がわかりません
>>393 ⊂ は参照実体だから ⊂ になるよ
& を出したいときは、 & って書こう
my $bar = \&foo; と my $bar = \&foo(); は全然違うからなんとも。 前者はサブルーチンfooのリファレンスを取得して$barに代入。fooは呼ばない。 後者はサブルーチンfooを呼んでその戻り値のリファレンスを$barに代入。
>>386 STDOUTじゃなくてselectされてるハンドルだし
print;≠print STDOUT "$_";
print;≒print STDOUT $_;
print;=print $_;
じゃない?
>>397 そう。この場合は特に select されてないから
print;=print $_;=print STDOUT $_;
>>391 「if (($a eq "xxx") or ($a eq "yyy"))」は
$aの内容が「xxx」または「yyy」の時だけ真(true)だが
「if ($a eq "xxx" or "yyy")」は
「yyy」の結果が必ず真(true)になるから常に真(true)になってしまう。
log1.dat log2.dat log3.dat ・ ・ ・ log100.dat という名前のファイル群を次々開いてすべての行を一個の配列にさせることって可能でしょうか? 自分でサブルーチンに挑戦してみたけどうまくいかなかった…
while
>>400 for(0 .. 100){
$hoge++;
open(IN,"log$hoge.dat");
$numo. = <IN>;
close (IN);
}
print "$numo";
CGIWrap Error: Script Execution Failed ------------------------------------------------------------------------ CGIWrap encountered an error while attempting to execute this script: Error Message: Exec format error Error Number: 8 This message usually indicates there is a problem with the script itself. The owner of the script needs to check the #! line for correctness. ↑こんなエラーが出てしまって一向にBBS設置できないんですが どーしてなんでしょうか?
$hoge = 'mona giko morara'; $piyo = ( $hoge =~ /mona/ ); #1 @foo = ( $hoge =~ /mona/ ); #2 @bar = ( $hoge =~ /(mona)/ ); #3 print $piyo @foo @bar; は、 1 1 mona なんですが、#1,#2 はマッチした数、@barはマッチした文字列が入る のですか? あと、配列の要素数は @foo や $#foo で分かりますが、 ハッシュの要素数はどうやって調べますか?
requireされたライブラリの中のサブルーチンはrequireしたプログラムに関係なくても 全部ロードされますか?
>>405 #1 はスカラーコンテキストで評価しているので、マッチしたかどうかが
真偽値 (1 か "") で返される。
#2 はリストコンテキストで評価し、且つパターン中にカッコが含まれない
ので、マッチした場合は (1) というリストが返される。
#3 はリストコンテキストで評価し、且つパターン中にカッコが含まれる
ので、カッコにマッチした部分から成るリスト値 (この場合は ("mona"))
が返される。
…と、駱駝本に全てハッキリ書いてある。
ハッシュの要素数は keys をスカラーコンテキストで評価。
$foo = keys %foo;
>>406 Yes.
>>406 requireしたプログラムに関係ないものははじめからrequireするなよ
ライブラリには使わないサブルーチンも入っているものだと思うのですが、 極論すると動作を早くするには呼び出すサブルーチンだけのファイルを作って requireするか、全部1つのファイルに書けってことになりますか?
>>409 動作を速くするためにそれをやっても大して改善しないと思う。
遅いならアルゴリズムを考え直したほうが。
質問です。 スカラー変数のデータをバイト単位で操作するにはどうすれば良いのでしょうか? 例えば$aのデータが16進で01 02 03 04 05 06 07 08 09の9バイトの場合に 0x03を0xddで置き換えたり、任意のバイトを削ったりということです。 substrを使って置き換えようとしたら、置き換え文字が10進数換算の文字列に なってしまい(0xdd なら"221"で0x32 0x32 0x31へ)上手くいきませんでした。
>>412 0xdd は数値リテラル、文字列リテラルは \xdd、という話ではなく?
415 :
412 :02/09/26 20:36 ID:???
>>413 、414
アドバイスどうもです。
やりたいことはバイナリエディタで見た場合次のように
変更したいということです。
スカラー値をファイルに書きだしてバイナリエディタで見ています。
変更前16進表示:01 02 03 04 05 06 07 08 09
↓
変更後16進表示:01 02 dd 04 05 06 07 08 09
\xddでsubstrすると、文字通り次のようになってしまいました。
01 02 5C 78 64 64 04 05 06 07 08 09
416 :
nobodyさん :02/09/26 21:02 ID:pOKoAU+F
■フォームで指定されたファイルをアップロードするcgiを作ろうとしているのですが ■ファイル名またはパス名に日本語を使用していると上手くアップロードできません。 ■半角アルファベットのみならアップロードできます。 --- 入力フォーム ここから------------ <FORM ACTION="./upload.cgi" method ="POST" ENCTYPE="multipart/form-data"> <INPUT TYPE="file" name="file_name" ><br> <input type="submit" name="upload" value="アップロード"> </FORM> --- 入力フォーム ここまで------------
417 :
416 :02/09/26 21:03 ID:pOKoAU+F
---- upload.cgi ここから ------ $common = getParameter(); $filename = $common->{param}->{file_name}; $file=""; while($bytesread = read($filename, $buffer, 2048)) { $file .= $buffer; } open(OUT, "> ./$ファイル名"); print(OUT $file); close(OUT); exit; sub getParameter() { my $this; $cgi = new CGI; for my $name ($cgi->param) { if (@{$cgi->param_fetch($name)} > 1) { $this->{param}->{$name} = $cgi->param_fetch($name); } else { $this->{param}->{$name} = $cgi->param($name); } $this->{param}->{$name} = jcode->set(\$this->{param}->{$name}, "sjis")->euc; } return $this; } ---- upload.cgi ここまで ------
418 :
416 :02/09/26 21:04 ID:pOKoAU+F
getParametet()の中の、sjis→euc変換をしているところ(この行の6行上)を コメントにすると、日本語ファイルでも普通にアップロードできるので 変換するとファイル名が変わってしまうせいかと思い、代わりに $filenameをsjis→eucに変換して試してみたのですが、何故かダメでした。 どうも、readした際にうまく取得できていないみたいなんですが。 理由のわかる方、同様の経験がある方、いらっしゃいましたら教えてください。 (長くてゴメンなさい)
>>415 sub hd { join ' ', map unpack('H2', $_), split //, $_[0] }
$bin = "\x01\x02\x03\x04\x05";
print hd($bin);
print "\n";
substr($bin, 2, 1) = "\xdd";
print hd($bin);
>>416 無用なトラブルを避けたいなら、パスやファイル名に
日本語 (というか多byte文字) を使わない方がいい。
サーバ/ブラウザ双方の環境によって全然違ってくる。
CGI.pm 使った事ないんで、その辺どの程度対応
してるのかは知らんが。
>>419 どうも有り難うございました。
おかげさまで希望通りの動作結果が得られました。
>>415 君のソースをコピペきぼんぬ。
>>416 元の文字コードがsjisではないのではないかと言ってみるテスト。
uploadはとりあえず置いといて、ファイル名に入れた文字列と
そのときの$cgi->param('filename')を書いてみてくれんか。
>>421 今いろいろ探っていたのですが、最初は
$replace_character = \xdd;
substr($buffer, $rep_position, 1) = $replace_character;
413-414を見たときにはシングルクオートで囲んで、
$replace_character = '\xdd';
substr($buffer, $rep_position, 1) = $replace_character;
420を見てダブルクオートで、やっと上手くいった次第です。
$replace_character = "\xdd";
ダブルクオートでも最初と同じ結果だろうと思って確かめていませんでした。
うーん、自分自身 ダブルクオートを使ったときの意味合いが良く解っとりません。
訂正: 最初は0xddを使っとりました。 $replace_character = 0xdd;
>>418 sjis→euc変換をしているところをコメントにし、
$filename の変換は、
> while($bytesread = read($filename, $buffer, 2048)) {
> $file .= $buffer;
> }
よりも後にしてみるとどうよ?
>>417 で、$cgi->param('file_name') が返すのは、文字
列じゃないです。"" を overload してファイル名っぽく
見せているだけの、ひみつのパッケージ (Fh) に bless
されたリファレンスらしい。
426 :
nobodyさん :02/09/27 01:44 ID:HP3sTChT
use strict; use vars qw($aaa,$bbb,$ccc); これで'$aaa,$bbb,$ccc' is not a valid variable name under strict varsエラーがでます。 普通の変数名だと思うのですが何がいけないのでしょうか。
427 :
nobodyさん :02/09/27 01:47 ID:TZvB0TqN
$a = "Win98" のとき、 "Win"を"Windows"に置換したものを$bにし、なおかつ$aは"Win98"のままにしたいです。 $a = "Win98"; $b = $a; $b =~ s/Win/Windows/; とすればうまくいったが、もっとシンプルな書き方はありますか?
if ($a eq 'Win98'){ $b= 'Windows98'; }
問題を単純化させるためにシンプルな例にしたんだから、 430のような回答はやめてください。
>>431 俺は430じゃないけど回答してもらっといてやめてくれとは何様?
429に対する答えが430じゃ間違ってるとでも?
意図したものじゃないとして、自分の例が悪かったという思考が何故働かない?
>良い回答は良い質問から。
>>430 はネタだと思ってつい悪い言い方してしまった、スマソ。
$aは何が入ってくるかわからないものとしてください。
"Win95"かもしれないし"Win2000"あるいは"WinXP"かもしれない。それ以外かもしれない。
>>422 分からん時は目で確かめる。
print join '/', (0xdd, '\xdd', "\xdd", '\n', "\n", '');
>>429 ($b = $a) =~ s/Win/Windows/;
436 :
nobodyさん :02/09/27 04:58 ID:EoYu/tZy
英語限定のメッセージボードで、日本語・アラビア語や、フランス語等 英語にはない表記のアルファベットなど、「英語以外の表記や機種依存 文字」が使用された場合、それらを全て「*」という文字に変換したい のですが、その場合の方法を教えて下さい。宜しくお願いします。
437 :
hmk :02/09/27 05:17 ID:???
s/[^a-zA-Z0-9 ]/*/g; 例えばこんなのでいいのか?
438 :
yahooo!!アダルト :02/09/27 05:31 ID:YxOmbJ3N
439 :
nobodyさん :02/09/27 06:25 ID:nnok+0bo
>>437 さん、
あ、それだけでよかったのですか。ありがとうございます。
初心者まるだしの質問で申し訳ありませんが、この場合、数字以外の
「#」「$」「~」などの記号はそのまま表記されますよね?
宜しくお願い致します。
>>439 手元にテスト環境が無いのかい?
自分で確認した方が、人に聞くより早いし、
相手を手間取らせずにすむよ。
YES・NOで答えられる質問は、特にそう。
実際に試したうえで、分からない点が出てきたら、
また質問してね。
※ ちなみに質問の答はNO
[^a-zA-Z0-9 ] が何を表しているか、考えよう。
JISみたいにアスキーとコード被ってるのが世界にどれだけあるか わかんないからな… JIS避けはこんな感じ? s/\x1b\x24\x40(.*?)\x1b\x28\x4a/'*' x length($1)/eg; んでその他と。 s/[^\x00-\x7e]/*/g;
443 :
hmk :02/09/27 15:45 ID:???
444 :
nobodyさん :02/09/28 01:46 ID:iyuQXvId
サイト内の或るデータベースに全文検索CGIを自作して つけようと考えています。 以下のようなものなのですが、Perlで作成しても 負荷が大きかったりとか、問題ないでしょうか? 現在300件ほどのデータがあって、 一件当たりが400文字(2バイト文字換算)程度です。 月に数件ずつ増える予定です。 サイトへのアクセス数は、現在一日に100回くらいです。 ただし、検索機能を使う人はもっと少ないと思います。 ホストはプロバイダのものを使用します。 (何サイトが一台のマシンを利用しているのかなどはわかりません。) スクリプトの仕様は、まだ決めていませんが、 マッチ数が10件程度に小分けして表示するなど、 軽くなるようにはするつもりです。 どういうCGIが、高負荷でプロバイダからお叱りを受けるものなのか、 わかっていないので、作成する際に注意する点をお教えください。
>>444 チャットのように秒単位で絶えずアクセスし続けているようなCGIでもなければ怒られる事はないかと。
あとCPUを1秒以上使用したスクリプトは強制停止させられるところなどもあるので
その辺が目安かも。
ただプロバイダのサーバは基本的にかなり重いのでファイルロックがしっかりしてないと
あっさりログが飛ぶかも。
>>445 CGI配布サイトなどの掲示板スクリプトなどが、
ログを少なめにしたりしているので、
ひょっとして掲示板のログ100件程度でも辛いのかな? などと
考えていましたが、アクセスが重なる時がマズイんですね。
>マッチ数が10件程度に小分けして表示するなど、
>軽くなるようにはするつもりです。
深く考えずに書いてしまいましたが、
これってマッチしないとファイルの最後まで
検索しつづけますね。
便利でかつ軽いというものが思いつかないのですが、
項目別にログファイルを分けて、検索する対象を限定するなど、
いろいろ考えてみようと思います。
ありがとうございました。
>これってマッチしないとファイルの最後まで 全文検索なんだからそれで良いんじゃないの? ファイル開く前に条件を整理して軽い条件からindexで流して 一気に対象を絞り込むとか。
文字の印字がわからない人は参考にしてください。 #!/usr/bin/perl main:{ printf("Hello, world.\n"); exit(0); }
449 :
444 :02/09/28 03:49 ID:???
>>447 言われてみればそうですね。
それに、現状では巨大なデータベースというわけでもないですし、
アクセス数も大したものじゃないですし、
負荷について考えすぎのような気もしてきました。
一応いろいろと公開されているソースも読んでから(C言語の方が多いのかな?)、
作成してみます。
仕事でCGIを覚えろと言われて勉強中です。 今、勉強しているのはフォームからデータを受け取り、 そのデータをメールで送信するプログラムなのですが、 メールの送信プログラムで MIMEエンコード→メールヘッダ作成→メール送信(SENDMAIL)の流れは みなさんどのように記述されてますか? ネット上にUPされてるソースを見てるのですが、 いろいろな書き方があってどういう風に書けばいいのかがいまいち よくわかりません。 ひとことアドバイスお願いします。 また、最近先人がつくられたソースを見てて思ったことなのですが ライブラリ(例えば今回で言えばmimew.plとか)を 使ったものもあれば、使ってないものもある。 あれは『使わなくても書ける』とか『使った方が楽』とか そういうレベルのものなのでしょうか? 別に使ったから処理が早くなる、遅くなるとかいったレベルではないんですよね? (フォームデコードのやり方がやっと最近わかったのですが、cgi-lib.plを使うという方法も知ったので) 抽象的な質問ですみません。
>>450 プログラムなんて、要求仕様、開発者の技術レベルやポリシー、
開発期間などによって千差万別になって当たり前。
そういった諸条件さえしっかり把握できれば、必要な機能や
処理の流れは自ずと決まってくる。
人の書いたソースを読む時は、それが作られた背景も考慮に入れよう。
ライブラリやモジュールの類は「楽ができる」という以外に、
「理解し切れてない処理を正しく行ってくれる」という恩恵がある。
チャレンジは大事だが、あなたが mimew.pl の中身と同等以上の
コードを書けない内は、自分で書こうなんて考えちゃいけない。
スピードを気にするのは、処理内容とMIMEの仕様を理解してからだ。
452 :
nobodyさん :02/09/28 18:54 ID:BrjfrQHT
CGIです。 500個のファイルの最終更新時間を調べて配列にしたいのですが、 500ファイル全部statするのと、更新されるたびに最終更新時間を記録して それを読み込むのとどちらの方が効率がいいと思いますか? よろしくお願いします
454 :
某スレ68 :02/09/28 19:23 ID:9nQPxW7p
CGIスレから案内されますタ。 abcdefg を a b c d e f g みたいにするのってパールで簡単にできますか。 行の操作じゃないからなんか難しそう。 短くかけっかなー。
500件ぐらいなら気にしなくても...
>>454 use Jcode;
print Jcode->new('abcdefg')->tr('a-zA-Z','a-zA-Z');
457 :
某スレ68 :02/09/28 19:49 ID:9nQPxW7p
>456 ややこしくてすみません。 スペースを入れていくということです。
$_= 'abcdefg'; for ($i=1; $i<(length); $i+=2){ substr($_, $i, 0)= ' '; } print;
join " ", split //, "abcdefg"
>>457 全角にみえました^^;スマソ
print join(' ',split(//,'abcdefg'));
461 :
某スレ68 :02/09/28 20:05 ID:9nQPxW7p
理屈はよく判ってませんが、 とにかく、短くできるようですね。 有難うございました。
462 :
すみません。某スレ68 :02/09/28 20:14 ID:9nQPxW7p
% cat hoge abcdefg % perl -e 'for ($i=1; $i<(length); $i+=2){substr($_, $i, 0)= \' \' ; } print;' hoge とワンライナーで書きたいんですけど、 パーサーエラーと叱られます。 {}ってワンライナーでは禁止されているのですか?
またいけるかな。。。 perl -pe'$_=join" ",split//' hoge
464 :
nobodyさん :02/09/28 23:42 ID:yZr0Nm9j
ttp://cgiroom.nu/ にある『検索専用データベース Ver2』
を使ってcsvファイルに含まれているデータの内容を取り除いてhtml上で繁栄
させる事ってできないでしょうか?
例
\pict\map\0001.gif
の「\pict\map\」の部分を取り除いて「 0001.gif 」だけ表示する
当方CGIの初心者で命令文の仕組みが全然把握できないので
「制作者に直接お願いしろやゴルァ」とか言わないで宜しくお願い致します。
急ぎの用なのでバージョンアップ待ちする訳にも行かず困っております。
>>465 情報不足。急いでるなら尚更しっかり説明しないと。
場合によってはスレ違い。改造工房行き。
>>465 少なくとも、
自分で調べてコード書いてみて、
間違ったままで良いからコピペして
どう直したら良いですか?
くらいしなきゃ、教える方も教えにくい。
「初心者だから」は通用しない。
初心者だからで言い訳するなら、はじめからCGIは触るな。
469 :
nobodyさん :02/09/29 04:28 ID:GXYgNgIm
>>461 @list = split(//, "abcdefg")
空の正規表現で分割すると,一文字ずつに分かれた配列が返る
join(" ", @list)
空白でつなぐ
ってこと。
470 :
nobodyさん :02/09/29 09:57 ID:Xgxp2+Gp
配列の値すべての \n を取り除くときは chomp(@array); でいいけど、逆に 配列の値すべてに \n をつけたい場合はどうすればいいですか? for で地味にループさせる以外に便利なものがあったら教えてください。 for($i=0;$i<=$#array;++$i){ $array[$i] .= "\n"; } これよりスマートな記述キボンヌ
471 :
nobodyさん :02/09/29 10:02 ID:NgmswZAr
>>470 map {$_.="\n"} @array;
472 :
nobodyさん :02/09/29 10:05 ID:NgmswZAr
>>470 $_.="\n" for @a;
のほうがよかった。
473 :
nobodyさん :02/09/29 10:30 ID:Xgxp2+Gp
474 :
nobodyさん :02/09/29 10:43 ID:u41sQpPi
$in{'key'}というデータを$xx{"key.$in{'id'}"}というデータに直す関数datasetと それを書き込む関数dbm_wがあって、 両方ともハッシュのリファレンスを渡してやるのですがdatasetはハッシュを返すようになっています。 なので%bufとか適当に経由しないといけないのですが、簡潔に済ませる方法はあるんでしょうか? %buf = &dataset(\%in); &dbm_w(\%buf, "chardata");
>>474 dbm_w({ dataset(\%in) }, "chardata");
でどう?
&dataset の仕様がいまいちよく分らないけど。
476 :
nobodyさん :02/09/29 12:12 ID:Xgxp2+Gp
変数の宣言をするとき、 my $val = ''; のように書いて初期化しますが、これが複数になったとき、 my ($val,$aaa,$aho) = ''; とやっても、先頭の $val しか初期化されませんよね?だから my ($val,$aaa,$aho) = ('','',''); と書けばよいかもしれませんが、これだと変数が100個になったら大変なので、 なにかよい方法がないです? もっとも、変数100個なんて作らないんですが、 なんか、こういう記述って、いやなので、、 スマートな記述キボンヌ
='' は不要
478 :
nobodyさん :02/09/29 12:20 ID:Xgxp2+Gp
>>477 ということは、初期化しなくても、勝手に初期化されるということ?
cとかでは、初期化しないと、ゴミが入ってるじゃん?
perl は my で宣言したときに、ゴミは入らないの?
>>478 通常は気にせず my $val; でいいが、
「未定義 (undef)」と「空文字列 or 0」は別物なんで注意。
{ my $val; print 1 if defined $val }
{ my $val = undef; print 2 if defined $val }
{ my $val = 0; print 3 if defined $val }
{ my $val = ''; print 4 if defined $val }
{ my($foo, $bar) = ('',''); print 5 if defined $bar }
{ my($foo, $bar) = (); print 6 if defined $bar }
初期化する必要は無いけど、あえてする場合は my ($val,$aaa,$aho) = ('')x3; でどう?
HTMLファイルをSocketを使ってダウンロードしたいんですが #!/usr/bin/perl use Socket; $port = 80; $ipaddress = inet_aton("www.asahi.com"); $address = pack_sockaddr_in($port,$ipaddress); socket(SOCKET,2,1,0); connect(SOCKET,$address); select(SOCKET); $ |= 1; select(STDOUT); print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "HOST: www.asahi.com"; print SOCKET "\r\n\n"; while(<SOCKET>){ print $_; } exit; これで標準出力に表示されるはずなんですが表示されませんどうしてでしょうか?
print SOCKET "GET /index.html HTTP/1.0\n"; print SOCKET "HOST: www.asahi.com\n"; print SOCKET "\n";
483 :
481 :02/09/29 15:48 ID:???
>>482 すいませんそれで動かないってことはperl自体がおかしいんですかね?
Win32/ActivePerl5.6.1です
484 :
nobodyさん :02/09/29 16:00 ID:u41sQpPi
485 :
nobodyさん :02/09/29 16:04 ID:u41sQpPi
>>475 希望道理の動作が出来ました。有難うございます。
>>484 ,486
>>483 を見なよ、Windows環境だよ。binmode(SOCKET)やってないんだから
"\r\n" はいかがなものか・・・
>>487 うちはWindows環境で、binmodeやってないが通ってたりする。。。
っていうかこれは相手サーバに渡す物だから、自分の環境がWinかどうかは関係無いんじゃないんですか?
いやはや無知ですいません。出過ぎましたね。
489 :
nobodyさん :02/09/29 17:30 ID:TaQBEb50
昔、2chの流出スクリプトを見たときに { XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX } の{}は何を意味しているの?
>>489 質問の意味がわからないけど、ブロック構造でしょ?
ソースの見栄えをエレガントにしたり、lastとかでブロック抜けしたりも可
if文やforなんかにも使ってるでしょ?
>>489 Cだとブロックの先頭でしか変数宣言できないんで、その為にブロックを作ることもあるかと。
print "何回スーンするんや?"; print (("スン スン ス〜ン♪ ( ゜Д゜)ハッ!!\n") x <STDIN>);
jcodeを使わずにSJIS判定するにはどうすればいいでしか?
496 :
nobodyさん :02/09/29 21:23 ID:TaQBEb50
>>490-491 ありがと。
でも、まだよくわからない。
普通は
if (XX)
{
XXXXXXXXXXXXXXXXXX
}
こんなかんじで条件が入るでしょ。
ところが
>>489 は条件が無いんだよね。
条件が無いなら、わざわざくくる必要が無いと思うんだけど。
>>444 ,
>>449 全文検索エンジンならNamazuがいい。
それをまねしてindexファイル作って、高速化汁。
>>496 局所的な処理がしたいんじゃないの?
たとえば
$a = 1;
{my$a = 'hoge';…}
print $a;
#結果は1
> ブロック化 そんな不思議ならその部分だけ出してみれば? 実際のコードを見ないと、それに確かな意味があるのかどうかはコメントできないよ。
HOST:
> ブロック化 C++等ではすごく一般的なコーディングスタイルで 局所的にしか使わない変数が、他へ漏れない様にするために使う けど、perlでもそういう使い方なのかは知らない
Cでは使うけど、C++ではどこでも宣言できるからあまり使えないよな。
504 :
nobodyさん :02/09/30 11:11 ID:2MKvRRFx
掲示板を作ってみたのですが、 メイン画面⇒掲示板画面⇒投稿⇒掲示板画面 の順で操作をして最後の『掲示板画面』でブラウザの戻るを押したら 投稿する前の掲示板画面が表示されるのですけれども、メイン画面を表示させたいのです。 どうすればよいでしょうか? ご指導お願いします。
>503 ダウト スレ違いなのであまり深くは追求しないけど 宣言できることが重要なんじゃなくて、局所的な変数が他へ漏れない様にするのが重要 あとその局所的なコードを他へコピペするときとか ブロック化してあるとどこからどこまでコピペすれば良いのか一目瞭然だし
>504 それが仕様と思って諦める というか自分で「メイン画面⇒掲示板画面⇒投稿⇒掲示板画面」つーフローを書いておきながら ブラウザの戻るボタンでメイン画面まで戻そうとする事自体おかしいと気付かないか? 素直に「メイン画面へ戻る」リンクを掲示板画面に付けましょう
507 :
nobodyさん :02/09/30 11:43 ID:gw3vjcK1
cgiで任意のサイトのURL(html)を送信したらそのhtmlを 自動で自分のパソコンに保存できるようにしたいのですが そういうの可能でしょうか。 可能な場合、送信したあと「Webページの保存」のダイアログが出てしまいますか? できれば送信したら勝手に保存できるのがいいのですが。
>>507 もちろん可能です。
送信したあとには出ません。
509 :
504 :02/09/30 12:13 ID:2MKvRRFx
メイン画面自体がCGIの場合でも無理でしょうか? メイン画面⇒[掲示板画面⇒投稿⇒掲示板画面] と最後の要素をひとくくりにして、ブラウザで戻るでメイン画面に戻る ことはできないでしょうか? しつこくてスイマセンが、実際とても困っているので。
510 :
nobodyさん :02/09/30 12:15 ID:gw3vjcK1
>>508 おお、素晴らしい。出来るのですね。
ですが、ちょっとどんな風に書いたらいいか想像できないのでヒントか、
それに近い動作をするスクリプトを紹介していただきたいのですが。
>>509 ブラウザの「戻る」の意味わかってる?
cgiとかそういう話抜きにしてわかってないみたいだね。
513 :
512 :02/09/30 12:25 ID:???
5分も遅れてかぶった スマソ
おおっと大胆発言だぁーーー!!
516 :
504 :02/09/30 12:36 ID:2MKvRRFx
517 :
514 :02/09/30 12:40 ID:???
[戻る]を右クリックして[メイン画面]を選択する
>>510 自動は無理と思われ。
とりあえず、URLを入力したら、そこのhtmlを
ファイルに保存するとこから始めてみたら?
それができたら、次はダウンロードにすりゃいい。
ダイアログも出さずに自動で保存させる事が出来たら 世の中のPCの中は大変な事になってるな。
>>509 locationで[メイン画面]に飛ばすじゃ駄目なん
どうしても戻るボタンでどうにかしたいなら
全て(または一部)の画面をHTML化すればできるかもしれないけど
521 :
510 :02/09/30 15:39 ID:???
はい、おっしゃる通りでした・・・(汗 open (DATA, ">>c:\data.txt") || &error("開けません。"); print DATA "あああああああ"; close(DATA); こんな事が可能だったら・・・誰でもクラッカーになれますね。 という事はやはりhtmlのあるurlを入力してそのページを開いて javascriptで「ページを保存しますか」のダイアログ出すまでがせいぜい精一杯てとこでしょうか。
522 :
450 :02/09/30 15:49 ID:???
>>451 なんか精神論的アドバイスをいただきありがとうございます。
ヤル気がでました。
523 :
504 :02/09/30 16:52 ID:2MKvRRFx
>全て(または一部)の画面をHTML化すればできるかもしれないけど 初心者なもので、聞いてばかりですいませんが。 具体的にはどうすれば良いのでしょうか?
>>523 つか根本的に何がどう問題なのか書けないわけ?
キミが考えた手段よりももっと効率のいい手段があると思うのだが
525 :
504 :02/09/30 18:25 ID:2MKvRRFx
>>524 では最初から事情を説明いたしますと、小説投稿サイトを作ったのですが
作品画面で
◆作品にポイントをつける
◆作品に感想をつける
の2つの送信ができるのです。
このとき、ブラウザの戻るで直接メイン画面に戻れない場合で、作品にポイントと感想の両方をつけたい場合
●メイン画面⇒(作品選択)⇒作品画面⇒(ポイントをつける)⇒メイン画面⇒(作品選択)⇒作品画面⇒(感想をつける)⇒メイン画面
とユーザーの操作がどうしても冗長になるのです。
それで
●メイン画面⇒(作品選択)⇒作品画面⇒(ポイントをつける)⇒(感想をつける)⇒(ブラウザで戻る)⇒メイン画面
としたいのです。
と少々入り組んだ事情があるのですけれど。
>●メイン画面⇒(作品選択)⇒作品画面⇒(ポイントをつける)⇒メイン画面⇒(作品選択)⇒作品画面⇒(感想をつける)⇒メイン画面 >とユーザーの操作がどうしても冗長になるのです。 ポイントと感想を同時に投稿すればいいのでは・・・ さらにどうして「ブラウザで戻る」にこだわるのか小一時間問い詰めたい。 投稿されたら、プログラム内で勝手にメイン画面ルーチンへ飛べばいいだけだと思うんだが。
527 :
504 :02/09/30 18:38 ID:2MKvRRFx
>>526 ポイントだけ、感想だけ、つけたいというユーザーもいるので。
>527 >526さんの最後の一行は読みました?
529 :
nobodyさん :02/09/30 18:49 ID:IOB01lXZ
複数ファイルを同時にアップするアプロダって作れるでしょうか? 今試みてるんですが、 バイナリファイルを複数個送信すると2個目以降が送られてこないんです。 テキストファイルなら複数個同時にいけるんですが、、
>>527 初心者というからにはCGIも拾い物なんだろう
もっと理想に適ったものがどっかにあるだろうから
自分で作る気がないなら別のものを探してきなされ
531 :
nobodyさん :02/09/30 19:44 ID:ImfR65/j
forkした子プロセスの標準入出力を親プロセスが握ることって 出来る・・・よね? 探し方が悪いのか考え方が悪いのか、いまいちこれという情報に 行きつけないのだが・・・。
532 :
504 :02/09/30 19:46 ID:???
>>530 いえ、スクリプトは自作ですよ。
どうすればいいのか分からない部分があったりして、
ネットでも探しましたが、欲しかったモノはなかったので。
ちょっと、今は解答を得られそうに無いので
もう少し、問題が具体的になってきたら、再び聞きにくるかもしれません。
そのときは、よろしくお願いします。
533 :
x :02/09/30 20:00 ID:q3kf4WJx
↑ブラクラ
>>531 ラクダ本に IPC::Open2 の例が載っているが…。
お望みのものとは違う?
536 :
531 :02/09/30 21:10 ID:???
>>535 さんくす!検索してみますた。
531書いてる時点では良くわかってなかったけど、
むしろOpen3の方が意図に近かったかもしれない。
ラクダ本は今手元にないのでそっちも今度見てみます。
>>1 コテハンでスレ立てんな!!!!!!!!!!!!!!!
↑ ヽ( ゚Д゚)丿 ハイハイシツコイよー
>>529 普通に送られてくるが?
受け取り方がマズイだけじゃないのか。
STDINの中身そのまま見てみな。
540 :
529 :02/10/01 00:10 ID:x+as6bji
>>539 STDIN見てるよ!
ってwebサーバ上にアプしたら普通に取得できますた。
これはwin+ActivePerl+Apacheの罠でしょうか。無念。
お騒がせしました。
>>540 WINならSTDIN読む前にbinmode(STDIN);してなかったとか…
すません、HTML formからmultipartで 画像なり音なりを受け取った際のPerl側での ファイル形式判断はどうすればいいのでしょうか? 画像についてはImage::Sizeモジュールのおかげで 判別できましたがその他の形式の判別方法がわかりません。 皆さんどうやって最終的に書き出す場合、拡張子付けしてるのでしょうか?
>>542 アップされたファイルの拡張子を使いまわせば?
どうしても正確に判別したいなら
「GIFはデータの先頭がGIFで始まる。」
「PNGは0x89PNGで始まる。」
「JPEGは7バイト目にJFIFの文字がある。」
こんな感じの情報を探しなさい。
とんでもない量になると思うけど。
>>543 あれ?元ファイル名の拡張子ってもしかして使いまわせるんですか?
cgi-lib.pl使って受け取りデータをフォーマットしてるのですが、
どうもファイルデータを受け取るキーからは、画像なりの実データのみしか得られず
元ファイル名(の拡張子)が得られなくて、バイナリ判別しかないのだろうか
と思ってしまっていたのですが…。
545 :
nobodyさん :02/10/01 07:54 ID:/I8m+twd
スッドレ違いだけど、相互リンク願いを丁重に断るやり方ある?
>>545 スッドク、スレ違いよ。CGIだけどなんか質問あるに逝け。
547 :
546 :02/10/01 08:03 ID:???
いけね、違うスレ教えちゃった。早く便所にでも逝け。
549 :
529 :02/10/01 10:18 ID:x+as6bji
>>541 見事にbinmode(STDIN);してませんですた。
フォームからのテキストやらまざってても問題ないですか?
とりあえず試してみます。
>>542 linux系なら大抵fileってコマンドがはいってたりしますが
>>544 cgi-lib.plは使ったこと無いからわかんないけど
STDINにはfilename="…"ってデータが他のデータと一緒に送られて来てる。
>>549 問題無し。
CGIを回したら特定のweb上のhtmlファイルを自分のサーバー上にコピーしたいんですけど可能ですか。
やり方はなんでもいいんですけど自分の想像で書いたら見事に失敗しました。
何がいけないですか。
$url = "
http://www.yahoo.co.jp/ "
open (DATA, ">>data.html") || &error("開けません。");
print DATA "Location: $url\n\n";
close(DATA);
data.htmlファイルは生成されたけど、 中身がそのまま「Location: $url\n\n」だったという事です。
画像とかはいらなくて、純粋にhtmlファイルだけほしいのです。
>>552 違法コピーです。著作権法に抵触します。通報しました!
>>552 絶対動かないけど、その場合
open (DATA, ">>$data") || &error("開けません。");
みたいな発想の方が自然だと思うぞ。
この辺ってsocket関連の情報をあたってみたらどうだろう。
もしくは、CGIプロクシのソースを参考にしてみては?
>>555 えっと、許可をもらっているので今回は大丈夫です。
例がヤフーだったのはよくなかったですね。
>>556 perlでネットワーク関連になるとちょっと知識が無いんです・・・。
掲示板を作れるくらいの知識じゃ厳しいですかね。
>>552 >>481 殊にネットワーク関係は中途半端なことしてると
よそ様に迷惑かけまくるから、
基礎をみっちり勉強してからトライしてね。
559 :
544 :02/10/01 15:11 ID:???
>>551 そうなんですね。
レスありがとうございました。
早速拾ってみます。
>>558 まったくそうですねすいません、
ところでinet_atonにはホスト名をいれるより
直接IPを入れたほうが処理は早いですよね?
ファイルアップローダーのスクリプトでは、 ファイルの受け取りにcgi-lib.plというのを使ってるみたいなんですけど それを使わないと無理なんでしょうか。 あと、use CGIも無しで。 use CGIを使った場合って read( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } ); で受け取るのが無効になってしまいますか? hiddenの受け取りにread( STDIN, $post, $ENV{ 'CONTENT_LENGTH' } );を使って ファイルの受け取りに$file = $query->parama('file); をやったらhiddenが受け取れませんでしたので・・・。
>>562 use CGI; か read か、どっちか1つにしませう。。。
564 :
552 :02/10/01 17:01 ID:???
本を見たらWebブラウザのスクリプトを作るという項目がありました。
これが使えそうな気がします。
# Webブラウザスクリプト
# browser.pl
# モジュールの仕様宣言
use IO::Socket;
# URLを入力
print "URLを指定してください。:";
$url = <STDIN>;
# URLをホスト名とファイルパスに分割
chomp($url);
if($url =~ /
http:\/\/ ([^\/]+)(\/.*)/){
$host = $1;
$file = $2;
}else{
die "そのURLには対応していません。\n";
}
565 :
552 :02/10/01 17:02 ID:???
(続き) # ソケットオブジェクト作成 $client_socket = new IO::Socket::INET( PeerAddr => $host, PeerPort => 'http', Proto => 'tcp', Timeout => '5'); unless($client_socket){ print "Socket Error:$!\n"; } # 入力をサーバーに送信 print "$host $file" . "\n"; print $client_socket "GET $file HTTP/1.0\n\n"; open (DATA, ">>data.html") || &error("開けません。"); # 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ) while($receive = <$cilent_socket>){ print $receive; } close(DATA); # ソケットを閉じる $client_socket->close(); これが全文です。ですが動きますがhtmlソースが出てきません。どこか間違っていますか。
566 :
552 :02/10/01 17:03 ID:???
ちなみに、インターネットにつながるパソコンで コマンド プロンプトから試しました。
print $receive;
>>552 LWPは使えんの?IO::Socketでも別にかまわんけど。
>htmlソースが出てきません。
data.htmlに出力されているんじゃないかと思うが、
ソース見ると開けて閉じてるだけかよ。
569 :
552 :02/10/01 19:00 ID:ydYlCK0m
すいません、これは間違いです。 open (DATA, ">>data.html") || &error("開けません。"); # 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ) while($receive = <$cilent_socket>){ print $receive; } close(DATA); −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # 出力を取得し、表示(複数行が帰ってくるので、取り終わるまでループ) while($receive = <$cilent_socket>){ print $receive; } 実際はこうやって実験しました。 指定されたhtmlのソースが表示されていくはずなんですけどね・・・。
>>569 unless($client_socket){
print "Socket Error:$!\n";
}
$client_socket->autoflush(1); # これ追加
# 入力をサーバーに送信
...
でどうよ?
while($receive = <$cilent_socket>)
これは綴り間違い?
571 :
552 :02/10/01 22:50 ID:ydYlCK0m
>>570 すごい!出来ました。
下の文がはじめに付いてくるんですがこれって自動で取ったり出来ないんでしょうか。
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Tue, 01 Oct 2002 22:34:16 GMT
Connection: Keep-Alive
Content-Length: 39683
Content-Type: text/html
Set-Cookie: inkid=n92b0EDMgACIgMEZL2zSjaAAVvoH; expires=Wed, 01-Dec-2010 00:00:00 GMT; domain=goo.ne.jp; path=/
Set-Cookie: ASPSESSIONIDGGGQQGED=MMBNNELBNKGNJBKCPGNLGLCG; path=/
Cache-control: private
あと、ローカルではうまくいったんですけど、サーバーにアップしたら、
Your script produced this error: Can't locate IO/Socket.pm in @INC (@INC contains: .) at ./aaa.cgi line 5. BEGIN failed--compilation aborted at ./aaa.cgi line 5.
という風に「use IO::Socket;」の行でエラーが出てしまいました。
>>571 もうなにからなにまで全然だめみたいだから
ちゃんと本かってある程度勉強したほうがいいよ。
まず、IO::Socketはレンタルサーバーに入ってるのはまれだろ
よくてSocket.pm
つかえても制限ありとかそんなもんだ。
>>下の文がはじめに付いてくるんですがこれって自動で取ったり出来ないんでしょうか。 こんな感じのをいれる if(/\r\n/){ next; } s/\r\n//o;
現在「」人の人がこのHPを訪れています・・・ ↑のようなことを表示できるようにするCGIってありますか?
576 :
574 :02/10/02 00:34 ID:???
すんげー遅レスうだけども。
>>488 >っていうかこれは相手サーバに渡す物だから、
>自分の環境がWinかどうかは関係無いんじゃないんですか?
ファイルハンドルが「テキストモード」の時,"\r\n"は
Winだと, 0x0D 0x0D 0x0A に
Unix系だと 0x0D 0x0A になる
っつーことで。
578 :
nobodyさん :02/10/02 12:31 ID:6nY1Hcfp
日付とか整形する時って、一桁の場合頭に0を補完するじゃないですか その場合 $mon = sprintf("%02d",$mon); と書くのと $mon = "0$mon" if ($mon < 10); と書くの どっちがいいと思いますか? 何か二極端になってるような気がして、、、自分は前者です。
>>578 なら前者でよろしいじゃん
後者は年月日時分秒全部書くとかなり長いし
後者の方が速そうだけどほとんど変わりますまい
# 入力をサーバーに送信 #print "HOST:$host\n"; #print "FILE:$file\n"; print $client_socket "GET $file HTTP/1.0\n\n"; これだと単純に$fileで指定されたファイルが返ってくるんですけど、 $fileがcgiだった場合、例えば掲示板とかの場合に、 掲示板内の投稿内容を入力する<input type="text" name="message"> の値もサーバーに送ることってできますか?掲示板のformのmethodはpostです。 結果的に投稿後のhtmlが返ってくるようにしたいんです。
582 :
nobodyさん :02/10/02 13:08 ID:6nY1Hcfp
こんな感じにしますた。 ($mon,$mday,$hour,$min,$sec) = (split(/,/,sprintf "%02d,%02d,%02d,%02d,%02d",$mon,$mday,$hour,$min,$sec));
>>582 sprintf使う気マンマンならなんも問題はないんじゃ。。
ちなみに月は$mon+1じゃなきゃずれるんじゃなかったっけか
584 :
578 , 582 :02/10/02 13:40 ID:6nY1Hcfp
585 :
nobodyさん :02/10/02 15:15 ID:JLnBuPbJ
質問フォーマット 1:RS-232Cに繋がったモデムに、ATコマンドを送ってリザルトを受け取りたい 2:googleを「perl RS-232C」で調べてみた 3:そうした事例がでて来ない perlを使って、RS-232C通信は出来ないでしょうか? 簡単なATコマンドを送って、結果を見るだけなのですが、minicomで手打ち は面倒くさいので、自動化したいのです。 でも、googleで事例が出ないので、もしかして、perlではRS-232C制御は 出来ないのでしょうか? もし可能なら、組み込む必要のあるpmや、スクリプト例など教えてください。 環境は、RedHat Linux 7.3 perlのバージョンは、5.6.1です。
? ATコマンド打つにはpppdがいるだろ Perlだけじゃむりだ
587 :
585 :02/10/02 15:39 ID:JLnBuPbJ
>>586 pppdというのと組み合わせるんですか?
今は、minicom -s から手打ちして、結果を見ています。
出来たら、自動でAT打って、返ってきた結果でif分岐して、おかしいときだけ
メールとかで知らせるという風にしたいんですよね。
まず、pppdというのをgoogleしに行って来ます。
何か過不足あったら、教えてください。
589 :
578 , 582 :02/10/02 17:30 ID:6nY1Hcfp
さらに質問させて下さい。 \$scalar とか \%hash とか、リファレンス参照ですよね 時々見る *scalar とかは一体何者なんでしょうか おそらくリファレンスと同じようなもんだと思うんですが いまいち挙動がつかめません。
590 :
585 :02/10/02 17:37 ID:JLnBuPbJ
>>588 あ、ほんとですね。/usr/sbin/pppdでありました。
さて、これをどうperlから呼んで、任意のATコマンドを出力させるのか、
調べてみなくてわ。
ただ、googleであたったところ、pppdってどうもインターンット接続のソフト
みたいなんですけど?
>>pppdってどうもインターンット接続のソフトで ATコマンドも打てるんじゃ!ぼけぇ! Linuxさわったのはじめてでperlも分らんようなら帰れ! どうせ厨だろ。/dev とかわからんだろ おとなしくじーーーーーーーーーーーっくりしらべてから来い!
>>591 やっぱり上級者になるとなんでも言いたい放題でかっこいいですね。
593 :
585 :02/10/02 18:09 ID:JLnBuPbJ
>>591 はは、いや、Linux/perl、1年くらい使ってるんですよ(笑)
ただねぇ、ルータが最初からあって、接続はLANでって環境でインターネット
に入ったもんで、ATコマンドって、つい最近まで、使ったことも見たことも無
かったのよん。
#Windowsも「ダイヤルアップなんたら」というの、使ったことまったくない。
だから困ってるのさ。
> Linux/perl、1年くらい使ってるんですよ(笑) おめでたい香具師だな。
>594 だから初心者なんだろ(w
>>581 > print $client_socket "GET $file HTTP/1.0\n\n";
この行の GET を POST にすることを気付かなかったのなら、
まず Socket と HTTP について勉強しる。
>>582 $_ = sprintf '%02d', $_ for ($mon,$mday,$hour,$min,$sec);
こう書いておけば、変数が増えても
一箇所書き換えるだけで済む。
>>585 「Linux perl シリアル通信」辺りでググってみてはどうか?
>>589 * は型グロブ。黒豹本 (O'REILLY「実用 Perl プログラミング」)
の三章に、実際の使用例と共に詳しく解説されている。
あるディレクトリに Sheet1.csv 〜 Sheet10.csvまで10枚のファイルがあります。 ファイルのそれぞれの1〜9行目、1列目〜4列目 を個々に加算してresult_11.cvs ファイルの1〜9行目、1列目〜4列目 に和を挿入したいのですが、awkとbc とpaste を使っていますが、 perlなら一発で出来そうです。何かいいアイディアはありませぬか? % cat sum.array.awk BEGIN { OFS=FS="," } { for (i=1;i<=4;i++) sum[FNR,i]+=$i } END { for (r=1;r<=9;r++) print sum[r,1]"\n"sum[r,2]"\n"sum[r,3]"\n"sum[r,4] }
598 :
597 :02/10/02 20:57 ID:???
% awk -f sum.array.awk Sheet1.csv|sed -e 's/$/+/'>ac1.dat % awk -f sum.array.awk Sheet2.csv|sed -e 's/$/+/'>ac2.dat % paste ac1.dat ac2.dat 55+ 59+ 77+ 81+ 36+ 40+ 66+ 70+ 111+ 115+ 3+ 7+ 39+ 43+ 77+ 81+ (略)
599 :
597 :02/10/02 21:03 ID:???
最後にTABを消して、bcに食わせるのですが、mkfifoした後、 perlのwhile(<FIFO>){ほにゃらら;}とかで処理できないかなー。
bcの使い方とかわからんけど データは 4,5,44124,1324\n 45,2345,44124,1324\n 45,2345,44124,1324\n こんな感じで 324424124\n 424148124\n 423213131\n (適当) ↑みたいににしたいってことですか?
601 :
nobodyさん :02/10/02 22:55 ID:77XrC79c
CGIとかを動くかどうか試したいんですがまだHPスペースの承諾メールがきてなく確認できません そこで質問なんですが無料のサーバー?ソフトみたいなのは無いんでしょうか?
602 :
597 :02/10/02 22:57 ID:???
cat Sheet1.csv 1,33,55,77,99,121,143,165 2,36,66,111,222,223,147,225 3,39,77,145,345,346,151,348 4,42,88,179,468,469,155,471 5,45,99,213,591,592,159,594 6,48,110,247,714,715,163,717 みたいなファイルが10枚あって、 ココの行列ごとに和をとって11番目のファイルに出力したい、ということです。 串刺し、といったイメージでファイルを横断して加算を取るということです。 この部分だけ、excelに頼っているのですが、 他の計算が全てUnix上なので、この計算もperlなどで行いたいなと。
601 :nobodyさん :02/10/02 22:55 ID:77XrC79c =commentout CGIとかを動くかどうか試したいんですがまだHPスペースの承諾メールがきてなく確認できません そこで質問なんですが無料のサーバー?ソフトみたいなのは無いんでしょうか? =cut 次。
commentout の意味わかってる人?
>>596 >$_ = sprintf '%02d', $_ for ($mon,$mday,$hour,$min,$sec);
( ´,_ゝ`) プッ ネタかよ
606 :
578 , 582 :02/10/03 01:38 ID:uOd1wswN
*が型グロブで、どんなものかも分かったのですが どんな機会に使うのでしょうか?? いまいちリファレンスより速度的に早いとか 何か利点があるのでしょうか??
>>602 そのくらいのデータ量だったら、値を全て読み込んでから
処理しちゃっても大丈夫/楽じゃないですかね。
use constant FIRSTFILENUM => 1;
use constant LASTFILENUM => 10;
my @data; #$data[ファイル名の数字部分]->[列][行]
for (my $fileno = FIRSTFILENUM; $fileno <= LASTFILENUM ; $fileno++){
open (FILE, "Sheet$fileno\.csv") or die;
for(my $n = 0; <FILE>; $n++){
chomp;
$data[$fileno]->[$n] = [split (/,/)]
};
close (FILE) or die;
}
こんな感じで、データを一気に読み込んで、あとは適当に
ループを回して足すなり引くなりするというのはどうでしょ?
my $sum; #各ファイルの列ごとの和
for (my $col = 0;$col < 6; $col++){
for (my $fileno = 1; $fileno <= 10; $fileno++){
for(my $row = 0;$row < 8; $row++){
$sum += $data[$fileno]->[$col][$row];
}
}
print $col + 1 . ":$sum\n";
}
たとえばこんな感じで。
608 :
602 :02/10/03 02:52 ID:l9L39VMS
>>602 >そのくらいのデータ量だったら、値を全て読み込んでから
よく判らないのですが、2000行400列ぐらいに集めてしまった巨大ファイルも
処理する場合、
512Mのメモリー積んでれば(OSはLinux)大丈夫でしょうか?
今までは、excelに食わせるために一旦小さいファイルに分けるなどしてましたが。
一気にできるとなるとどれくらいのファイルまでならOKなのでしょうか?
今、手元の一番大きいので、7.3Mだから大丈夫なのかな?
609 :
602 :02/10/03 03:05 ID:l9L39VMS
つまり、7.3Mぐらいなら、50枚くらいまでならOKという意味です。 50枚も逝かないと思うけど……。けど、こういう場合、単純計算で512Mのうち どれくらい残しておけばいいのかな。
>>606 基本的に表立ってはあまり使わない。
普通は、ファイルハンドルを使うときと、エイリアスを作成する時くらいじゃないかな。
611 :
nobodyさん :02/10/03 10:16 ID:HWMUanwi
CPANの使い方の日本語の解説がないか? 本 or サイト どっちでも可
今はshift-jisでperlを書いてるんですけど、eucで書いた方がいいんでしょうか。 どっちでもいいんでしょうか。時と場合で使い分けるんでしょうか。
613 :
nobodyさん :02/10/03 10:54 ID:xHS0Gcl+
>>612 シフトジスの場合に文字化けエラーに気をつければ
どっちでもいい
614 :
nobodyさん :02/10/03 11:16 ID:Co/qm2Ti
初歩的なことで申し訳ないんですけど、 配列名の中に変数をエラーってしまいます。 #!/usr/bin/perl $num =0; @ary = qw(a b c d e f); foreach (@ary) { push (@new_ary_$num,$_); ++$num; } この場合、 aを@new_ary_0 bを@new_ary_1 ・ ・ fを@new_ary_5 に入れたいのですが、push (@new_ary_$num,$_);で 引っ掛かってしまいます。 @new_ary_${num}など、いろいろ試してみたのですが どうにもだめでした・・。 配列名の中に変数は使えないのでしょうか? 宜しくお願いします。
訂正 配列名の中に変数をエラーってしまいます。 ↓ 配列名の中に変数を使うとエラーってしまいます。 でした。すんません
# フォーム
<form action="aaa.cgi" method="post"><input type="text" name="text" value="aiueo"></form>
-----------------
# aaa.cgi
$post_name = "text";
$post_value = $FORM{text};
print "Location:
http://xxx.yyy.zzz/hoge.cgi\n\n ";
---------------
こうやってhoge.cgiへ自ら用意したpostデータ(name=text value=あらかじめ用意した値)
を送り付けたいのですが可能ですか?
getの時は引数を付ければいいだけですが・・・。
617 :
578 , 582 :02/10/03 11:21 ID:v6OPXcCd
>>610 ご回答ありがとうございます、胸のつっかえが取れました。
>597 ところで UNIX板のシェル、オークスレにまったく同じ質問があるように見えるのは気のせいですか? いや,マルチだとは思わないんだけどね,それぞれのやり方が知りたいのかもしれないし
619 :
581 :02/10/03 13:38 ID:???
print $client_socket "POST index.html HTTP/1.0\n\n"; こうしたらおかしくないですか? postのデータはどうやって送ってるんですか?
>>614 push (@{"new_ary_$num"},$_);
>>616 いったん全部hiddenにしたform出力してjavascriptで勝手にsubmitするとかダメ?
621 :
nobodyさん :02/10/03 14:44 ID:V3RvumoZ
バッファをフラッシュするってどういう意味ですか?
$hoge = shift || 'あ'; これってなにしてるんですか?ただの代入?
623 :
nobodyさん :02/10/03 15:59 ID:l7EfCAGl
>>622 @_にデータがあればその先頭のデータを代入。なければ'あ'を代入。
624 :
n :02/10/03 16:08 ID:KXoffugq
perlでの8とか9って特別な数字か何かなの?
626 :
607 :02/10/03 17:36 ID:???
>>609 あー、ファイルでかいですかー。
じゃあ一行ずつ読み込んで処理してテンポラリに書き出すのは?
たとえば、Sheet1.csvからSheet10.csvの同位置の要素を串刺しに
足していくスクリプトだとこんな感じでどうでしょ。
627 :
607 :02/10/03 17:38 ID:???
use strict; use File::Copy; copy ('Sheet1.csv', 'Result.csv'); for (my $fileno = 2; $fileno <= 10 ; $fileno++){ open (DATA, "Sheet$fileno\.csv") or die; open (SUM, '<Result.csv' ) or die; open (TEMP, '>TEMP') or die; while(<DATA>){ my @data = split(/,/); my @sum = split(/,/, <SUM>); my @result = map {$data[$_] + $sum[$_]} 0..$#data; print TEMP join (',', @result) . "\n"; } close (TEMP) or die; close (SUM) or die; close (DATA) or die; unlink ('Result.csv'); rename ('TEMP', 'Result.csv'); } うーん。もっとカコイイ方法ないかなあ。 あ、それと、607の書き込みの下のコード、間違ってました。ゴメン
628 :
ふとした疑問 :02/10/03 18:28 ID:v6OPXcCd
サブルーチン呼び出す時って &subname(); の形ですよね? で、普段は&は省略して書いてるんですが &が無いと動かないサブルーチンとかも在ってチンプンカンプンです そもそも&はどんな場合に必須となるのでしょうか?
629 :
nobodyさん :02/10/03 18:54 ID:bjQ5Yi4R
PerlからWin32::APIモジュールを使うとき、 RegisterClassExに渡すwndClassEx構造体の中で ウィンドウプロシージャの指定はどうすればいいんでしょう? Perlでユーザ関数(サブルーチン)を作ってそのリファレンスを渡せばいいのでしょうか?
× hogehoge ○ hogehoge() × \hogehoge × \hogehoge() ○ \&hogehoge
>>628 ( )付きなら同じだよ。
&sub
と( )無しで呼ぶと&sub(@_)と同じ
632 :
nobodyさん :02/10/03 19:54 ID:FetdaLGe
>>628 省略記述って言うんだけど、実際の所省略しないほうが手っ取り早くていいぞ。
省略が通るかどうかは、他に前方宣言されているとかそうゆうのも関係ある。
ちゃんと正式に書けばどんな時も困った事にならない。
633 :
628 :02/10/03 20:57 ID:v6OPXcCd
>>630-632 ありがとうございました
自分には省略せずに書くのが見やすいし迷わなくていいかも。
ム板のPerl質問箱がrubyキティの荒しに遭って危うい状況。
635 :
nobodyさん :02/10/03 21:31 ID:Wit0Sk8M
Win2k Apacheで print TXT "\n"; としただけなのに TXTファイルの改行コードがCRCFになっています。なぜ?
>>635 Windowsの改行がCRLFだから、改行を表す\nもCRLF
>>636 すみませんつまっていました。ありがとうございます。
\nだけprintする方法ありましたらどうぞ教えてください。
ごめんなさい。CFだけ記述する方法です。
CF???
だから、またrubyきちだよ。
LFでは?
>>642 \r\nがCRCFと思っています。間違いみたいね。LFをprintしたいですが。\x0Aでも2バイトになるし。
出力する前に binmode(TXT);
CR(きゃりっじ・りたーん) LF(らいん・ふぃーど)
>>644 (TXT)/ やってみます。ありがとうございます。
647 :
nobodyさん :02/10/03 22:34 ID:G7kyuSYC
CPANの使い方の日本語の解説がないか? 本 or サイト どっちでも可
あの程度の規模のサイトに解説が必要か?
>>647 CPANってモジュールのこと?
それともサイトのこと?
650 :
614 :02/10/03 23:17 ID:???
>>620 できました!
どうもありがとうございました。
PerlってCとBASICのいいところを合わせたような 感じの言語だね。
つまり、古典と糞を合わせた最低言語ということだ。
#1 for($i = 0; $i < 200000; $i++) { $array1[$i] = 1; } #2 $#array2 = 199999; for($i = 0; $i < 200000; $i++) { $array2[$i] = 1; } 先に領域の確保をしておく#2の方が速いと思ったら#1の方が速くなった。なぜ?
654 :
:02/10/04 01:39 ID:???
656 :
nobodyさん :02/10/04 08:04 ID:iu1Ymefg
「Perlについての質問箱」がruby基地外によって潰されました。 心ある人は、rubyスレにお礼参りしてください。
なんかPerlerとRubyistを争わせたい人がいるなあ。
(´-`).。oO(なぜRubyキティ・ガイの仕業だって分かるんだろう?)
661 :
649 :02/10/04 09:57 ID:???
>>658 じゃ、引用してやるYo
------
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perl
ぷぷぷ
反論したいか?反論したいんだろ?ぷぷぷ大爆笑
お前らには無理。
Perlみたいな糞言語を使う奴らは人間以下
------
これがrubyキティ以外の何だってんだ、ドアフォ
あ、これはrubyキティに言ったんで気にしないで。
>>662 それが単にRuby厨を騙っているだけなんじゃないか、と皆思ってるわけで。
仮に本当にRuby厨だとしても、もはやそれは言語を超えた厨房でしょ。
無視以外の対策は無いと思うんだよね。
>>663 > もはやそれは言語を超えた厨房でしょ。
言い得て妙。
>>663 ところで奴はPerlの新スレはム板には立てるな、PerlはWebprogに
引きこもってろ、というわけ。rubyのスレはム板にいくつかあるよ
ね。Perl==CGIじゃないんで、ム板にも1つくらいPerlスレがあっ
てもいいと思うんだが、奴はスレ立てた奴のIPアドレスは分かっ
てしまうと言って脅してるんで誰も立てんでしょう。「無視」と
冷静に構えてますが、ますますPerl==CGI、ruby>>Perlという
認識が広まっていいわけ?
>>665 perl知ってる人間がIPアドレスがばれるなんて事ビビるかよ…
小せぇ事気にする前にお前が言語勉強しろ
奴はスレ立てた奴のIPアドレスは分かっ てしまうと言って脅してるんで誰も立てんでしょう。「無視」と 奴はスレ立てた奴のIPアドレスは分かっ てしまうと言って脅してるんで誰も立てんでしょう。「無視」と 奴はスレ立てた奴のIPアドレスは分かっ てしまうと言って脅してるんで誰も立てんでしょう。「無視」と 奴はスレ立てた奴のIPアドレスは分かっ てしまうと言って脅してるんで誰も立てんでしょう。「無視」と 奴はスレ立てた奴のIPアドレスは分かっ てしまうと言って脅してるんで誰も立てんでしょう。「無視」と 奴はスレ立てた奴のIPアドレスは分かっ てしまうと言って脅してるんで誰も立てんでしょう。「無視」と
キミらにはまだわからないのかもしれないけどみんな大人なんだよ。 いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
670 :
659 :02/10/04 12:42 ID:???
>>661 ‥‥‥‥‥‥‥‥漏れ、ここのサイト行ったことあるわ。
なんで見つけられなかったんだろう?
恥ずかしいので、回線切って、首吊ってきます。
>>667 >perl知ってる人間がIPアドレスがばれるなんて事ビビるかよ…
perlを知っているかどうかとは関係ないでしょ。rubyキティが言うように
新スレを立てた人間のIPアドレスが記録されていて一般ユーザも参照可能
かどうかということでしょ。
他の可能性: 1)Apacheなどのhttpdサーバは、httpdサーバにアクセスしたユーザのIPアド レスと閲覧したページをaccess.logに記録します。(Perlなどアクセス解析ス クリプトの多くは、このファイルを読んでグラフとか表に整形します。)した がって、プロバイダの管理者は、特別な場合にこのaccess.logから特定の時間 に特定のページにアクセスしたユーザ情報を知らせることができます。2chで も、個人名を挙げた誹謗中傷の書きコに対して時々見られます。今回の場合は、 この可能性は、ないと思われますが、問題は、rubyキティがプロバイダ関係、 あるいは2ch管理者関係の人間であった場合です。 2)新スレ立てたヤシ(1だね)に自鯖のHPを見るように誘って、IPアドレス を抜き取る。 3)perlでは、packet解析も容易にできる。
673 :
nobodyさん :02/10/04 13:51 ID:Ck18zQey
自分用にライブラリ作ってるんだけど #コメント行だけで数キロバイト・・・ やっぱファイルサイズが大きければ大きいだけ速度に影響しますか? というか50KB程度なら体感的に別に関係ない気もしますが どうなんでしょう
>>672 だからIP抜かれたから何…
企業からとかならともかく
プロバイダのIPじゃせいぜい
住んでる地域くらいしかわからないじゃん…
荒らしたわけじゃないからアカウント消されるわけでもなし
>>673 それくらいだったら、人間の感覚では判別できない程度です。
>>673 コメントの量くらいで体感差はないと思うけど、
気になるならコメントは別のファイルに書いとけば?
コメント自体あんま要らないと思うけど。
open (TXT, "aaa.txt") || &error("開けません。"); while($linevalue = <TXT>){ } aaa.txtを一気に全部読み込むことってできますか? while($linevalue = <TXT>){ $line_all .= $linevalue; } で、連結させていくしかないですか?
>>673 perl がスクリプトを解析する部分での影響は殆ど無い。
但しディスク I/O が遅ければ、当然その影響は受ける。
>>677 undef $/;
679 :
nobodyさん :02/10/04 14:41 ID:zNdIxOGz
フルパス名から拡張子を抜き出すのて $kakutyousi=~/\.([a-zA-Z]$)/;でいい
>>677 open (TXT, "aaa.txt") || &error("開けません。");
@linevalues = <TXT>;
こういうのをPerlお大尽といいます。
>>679 これ質問?
拡張子に数字を含んだものもあるかも。
/(\.[^.]+)$/じゃあどうよ。
>>681 /\.([^.]+)$/だよね?
っていうか,/([^.]+)$/じゃだめなの?
>>679 hoge.a とか hoge.o とかにしかマッチしないよ
>>679 >>681-683 $full_path =~ s|(?<!^[A-Za-z])[:\\]|/|g;
($path, $basename, $extension) =
$full_path =~ m|^(.*?)([^./]+)((?:\.[^./]+)*)$|;
…過剰?
CGIがリクエストされもしないのに定刻に勝手にCGIが回るとか出来ますか?
明らかに荒らし風な書き込みを、常識人が相手にするとは思えないよ。
やっぱり無視が一番いいと思うな。
>>685 cron
>>686 分かりますた。って、ム板に新スレ「Perlについての質問箱2箱目」
が立ったので、とりあえずって感じ。また、荒らされたら、どうし
ようかってのは残るけど・・・
689 :
nobodyさん :02/10/04 17:09 ID:FKzI73uU
#フォルダ作成 { umask(0); mkdir("hoge",0777); chmod(0777,"hoge"); } これを実行したらhogeフォルダが消せなくなってしまったのですが このumask(0);ってどういう意味ですか?
690 :
質問 :02/10/04 17:11 ID:zDqIUs3v
ttp://www. 〜〜〜/~~~~/~~~~/~~~~/
で最期のスラッシュ部分を削るとよくdirectry格納庫が見えるんですけど
これは犯罪なんですか?
>>687 まあ、とりあえずいいんじゃない?
荒らしはねぇ…実の所、私はまるで気にならないんだよね。慣れたのかな。
>>689 umask(0)はパーミッション操作に対するデフォルトのマスクを無しにする、
つまり「これからパーミッションを危険な値に設定するけど、これは確かに私が望んだことだからね」って意味。
見たところ、そのコードで作ったディレクトリが消せないとは思えないな。
とりあえずパーミッションを確認してみて。ていうかそういう場合はまずパーミッション確認して。
または、そのディレクトリの中にファイル作らなかった?それなら消せないと思うけど。
余談だけど、最後のchmod()は無意味だね。
>>690 そんなことで犯罪になるわけないでしょ。
693 :
nobodyさん :02/10/04 17:39 ID:zDqIUs3v
>>693 はいはい。よかったでちゅねー、ぼうや♥
695 :
nobodyさん :02/10/04 17:46 ID:zDqIUs3v
>>692 ん、失敬。
# どっちもチェックしてないスレだ…
698 :
nobodyさん :02/10/04 17:52 ID:zDqIUs3v
自治厨ならまだしも、何故マルチポストをしてるzDqIUs3vなんかに マルチ呼ばわりされないといけないのか理解に苦しむ。 もしかして他のスレでzDqIUs3vにレスしてるのも俺だということに zDqIUs3vの脳内世界ではなっているのであろうか。 そうだとしたらzDqIUs3vは相当おめでたい野郎だ。
ただの質問なんじゃないのかなあ よくあることだな
701 :
nobodyさん :02/10/04 18:11 ID:mwNvTbYD
連想配列%Pointを、それぞれ対応した%Countで割って、 その値を%HEIKINに入れる時に、0/0(ゼロ ÷ ゼロ) になると、CGIが途中で止まってしまうのですが、 これって、仕様ですか?? foreach (@LIST){ $HEIKIN{"$_"} = $Point{"$_"} / $Count{"$_"}; }
ま、初心者だな>
>>699 そう思うだろ?
常識だよな
マルチなんて言うからいわれ返されんだよ ほっとけよ
ちょっとperlの正規表現使いて〜、という時に % cat example s/^(.*)$/$1 = $1\.new/; % perl -p example kakikomi 【失敗】 % vim example % perl -p example kakikomi 【失敗】 % perl -p example kakikomi のようにちょこちょこフィルターをエディターで開いては 閉じてするんですが、ファイルをその場で編集できる エディターって何かありますか?edは使いにくいので、パス。 シェル変数をぱっとその場で編集できるvaredコマンドの便利さに あやかりたい。
706 :
701 :02/10/04 18:26 ID:???
>>704 マジですか!?
とりあえず、
$Count{"$_"} = 1 unless($Count{"$_"});
を追加して、0にならないようにすれば、回避はできるのですが、
分母に0が入ると、必ずそこで処理が止まってしまうんです・・・
どなたか、同じような経験をした事ある人いませんか?
動作環境
Apache 1.3.26-win32
ActivePerl-5.6.1
えっと、ひょっとしてCGIでそれ以降のHTMLが表示されないって事? それなら0で割った時点でエラーがでて終了しちゃうから続きは出ないよ。 漏れはてっきりコマンドプロンプトで打ったらそこから反応が返ってこなくなるのかと思ったよ。 スマソ。
反応あった?
709 :
701 :02/10/04 18:46 ID:???
こんな感じのを実行すると、 0/0は、500エラーになってしまいます。 0÷0=0って計算してくれないんですかね・・・ #!C:/perl/bin/perl $test = 0 / 0;#これだと500エラー #$test = 0 / 1;#これならOK print "Content-type: text/html\n\n"; print "$test"; exit;
>>709 $test = 0 / 0;
の時点でエラーを起こして終了し、標準出力になにも出力されないから。
711 :
nobodyさん :02/10/04 19:25 ID:oWNxUl3m
Perlメモ
http://www.din.or.jp/~ohzaki/perl.htm を読んでいて、「改行コードを統一する」って話のところで、
s/\x0D\x0A|\x0D|\x0A/\n/g;
と同値な文が
s/\x0D\x0A/\n/g;
tr/\x0D\x0A/\n\n/;
ってことが理解できない。2番目の文が
tr/\x0D\x0A/\n/;
じゃないのかと思うのだけれども、そもそもtr///やs///が理解できていないような気がしてきた。
tr///とs///の違いを含めて、ご教授願います。
検索すれ
714 :
nobodyさん :02/10/04 20:13 ID:yQsbQ4Tj
以下のようにしたいのですが、厨房にはスクリプト書けまテン。 誰かタツけて下さい。 $ find -name "*.pl" >find.log $ cat find.log ./lwp-perl/ch07/bbc_scan.pl ./lwp-perl/ch06/amazon-rank.pl ./lwp-perl/ch06/orn-summary.pl ./lwp-perl/ch06/bookmark-checker.pl ./lwp-perl/ch06/ora-temps.pl ./lwp-perl/ch07/ora-temps.pl ↓ ↓ bbc_scan.pl amazon-rank.pl orn-summary.pl bookmark-checker.pl ch06_ora-temps.pl ch07_ora-temps.pl 同じファイル名であれば、プレフィックス(ディレクトリ名)をつけるというやつでつ。
>>711 > tr///とs///の違い
を理解すれば良い
716 :
nobodyさん :02/10/04 20:17 ID:FKzI73uU
>>691 丁寧な説明ありがとうございます。
hogeフォルダをつくったあとに設定ファイルも自動でつくる
ようになっていたので自動でつくられました。
パーミッションはローカルのせいか764でした。
もうちょっといろいろやってみます。
>>714 ここはPerlコーディングに感する質問スレです。
そのような依頼はスレ違いです。
s/感/関/
>>705 編集中のファイル(バッファ)にPerlスクリプトをかけて
そのまま変更できるエディターとか言ってましたね。
1)いわずと知れたEmacs、Meadow(windows版)
2)xyyzz(windows版)、秀丸(filter.macってどうなった?)(windows版)
もちろんお勧めは、1)。
721 :
714 :02/10/04 20:41 ID:???
>>717 何処で聞けばいいでしょうか?或いは似た処理をするスクリプトって
ないでしょうか?
なんで、 0÷0=0 なんだろう…
724 :
719 :02/10/04 22:37 ID:???
>>705 よく読んだら違った。簡単なフィルター(Perlスクリプト)を書き直す
のにエディターを開いたり閉じたりするのが面倒ってことね。え?、
例を見るとコマンドラインスクリプトで十分できません?unixをお使い
のようですから、複数行にまたがるスクリプトも'\'を付けて簡単につ
なげて書けるんだから。
私は、emacsで対象テキスト開いといて、C-x h、C-u M-|して、Minibuffer
でPerlスクリプト実行させてます。
725 :
705 :02/10/04 22:58 ID:???
>>724 【ワンライナー】履歴に間違った正規表現まで残って、後で探す時にややこしい。
【emacs】重いので起動が困難(vmware内なので)。
よって、edみたいなコマンドラインでさくっと編集できるエディターってないのかな
と思ったわけです。ed もなんだか使いづらいので。
varedってemacsライク(GNU readline)なキーバインドにできますよね。
それと似たやつで、なんかないかなー、という意味です。
vim使っているなら、 ! perl hoge.pl somefile 後は履歴で
>>726 気ヅカナカッタヨ。キャハー。
逝ってきます。
どうもねー。
728 :
719 :02/10/04 23:55 ID:???
>>726 それって出力結果(stdout)はどこに出るの?
emacsなら、command outputとかっていうバッファが
別に開いて出るんだけど・・、あるいは、現在の
バッファそのものが変更される。vi系は設定ファイルいじる
だけだからなぁ。
729 :
nobodyさん :02/10/05 00:56 ID:2qdJnT+h
Perlじゃなくてもいいのですが、自宅にサーバを設置して携帯電話などから ファイルをダウンロードして!と要求するとサーバにファイルを保存できるスクリプトありませんか?
>>729 そんなスクリプトを作る価値が分からない
731 :
nobodyさん :02/10/05 01:28 ID:2qdJnT+h
>>730 2チャンネルを携帯電話で見ているときに、画像のリンクがあった場合、画像の種類が携帯電話で見れないものだったり
サイズオーバーだった場合に自分のサーバに保存して、後で見るみたいな使い方をしたかったのですか…。
そんなのってないのでしょうか?
>>730 そんな自分に都合の良いスクリプトがあると思うのか?
自分で作れ
それにスレ違い
perlの日本語のマニュアルって皆さんは何を使ってますか? ウンドウズのCHMファイルなんてないですよね〜。
734 :
732 :02/10/05 01:32 ID:???
$_ =~ s/($value)/<b>$1<\/b>/og; ※$_,$valueは共にShift_JISです といった置換処理をしたいのですが $valueの2byte文字列内に【\x5b="["】が入ると、 メタ文字扱いされてしまい置換に失敗してしまいます。 Source部分に変数が来る場合のメタ文字エスケープは どうしたらいいのでしょうか?
737 :
736 :02/10/05 04:31 ID:???
↑ ×Source部分 ○Pattern部分
ごめん \Q$value\E
740 :
736 :02/10/05 05:59 ID:???
>>738 ギャー!!!
完結にありがとうございます!
子一時間、文字コード変えたりして
対応できるか試していたんですが無理で聞いてしまいました…
よくマニュアル嫁って感じでしたね…
742 :
: :02/10/05 11:32 ID:lD9sCbwy
0÷0だってw おまえ小学生か?もっかい割り算ならってこい
河馬屋さんとことIBMの解説サイト以外で、 Spreadsheet::ParseExcel について情報を扱っているナイスなサイトってどこですかぁ? 2chで話題になったことってありますこ?
>>743 perl-modeが.pmとかでも効くように.emacsに設定しる。
(setq auto-mode-alist
(append '(("\\.pm\$" . perl-mode))))
か?やってみそ。
748 :
nobodyさん :02/10/05 18:09 ID:17DAoS9d
どこもおかしくなければエラーは出ない。 取り敢えず、20行目を見よ。
>>748 なんでいきなり500エラーよ?
テストもせずにサーバで試してるのか?
最後に改行いれれ。
>>749 何もおかしくないと思うんですが。
>>750 どこの最後でしょうか?]
構文チェックすると
Can't find string terminator "EOF" anywhere before EOF at "perl.cgi" line 29.
と出たのですが、40行目にちゃんとEOFで閉じてるのでおかしくないと思うんですが。
752 :
751 :02/10/05 19:08 ID:???
失礼しました。なんか40行目の後に空白が入ってる為 おかしくなってたようです。 あと、時刻の取得がうまくいかないようなのですが、 (表示が正確に出ない) どう直せばよいでしょうか?(;´Д`)
>>752 PerlはCGIのためだけの言語ではありません。
Perlはとても柔軟で簡単なためCGIで最も多く使われていますが
CGIのために作られた言語ではなく、その他の学問的・業務的・
日常的な用途に広く利用されています。ご存知かもしれませんが
そのことをわきまえておいてください。ここで質問しても回答者
がいれば構いませんが、本当は、CGIに特化した質問は、
>>1 に書い
てあるように、この板にある以下のスレで質問してください。
CGIだけど、なんか質問ある?
【スクリプト改造工房 Part4】
CGIとかPerlとか初心者なんだけど
>>752 スクリプトを見た限り、「時刻の取得がうまくいかない」、「(表示が正確に
出ない)」というのは理解できません。うまくいくはずです。表示が正確に出
るはずです。どこがどううまく行かないのか説明しないと答えられません。
Perl は CGI ではありません。(GNU is Not UNIX)
756 :
nobodyさん :02/10/05 21:29 ID:apJJAmbi
フォームメールに添付ファイルを送信する機能をつけたいのですけど、 どう書けば出きるでしょうか?
757 :
nobodyさん :02/10/05 22:29 ID:EJw02ifJ
プログラム版から追い出されました(泣く) つまんない質問なんですけどFILEアップロードするプログラムなんですけど <input type=FILE>でUPするとたしかにプログラムは動くのですが ファイル名を表示することができません。 cgi.libをつかっています $IN{’’}でとってきてprintとすると文字がばけます エンコードするのですか? よくわかりません。初心者です。
正規表現でお聞きしたいことがあるのですが、 色々<SPAN>fiarla</SPAN>日本語<SPAN>tegsgs</SPAN>何か <SPAN>aretgsda</SPAN>テスト<SPAN>aretgsda</SPAN>マトリックス<SPAN>vxchgf</SPAN> と言う文字列を 色々日本語何か\nテストマトリックス だけにしたいのですが s/<span><\/span>//ig; にすると "色々何か\nテストマトリックス" になってしまいます。 どうしたらいいでしょうか?
s/<span[^>]*>.*?<\/span>//gi; かな・・・
760 :
太郎 :02/10/05 22:58 ID:JyTnPr2r
761 :
nobodyさん :02/10/05 23:01 ID:ojGyzDqf
サイトに掲示板をつけたいのですが用語等よくわからない所がいくつかあり 困っています。 どなたか以下の文をわかり易く説明ください。 パソはウィンドウズ2000です。 >public_html (ホームディレクトリ) の下に、「bbsディレクトリ」を作成し、 さらにその下にロックファイル用ディレクトリ「lockディレクトリ」と過去ログ用ディレクトリ 「pastディレクトリ」を作成します。 ホームディレクトリってどこにあるのですか?
>>756 >>757 「multipart/form-data」について検索後、
不明な点をまとめて適切な板・スレで再度質問して下さい。
>>761 「ドキュメントルート」について検索後、
不明な点をまとめて、その掲示板プログラムの作者のサイトか、
適切な板・スレで再度質問して下さい。
>>755 「GNU」「UNIX」「Perl」「CGI」について検索後、
適切な比喩を再度考え直して下さい。
>>757 メインCGIから$incfn{'ファイルを受け取るキー名'}
でファイル名自体にアクセスできる。
イレギュラーで気持ち悪い利用に仕方でよければ。
>763 >「GNU」「UNIX」「Perl」「CGI」について検索後、 >適切な比喩を再度考え直して下さい。 ばーかばーぁ
掲示板で、ログファイルをダウンロードさせようとしているのですが print "Content-type: zip/i\n\n"; print; このようにブラウザで表示しないコンテンツタイプを与えているのですが unixだと動くのですが、Winだと空ファイルになってしまいます。 よい方法はございませんでしょうか?
おまいら暇だな!
768 :
nobodyさん :02/10/06 18:31 ID:93CgaJbg
SQLはわかりますが全くの初心者です。 CGIでできることを(商品注文フォーム、カート)などをあえてPHPや CFでやりたいと思いますが、どっちの方が初心者に易しいでしょうか?
770 :
nobodyさん :02/10/06 19:14 ID:MFc5Z8S/
771 :
nobodyさん :02/10/06 19:17 ID:TUOpefL4
質問。 ファイルの削除をしたかったので $deletecount = unlink( $DeleteFileName ); こう書いたんですが反応なし。戻り値も0。 ファイル名は相対パスで正しい。 削除できない理由は何でしょう?
>>771 あんたは誰。ファイルの所有者は誰。ってこと。
774 :
771 :02/10/06 19:54 ID:TUOpefL4
>>772 レスありがとうございます。
しかし。読み書きできて削除が出来ないということがありますか?
削除できないのでしょうがなくこうしました。
open( OUT, "> $DeleteFileName");
close( OUT );
こう書くとちゃんとファイルサイズを0(ゼロ)にはできるんですけど。
ちなみに、削除したいファイルは同じcgiが過去に吐いたファイルです。
775 :
nobodyさん :02/10/06 19:56 ID:E7XA3HNJ
WAS4.01でWebアプリ作ってまっす。 JSPが途中で切れてコケます。 でもプロキシ通して同じJSPを表示させると切れません。 なにか考えられることってありますか?
776 :
771 :02/10/06 20:14 ID:TUOpefL4
試しにフォルダもファイルも全て777にしてみたのですが変化無し。 パーミッションの問題ではないような‥‥? ftpから削除することは可能です。
777 :
nobodyさん :02/10/06 20:34 ID:MFc5Z8S/
>>776 たぶん、なにか見落としがあるんだよ。
単純にテストするだけのスクリプト書いて実行してみ。
ファイル名も変えて、相対パスもやめてカレントでopen,unlinkを実行。
779 :
771 :02/10/06 21:04 ID:TUOpefL4
>>777-778 うおー!
$!をprintしてみたら"No such file or directory"でした!
しかし、なぜだっ!?
if ( -e "$DeleteFileName" ) {
print "$DeleteFileName は存在します。" ;
} else {
print "$DeleteFileName 存在しません。" ;
}
としてみたら、たしかに「存在しません。」のほうがprintされるけど。
なぜだっ?!
なぜ書き込みは出来るのか‥‥?
カレントのファイルを扱うようにしてみましたが症状は改善してません。
んでもこれで手がかりが見つかったような、気が。
ありがとうございます。もーちょい研究してみます。
780 :
775 :02/10/06 21:04 ID:E7XA3HNJ
誘導ありがとうございました。 そのスレ死んでましたのであきらめます^^;
781 :
775 :02/10/06 21:08 ID:E7XA3HNJ
あ、なんでPerlのコーナーに書いてしまったんでしょう・・・ 逝ってきます。
782 :
771 :02/10/06 21:08 ID:???
わ、わかりました。鼻水が出ました。 ファイル名の最後に空白文字が入ってました。 printさせても見えないから気付きませんでした‥‥。 ありがとうございました‥‥。
783 :
771 :02/10/06 21:09 ID:???
(ファイル名ってのは$DeleteFileName変数のほうのこと、です)
print "[$var]"とするのは基本ですね
787 :
:02/10/07 11:09 ID:???
複数のtxtファイルを読み込んで、txtの中身を並べたひとつのhtmlで 書き出すというのをやっているんですが、ファイルの更新日の新しい順に並べて出力したいんです。 stat()[9]の値を比較するんだと思うんですけどアホなのでそこから先に進めません。。
>>787 一個ずつ開いて、ファイル名とstat()[9]をハッシュに入れて閉じる。
foreachでハッシュをvalueでsortしながらkeyをopenで
開きつつprintする。
一回ごとにclose FILEしないとファイルが壊れるかも知れんので 注意汁。
>>787 こんな感じか?
my(@f_list,%files);
opendir(DIR,'.');@f_list = readdir(DIR);closedir(DIR);
foreach(@f_list){next if(/^[\.]+$/);$files{-M "$_"} = $_;}
foreach(sort {$a<=>$b} keys %files){
open(TXT,"$files{$_}");
while(<TXT>){
print;
}
close(TXT);
}
791 :
nobodyさん :02/10/07 12:53 ID:UDwaJ+AD
cronというのを調べようと思ったんですが 自分の持っている本独習perl、実践入門perl、CGI&Perlポケットリファレンスには cronなど載っていませんでした。なぜでしょうか。
>>787 こんな感じ?
>>790 とは違って先頭がピリオドで始まるファイルは全てスキップするけど。
opendir DIR, '.' or die $!;
foreach (sort { (stat $b)[9] <=> (stat $a)[9] } grep{ not /^\./ } readdir(DIR) ){
open IN, $_ or die $!;
# 適当に加工して出力
close IN;
}
closedir DIR;
>>790 /^[\.]+$/という正規表現は読みにくいよ。/^\.+$/で十分。
>>791 Perlとは何の関係も無いからね。書籍ならUnixのコマンドリファレンス系で調べてみてね。
あとはGoogleね。
my %files; opendir(DIR,'.'); while (readdir(DIR)) { $files{$_} = -M $_; if !-d $_; } closedir(DIR); foreach(sort {$files{$a}<=>$files{$b}} keys %files){ if (open(TXT,$_)) { print while (<TXT>); close(TXT); } }
796 :
nobodyさん :02/10/07 13:17 ID:UDwaJ+AD
>794 調べたらUNIXで使えると書いてありましたが、自分はwindowsなんですけど 無理ってことですか?CGIを自動で動かしたいんですけど。 プロバイダーも許してるところが少ないらしいし。。
>>796 ごめんなさい、Windowsで同等の機能を持つものはわりません。
>>787 use IO::File;
use IO::Dir;
my %date;
my $dh = new IO::Dir('.') || die;
for(sort {($date{$a}||=-M $a) <=> ($date{$b}||=-M $b)} grep -f $_ , $dh->read ){
my $fh = new IO::File($_) || next;
print <$fh>;
}
>>792 ,797
( ´,_ゝ`) プッ
>>793 statやファイルテスト演算子はコスト高いのでキャッシュしたほうがよいと思う
>>795 キャッシュするのはいいけどループが無駄だと思う。
>>796 at --help
>>800 grep使うほうが無駄
っていうか、grep自体ループしてまわしてるのと変わらん
ファイルハンドルはwhileで一行づつ処理するのが
一番速いし、メモリーも食わない
print <$fh>とかが一番最悪
{($date{$a}||=-M $a) <=> ($date{$b}||=-M $b)}
はさらに無駄
ファイル演算子はコストでかいのよ
これだと、二回呼び出してるでしょ
Perl厨の自己満足オナニーコードにはほんと辟易するね
perlのLWPモジュールでいくつかのHPを取得するとこまで できたんですが、ファイルに保存しないで、ストリーム っていうのかな、流れてきた文字列に日本語の単語一語の 検索かけて、それが入ってる文(。から。まで)だけを取 り出すようなことできますか? よろしくおながいします。
>>800 なるほど確かにstatの結果はキャッシュするべきだね。
>>801 まあまあ落ち着きなさいって。
確かにprint <$fh>は好かないけど、
{($date{$a}||=-M $a) <=> ($date{$b}||=-M $b)}
これは問題ないでしょ。一度statしたファイルに対しては二度とstatしないから、
必要最低限のstatしか行わないよ。
804 :
801 :02/10/07 15:46 ID:???
>>803 なるほど、||=か...
っていうか、最初にキャッシュするのと変わらないような
一行にしたいだけか
えっと、あの、そこで
>>802 にお答えいただけましたら、っと、
幸いでござります。
>>802 CGIスレで質問したってことを一言断った方がいいかも。私は気にしないけどね。
LWPで"getline"相当のことは難しそうなんで、一旦splitするのが無難かなぁ。
my $contents = $res->as_string();
foreach (split /\n/, $contents) # while(<IO>)みたいなもの。ただし改行は含まれない
{
print $_, "\n" if /pattern/;
}
またはIO::Scalarを使うとか。
use IO::Scalar;
tie *SH, IO::Scalar => \$contents;
while (<SH>)
{
print if /pattern/;
}
>>805 そんなに急ぎの質問?
皆ボランティアで答えてるんだからもう少し気長に待ってもいいんじゃないのかな。
>>806 どもCGIでレス待ってたんですが途切れちゃったもんで。
いやー、お詳しいですね。2通りのやりかたでやってみる
ことにします。どうもありがとうございました。感謝の
気持ちです。m(_ _)m
/\
/イヨー \
/大統領! \
>>807 あ、絵を書いてる間にレスしてくださったんですね。
はい、時々言われます。せっかちな性分なんです。
すみませんでした。
うわー、すばらしいお答えいただいといて申し訳ないですが、
よく見てみますと、
>>806 では、受け取ったHPを$contentsとか
<SH>に格納するんですね。これが大容量になると(例えば100
ファイルとか)、やはりまずいかなーと。大きさはかって制限
すればいいことはいいですが。
漏れが考えてたのは、cat file | grep "string" みたいに、
ストリームで処理できないかなーということだったんです。
それは無理ですか。
>>810 たびたびスレ汚しスマソ。考えてみたら、受け取ったファイル1個
毎に上の処理すればいいので、
>>806 でできそうです。ありがとう
ございました。
812 :
787 :02/10/07 16:36 ID:???
皆さんありがとうございます。 いろいろ試してみます。
@files = map { $_->[ 1 ]} sort { $a->[ 0 ] <=> $b->[ 0 ]} map{ [ (stat $_)[ 9 ], $_]} @files;
perl -MCPAN -e shell を実行した時に、初回だけ、ミラーサイトを選択するメッセージが出ますが、 後から、そのミラーを変更したい場合は ~/.cpan/ 以下のどのファイルの どのエントリーを変更すればいいのでしょうか? ほしいファイルが今のミラーにないようで、困っております。
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
>>815 /usr/lib/perl5/5.8.0/CPAN/Config.pm を $HOME/.cpan/CPAN/MyConfig.pm
にコピーし、`perldoc CPAN`の"CONFIGURATION"セクションを参考にしつつ適切に書き換えてください。
Test::Exception というモジュールがどうしてもインストールできません。 1.---- Unsatisfied dependencies detected during [A/AD/ADIE/Test-Exception-0.12.tar.gz] ----- とエラーがでる 2.Test::Exceptionをmake testして失敗した後、Sub::Uplevelというのを make testして Test returned status 1 (wstat 256, 0x100)という結果になって 3.再度Test::Exceptionをmake testして /usr/bin/make test -- NOT OK Running make install make test had returned bad status, won't install without force となって終了します。どなたか同じこと経験された方いらっしゃいませんか?
819 :
nobodyさん :02/10/08 13:55 ID:1one6uxb
[0-9]+ これだと数字が1文字以上続いた場合ですけど 数字が5文字以上続いた場合はどう書けばいいですか。
>>119 [0123456789][0123456789][0123456789][0123456789][0123456789]+
>820 ありがとうございます。
>>119 [0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]*
824 :
821 :02/10/08 14:45 ID:???
>>824 [0123456789][0123456789][0123456789][0123456789][0123456789]+
これは長くて、コードは短いほどいいと思うんですけど、
[0-9]{5,}とどっちが優れてるんですか?
すいませんここで質問していいのか良く分からないのですが。 画像アプローダみたいな物を作りたいのです、 アップロードまではperlでできるというようなことはわかりました。 そのあと、jpgの画像をサーバー内で縮小させたりしたいのですが、 どんなものが必要ですか?
>>825 >>824 はネタれす。ネタニマジレス、アリガトン
コンパイルされるときは同じになるんじゃないかな。
省略記法の方が遅くなることえてしてあり。
>>818 私はWinだけど、問題なく成功してしまったなぁ…。
とりあえず、OSとPerlのバージョン、何のテストが失敗したか
くらないとアドバイスのしようがないよ。
>>818 すみません。
RedHat7.2
perl5.6
perl -MCPAN -e shellにおいて
install Test::Exception
とした場合に自動実行されるTest::Exceptionのmake testでエラーが出ました。
s/くらないと/くらいないと/
>>830 いやいや、"エラーが出た"だけじゃなんとも言えないよ。もっと詳しく。
例えば、makeするとこんな感じのログが表示されると思うけど:
C:\Perl5.6\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\li
b', 'blib\arch')" t\caller.t t\documented.t t\Exception.t t\pod.t t\preserve.t t
\return.t t\stacktrace.t
t\caller........ok
t\documented....ok
t\Exception.....ok
t\pod...........ok
t\preserve......ok
t\return........ok
t\stacktrace....ok
All tests successful.
Files=7, Tests=35, 2 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
D:\bin\dmake.exe test -- OK
この中央の"t\*...ok"(Unixだと"t/*...ok")がモジュールのテストだから、
これらのどれが"not ok"となったか、また"not ok"の後ろに何か表示されたか(あれば)、を書いてね。
832 :
nobodyさん :02/10/08 17:47 ID:lB7AvP/O
%TV = ( flintstones => { series => "flintstones", nights => [ "monday", "thursday", "friday" ], members => [ { name => "fred", role => "husband", age => 36, }, { name => "wilma", role => "wife", age => 31, }, { name => "pebbles", role => "kid", age => 4, }, ], },
834 :
833 :02/10/08 18:31 ID:???
jetsons => { series => "jetsons", nights => [ "wednesday", "saturday" ], members => [ { name => "george", role => "husband", age => 41, }, { name => "jane", role => "wife", age => 39, }, { name => "elroy", role => "kid", age => 9, }, ], },
835 :
833 :02/10/08 18:31 ID:???
simpsons => { series => "simpsons", nights => [ "monday" ], members => [ { name => "homer", role => "husband", age => 34, }, { name => "marge", role => "wife", age => 37, }, { name => "bart", role => "kid", age => 11, }, ], }, );
836 :
833 :02/10/08 18:38 ID:???
これはらくだ3版にあった例ですが、このような複雑なレコードをファイルに 保存して、動的にデーター構造を作る方法について、ご相談があります。 具体的には、アンケート調査で得られた、各団体の属性をperlで処理するために 複雑なレコードデータを、一旦テキストファイルに保存する必要があるのですが、 一般的には、このくらいの複雑さであれば、どのような形式でテキストファイルに 保存するのが一般的なのでしょうか(あるいは、この程度の複雑さであれば単純に ○○使うといい、というものでも結構です)。 私は学生ですし、初めてこのような処理を行うため、 社会人で複雑なデータ構造を構築された経験のある方なら、こういう場合、 どのように判断されるのかなと思い、質問させていただきました。
838 :
826 :02/10/08 23:09 ID:???
839 :
597 :02/10/09 02:56 ID:???
$i = 1; foreach $value (@value){ if($i == 11){ last; } print $i\n; $i++; } こうすれば10まで表示したらforeachを抜けますよね?
>>840 10回ループしたら抜けます。つーか、ループさせる回数が決まっているのなら
foreach を@value でまわさずに$iで書いた方がわかりやすいです。
foreach $i (1..10) {
print $i, "\n";
}
で、質問はそれだけなの?
842 :
:02/10/09 16:27 ID:???
CGIでWEBにあるhtmlをCGIのあるディレクトリへ保存するスクリプト作ってるんですけど、保存するファイル(html)が50くらいあります。 で、それに1つづつリクエストするわけですが、どう考えても重いんです。 50回リクエストするんだから当然と言えば当然だと思うんですけど、ブラウザで50ページ分開くのと同じですよね。 実際CGIを回したら40ページくらい保存したとこでCGIは「このページは表示できません」となりました。 その間、1分30秒くらいでした。こういうのってやっぱりサーバーに負担がかかるんでしょうか。 どっちにしろこのままじゃ途中でタイムアウトしちゃうので半分くらいに分けて 途中でhtmlを吐き出して、「残りの半分をダウンロード」とかいうボタン付けて続きをリクエストしようと思うんですけどこのやり方はどうですか。
843 :
840 :02/10/09 16:50 ID:???
>841 なるほどそういう書き方もあるのですね。 ありがとうございます。
>>842 ブラウザのタイムアウトかな?ってきがするんですが
1. 1ページ保存する毎になにかprintするようにする。
2. forkして、プロセス切り離してcgiはいったん終了する
3. そのとおりNページ毎に処理をわける
とかが、結構一般的かと、、、
845 :
nobodyさん :02/10/09 17:37 ID:1+Y7R6lC
CGI.pm を使ってCGIを書いています。 my $query = new CGI; my $value = $query->param("text"); print $query->header ( -type=>'text/html; charset=euc-jp' ), $query->start_html ( -title=>"値の表示", -lang=>'ja' ), $query->h1($value . "の値"), $query->end_html; として$valueを取得して表示する場合、 文字コードの扱いはどうなるんでしょう? 自分は、クライアント環境のコードがそのまま 飛んでくるだろうと考えていたのですが、 UNIX上のブラウザから試してもWindows上のブラウザから 試しても化けずに表示されました。 もしかして、CGI.pm は適切に文字コードを変換するところまで やってくれているのですか?
846 :
:02/10/09 18:28 ID:???
848 :
nobodyさん :02/10/10 04:01 ID:MdydjVId
ttp://www.rescue.ne.jp/cgi/form2mail/ ↑この添付ファイル対応のフォームメールスクリプトを設置してみたんですが、
添付したファイルが(画像でテスト)、ぐちゃぐちゃになって送られてきます。
小さいのだったら、いけるんですが、大きくなると・・・
で、以前どこかで、httpの仕様で、何kbまでしか云々ってのを読んだんですが、
ソレのせいでしょうか?
考えられる理由を教えていただけないでしょうか?
849 :
nobodyさん :02/10/10 04:46 ID:ZvzQ38ZZ
そこのHPの説明書見たら「字数制限あり」とかに設定できるように なっているよ。誰が設定したのか知らんが、設定した人に字数制限 をしているのかどうか聞いてみたら? もしもそうなら、画像ファイルをテキストにしたメールが制限に引っか かって後半がちょん切られいるからぐちゃぐちゃになると思う。 あと、「添付した画像がぐちゃぐちゃになる」なんて言われるよりも 画像にする前のテキストがどうなっているのかを言ってくれる方が 対処しやすい。 それとHTTPの仕様で…なんて話はないです。もしも本当に読んだのなら そのバカライターをここで晒してくれ。友達に聞いたのなら晒さなくてもいい けど、100%鵜呑みにするべき人じゃないということです。
850 :
848 :02/10/10 08:21 ID:Z9fpt7At
>>849 設定したのは自分です。
>※1 ファイルアップロード可能 字数制限なし(実際は2^17=131072bytes以内)
><form action="form2mail.cgi" method="POST" ENCTYPE="multipart/form-data">
↑これにしたんで、あってると思うんですが・・・
で、送られてきた画像は、gifなら、
おっしゃるとおり、半分くらいが、ちょん切れてます。
jpegなら、パズルでばらばらにされたようになるんですが・・・
これは、圧縮形式の違いで、両方、破損してるのは、間違いないと思います。
>画像にする前のテキスト
この辺が、おっしゃってる意味が、ちょっとわからないんです。
このフォームを使って何か画像を送り、
送る前の画像と、送った後の画像の拡張子を.txtにして、報告しろ
っていう意味でしょうか?(メチャクチャ言ってたら、ゴメンなさい)
>httpの仕様
そうですか、友達に聞いたとかじゃなくて、掲示板かどこかで、
見たんです。(2chだったかも)
おそらく全く別の話か何かだったんでしょう。スイマセン。
>>850 送られてきたSTDINを何も処理せずにファイルに書き出して見れ。
852 :
848 :02/10/10 09:15 ID:rBn0TZDO
>>851 main7.gifを送ったんですが、↓この辺のことでしょうか?
-------------------------------7d238f34a0412
Content-Type: application/octet-stream; name="main7.gif"
Content-Transfer-Encoding: X-uuencode
Content-Disposition: attachment; filename="main7.gif"
begin 644 main7.gif
・
・
・
853 :
848 :02/10/10 09:30 ID:Y9RZ82Gy
>>851 >>852 は、なんでもないです。
で、その処理する前のモノは、cgiをいじらないと取り出せないのでは?
854 :
しろうと :02/10/10 11:22 ID:rv3sQjTv
はじめまして.ちょっと教えて下さい.
web初心者なりにがんばって,アクセス解析用フリーCGIスクリプトのefStat
(
ttp://www.skipup.com/~fuka/ ) というのを設置してみたのですが,アクセス
解析結果の検索ワード欄が文字化けしてしまい,調べてみると,どうも日本語
文字コードを扱うルーチンjcode.plというのが古すぎて,Jcode.pmというのに
変えなければならないということが分かりました.
ところが,闇雲に jcode.pm その他を cgi-bin/fstat/lib/ 下に置き,
fstat.cgi (アクセス解析スクリプト) を実行すると Internal Server Error
になってしまいます.
/usr/local/apache/logs/error_log を見ると,
Can't locate object method "new" via package "Jcode" at lib/start.pl line 62.
Compilation failed in require at /home/****/public_html/cgi-bin/fstat/fstat.cgi line 111.
[Wed Oct 9 15:57:38 2002] [error] [client ***.***.***.***] Premature end of script headers: /home/****/public_html/cgi-bin/fstat/fstat.cgi
こんな感じでした.
サーバはRH Linuxの7.0か7.1程度,Perlのバージョンは5.6.0です.
Jcode.pm利用への手順など,簡単に教えて頂けませんでしょうか?また,サー
バのrootに何かしてもらう必要はありますか?
宜しくお願いします.
855 :
849 :02/10/10 12:02 ID:ZvzQ38ZZ
>>850 画像でもオフィス文書でもメールに添付するときにはMIME BASE64というエンコード
で、テキストに変換しているのです。 Outlook Expressなどのメーラは、そういう生の
データを見る方法があるのかどうなのかしりませんが、
------------92AECG1NXU3WZAT
Content-Type: audio/x-midi;
name=Setup.exe
Content-Transfer-Encoding: base64
Content-ID: <B1i55vjBs7G1k>
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA4AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v
ZGUuDQ0KJAAAAAAAAABxdTv8NRRVrzUUVa81FFWvTghZrzEUVa+2CFuvNxRVr90LX68gFFWv3QtR
rzcUVa9XC0avPhRVrzUUVK+OFFWv3QterzoUVa+NElOvNBRVr1JpY2g1FFWvAAAAAAAAAABQRQAA
TAEDAF1Flz0AAAAAAAAAAOAADwELAQYAAMAAAAAQAAAAQAYAQA0HAABQBgAAEAcAAABAAAAQAAAA
AgAABAAAAAAAAAAEAAAAAAAAAAAgBwAABAAAAAAAAAIAAAAAABAAABAAAAAAEAAAEAAAAAAAABAA
添付書類はこういう感じになって普通の文章の後ろについています。
だから、そういったメールを見て、ちょうど何文字くらいで切れているとか
何行くらいで切れているとかというのがわかれば、そこらへんに原因が
あるのかなぁと。
856 :
nobodyさん :02/10/10 12:05 ID:ZvzQ38ZZ
856さん, ありがとうございました.要点は,システムへのインストールが必要なので, root に頼んで,きちんとインストールしてもらわなければならないものだと いうことですよね? 何となく分かってきました.ありがとうございました.
858 :
848 :02/10/10 12:31 ID:0YXqHo+t
>>855 あ、やっぱ、ソレだったんですか・・・
852から始まって、最後5行が、
・
・
・
MARSRR"27;+(PO:&I3L<>^T4Q3IA<3#$C+IUL\\TXYZSSK36AP^+.0`<M]-!$
J`]VSLT4GK?323#>-%
[email protected] %17$FWU(R[]?/767'?M]==@AZU:(``[
`
end
-------------------------------7d238f34a0412--
↑こんな感じなんですが、コレじゃあわかんないですよね?
あ、コレ、Yahoo!のトップの画像なんですけど、(main7.gifってやつです)
859 :
848 :02/10/10 12:45 ID:???
>>858 の
> 852から始まって、
は
>>852 の
> -------------------------------7d238f34a0412
> Content-Type: application/octet-stream; name="main7.gif"
> Content-Transfer-Encoding: X-uuencode
> Content-Disposition: attachment; filename="main7.gif"
>
> begin 644 main7.gif
> ・
> ・
> ・
から始まって・・・って意味です
860 :
849 :02/10/10 13:48 ID:???
それを見る限りでは、いちおうbeginで始まって、endまで見えているからたぶん メールが途切れていることはないと思います。となると一から考え直しですが、 ぐちゃぐちゃになった画像ファイルはサイズも変わっていますか?
861 :
848 :02/10/10 14:10 ID:084tFYZP
>>860 Yahoo!Top画像(main7.gif) 6.67 KB (6,837 バイト)
メールを通したもの 6.63 KB (6,792 バイト)
です。若干縮んでますね。
>>861 サーバの OS は? Win系だったら
231: if (!open(OUT,"| $nkf -j | $sendmail -t")) { &error('Error'); }
232: binmode OUT; # 追加
233: $host = $ENV{'REMOTE_HOST'};
かも知れない。Win でパイプなんて使った事ないから、
binmode 要るのかどうか知らんけど。
863 :
nobodyさん :02/10/10 14:41 ID:Nn4CcN7j
>>861 cgiスクリプトの
if (-e "$tmp$filenum") { unlink("$tmp$filenum"); }
をコメントにして、アップロードが正常に出来ているか確認してみては。
./tmp/ディレクトリにアップされた画像を表示してみる。
異常だったらアップロードが変
正常だったらuuencodeが変
864 :
質問 :02/10/10 14:44 ID:???
ログ100行の中からwhileで10行処理するのと、 ログ200行の中からwhileで10行処理するのとは スピードは変わらないんですか?
865 :
:02/10/10 14:52 ID:???
>>864 具体的なソースを出してくれなきゃ、「そんなにかわらない」としか
言えない。けど、いまどきのコンピュータで100行の処理と200行の
処理で違いがでるほどのことがあるのかな。
866 :
質問 :02/10/10 14:55 ID:???
>>865 舌足らずですみません。
配列操作でないならスピードは同じなのか、ということを
知りたかっただけなので、100行と1兆行でもいいです。
867 :
862 :02/10/10 14:59 ID:???
ごめん、
>>862 は嘘。Win系だと臭いのはこっち。
413: if (open(UU,"$UUENCODE $tmp$filenum $filename |")) {
414:
415: @UUFILE = <UU>;
868 :
:02/10/10 15:02 ID:???
ケース倍ケースですよ。その処理をする10行というのがファイルを舐めまわさないと 見つからない、とかいうケースだと違いは大幅に出ますが、先頭10行出力、程度だと ほとんど変わらないでしょうね。
869 :
848 :02/10/10 15:05 ID:???
鯖OSは、Linuxです。 で、>861さんのをやってみたんですが、 ちゃんと表示されてました。 ってことは、uuencodeなんですよね?ヴァージョンでしょうか? でも、レンタル鯖にお願いすることもできないですし・・・ このまま、tmpのんをコメントアウトしといて、 自分でダウンしに行くっていう手をとるしかないかなぁ・・・ 何はともあれ、理由が解ってホッとしました。 有難う御座いますた! あ、もし「こうしたら?」みたいなのがあれば、 書き込んでくれると、嬉しいです。
plファイルの最後の、 1; __END__ これなんですか。
871 :
864 :02/10/10 15:11 ID:???
>>868 やはり変わらないんですね。
ありがとうございました。
>>870 1; がない場合、処理の結果に偽がある場合エラーになるます。
ちょっと勉強不足なんですけど、 use Socket; は大抵のサーバーで使えるんですよね? use IO::Socket; これは使える確立が低いんですよね?
そんなことは言い切れない。
875 :
:02/10/10 16:18 ID:???
>>873 Socket はperl5の標準モジュールですが、 IO::Socketは別途インストールする必要が
ありますから、使える可能性は低いですね。
負荷が掛からないよう制限してあるかも。
>>875 IO::Socketも標準だけど…(少なくとも5.005の時点では)
しかもIO::SocketはSocketのラッパーに過ぎないので、
Socketが使えてIO::Socketが使えないという状況は考えにくいよ。
878 :
873 :02/10/10 20:35 ID:???
参考になりました。
$*** という普通の変数を正規表現で見つける場合は、 「\$\w+」この書き方であってますか? でもこれだと $abc123 とかいう変数は123に反応しないんで間違ってるみたいなんですが。
/\$(?:\w+|\{\w+\})/
882 :
nobodyさん :02/10/11 13:56 ID:ZUcC5F8u
/\$(^w^)/
883 :
nobodyさん :02/10/11 15:08 ID:3YhC7jcn
Perlを使って、受信したメールの解析をしようとおもってます。 まずは、ヘッダの取得とボディの取得。たとえば、 Recieved: ヘッダは複数行にわたることがありますし、同じヘッダ名で複数 存在することがあるので、これは複数行を一つにまとめ、配列にいれる。 ](例) Received: 1 2 3 Received: a b c だったら、以下のように格納したいです $header{Received][0] = "1 2 3"; $header{Received][1] = "a b c";
884 :
nobodyさん :02/10/11 15:10 ID:3YhC7jcn
(続き) 本文は @0body に格納したいです。 以上を、まずやって、各行の内容をチェックして・・・・。 とおもっているのですが、いまだ超初心者のため、全然 うまくいきません どなたかおしえていただけませんか?
885 :
nobodyさん :02/10/11 15:55 ID:CDmI7Jp8
if (/$name/){ print; } 変数$nameにマッチするかどうかチェックするには こんな書き方でいいんですか?正規表現でも$が使わ れてるからよくないとは思うのですが。 うまくいったりいかなかったりするので、こういう 場合の正しい書き方教えてください。
886 :
nobodyさん :02/10/11 16:10 ID:dKGHWOFu
887 :
:02/10/11 16:42 ID:???
>>884 具体的に何を教えて欲しいのかはっきりしてくれませんか? Perl超初心者でも人間の初心者、日本語の初心者でなかったら、 何をやろうとして、こういうことをしたんだけど、こういう結果がでて ほしいのに実行結果はこうなりました、くらい書けないのか。
888 :
nobodyさん :02/10/11 20:15 ID:5ek4fUJV
まったくの初心者です。 入門本に載っているいちばん単純なソースをエディタで打ち込んで ブラウザからアクセスすると、500 Internal Server Errorとなります。 どこが悪いのでしょう? #!/usr/bin/perl use CGI qw(:satndard); print header; print start_html('Hello'); print h1('This is hello.cgi'); print end_html;
httpd のエラーログでも見なさい。
>>888 まずCGIの問題とPerlの問題に切り分けてください。
まずCGIがきちんとお約束どおりになっているかどうか
確認してください。プロバイダによっては、
#!/usr/bin/perl なのか #!/usr/local/bin/perl かに分かれますし、
ファイルのパーミッションもプロバイダから指定された通りになって
いるのかどうかを調べてください。
CGIだとエラーメッセージはwebサーバのログに
でますから、もしも自分でサーバを立てているとかで
サーバのログが見れるのでしたら、そこを見てください。
それが無理なら、
use CGI qw(:satndard);
use CGI::Carp qw(fatalsToBrowser);
という風にCGI::Carpをつけるとエラーメッセージがブラウザに
出ますので、とりあえずそれを見てください。
単純な質問で申し訳ありませんが,アクセスカウンタのログファイルが 消えることがあるのはなぜですか? 自作でアクセスログ取得機能付きのカウンタをつけてみたのですが, 3日に一度はカウンタ数などを記録するファイルが消えてしまいます. 消えないように気をつけるための注意点などあれば教えてください.
894 :
892 :02/10/12 01:51 ID:???
>flock(IN, 2); のように、読み込みなのに書き込み用ロックを実行している。 >open(OUT, "> $logfile"); のように、いきなりファイルを空にしている。
ありがとうございます. では,ひとつめはflock(IN,1)にすれば良いだと思います. でも,ふたつめはどのように解決したらいいんでしょうか…
896 :
892 :02/10/12 02:02 ID:???
open(OUT, "+<$logfile"); flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT "hogehoge\n"; close(OUT); みたいな感じかな・・・
なるほど.truncateなんて初耳です.. 早速そういうふうにしてみます. それでもダメでしたらまた来ますのでよろしくお願いします.
あと,関係無いと思いますが,hogehogeとはどういう意味があるのでしょうか.
899 :
892 :02/10/12 02:15 ID:???
hoge, bar, foo などは適当なデータに置きかえるという意味で書きます。
そうでしたか...理解しました.ホゲと言うんですか?
>>901 どうも.fooとbarはわかりましたが,hogehogeはホゲホゲなんですか?
なんか変ですね.かくかくしかじかみたいな感じか.
どうもありがとうございました.行ってきます.
905 :
nobodyさん :02/10/12 13:13 ID:kfRJ7swR
すいません。アクセスログを取りたいのですが #! c:/perl/bin/perl $LOGPATH = './log/'; #ログ保存ディレクトリ $EXPIRES = 3; #アクセスログ保存期間 # 日付の取得 $tm = time; ($sec, $min, $hour, $mday, $mon, $year,) = localtime $tm; $year += 1900; ++$mon; # アクセス情報の整形 $in = "$hour\t$min\t$ENV{'REMOTE_HOST'}\t" . "$ENV{'HTTP_REFERER'}\t$ENV{'HTTP_USER_AGENT'}\n"; # ログファイルへの書き込み open(FILE, ">>$LOGPATH$year$mon$mday.dat") or die("ERROR: open log-file."); eval{ flock(FILE, 2) }; seek(FILE, 0, 2); print FILE $ln; close FILE; # 古いログファイルの削除 $tm -= $EXPIRES * 60 * 60 * 24; ($sec, $min, $hour, $mdoy, $mon, $year) = localtime $tm; $year += 1900; ++$mon; $delfile = "LOGPATH$year$mon$mday.dat"; if(-e $delfile) { unlink $delfile; }
906 :
905 :02/10/12 13:14 ID:kfRJ7swR
↑だとサーバーエラーになってしまいます どこがおかしいのでしょうか? エラーログは [Sat Oct 12 13:06:54 2002] [error] [client 127.0.0.1] Premature end of script headers: c:/apache/htdocs/tendays/4-2.cgi です。
どこもおかしくないよ。
908 :
905 :02/10/12 13:25 ID:kfRJ7swR
>>907 えっ!?
それではこのエラーは何が原因ですか?
>>905 まず、こんなの効かないっしょ。
>#! c:/perl/bin/perl
あとここね。2行に分かれてるけど行末に転送時に\rが入っちゃってんじゃ
ねえの。
># アクセス情報の整形
>$in = "$hour\t$min\t$ENV{'REMOTE_HOST'}\t"
>. "$ENV{'HTTP_REFERER'}\t$ENV{'HTTP_USER_AGENT'}\n";
#! c:/perl/bin/perl ? Win? 出力はないんですね?
>>905 >print FILE $ln;
と
>$in= xxxxxx
の変数名の違い
912 :
911 :02/10/12 13:53 ID:???
おっとわすれてた、エラーが出るんですよね ログ内容からして、ヘッダが出力されていないよーって言ってます。
913 :
905 :02/10/12 13:59 ID:kfRJ7swR
みなさんありがとうございます しかし・・・・ ヘッダ出力させるにはどうすれば・・・
print qq(Content-type: text/html\n\n);
916 :
915 :02/10/12 14:54 ID:???
% cat aaa aaa bbb ccc ddd fff ggg % foreach i (`cat aaa`);echo $i;end aaa bbb ccc ddd fff ggg % とバラバラにしてperlの@lines=<>;でそれを aaa bbb ccc ddd fff ggg のように変形してSTOUTに出したいのですが…… 書き方が判りません。 助けてくださいませ。
foreach i (`cat aaa`);echo $i;end|perl -e '@a=<>;for $i (1..3){print shift @a unless $i!=1;}'
% cat aaabbbbbbbbb 36007 36045 36103 36115 36118 36136 36142 % perl -ane 'printf("(%d|%d|%d|%d|%d|%d|%d)\n",@F)' aaabbbbbbbbb (36007|36045|36103|36115|36118|36136|36142) といつもやってますが、%dを何度も書きたくないので、省略して書きたいです。
perl -ane 'printf("(" . join("|", ("%d") x 7) . ")\n",@F)' aaabbbbbbbbb
>>920 ( ´,_ゝ`) プッ 冗長になってる
924 :
nobodyさん :02/10/13 01:15 ID:yxI3IEPS
CGIの改造をしようと思うのですが、 if($ent_rate_extra && $line[12] < $ent_rate_border){ push(@line_temp, "$_\n"); next; } この行の前に、 $ent_rate_border = 10; を追加するとエラーが出ます。 javaをちょっとやった初心者ですが、 数値を代入しちゃ不味いですか。
925 :
hmk :02/10/13 01:23 ID:???
>>924 $ent_rate_border = 10;
を書き足すと、if文内が実行されるからエラーが出る。
next; は不要だから削除するとエラーは出なくなるよ。
927 :
924 :02/10/13 01:41 ID:???
>>925 レスサンクス。
サーバで直接実行しているので、具体的なメッセージはわかりません。
あーん、怒らないでね。
>>926 if文内が実行されるのですね。
やっぱり、しったかじゃ改造は無理みたいですね。
基本から勉強し直します。
928 :
924 :02/10/13 01:47 ID:???
やりたかったのは、現状 $line[12] < 50 で区分されるのを、10で区分したかったんです。 >if文内が実行 きっと今は、htmlから読み出された時に実行されるのですね。
929 :
924 :02/10/13 04:16 ID:???
あれから、いろいろやってみましたが、結局 if($ent_rate_extra && $line[12] < 10){ push(@line_temp, "$_\n"); next; } で、意図する物ができました。 お騒がせしました。
6桁以上の昇順整数表が作りたいです。 例 1(改行) 2 3 ローカルでfor($i=0;$i<100000;$i++)で配列作成と一回毎にファイルへの書き込む二通りをやってみたのですが、7000個(行)程度で新規ファイルを自動的に作成し、その後その新規ファイルを7000毎に更新して結局1〜7000、93000〜100000 の二つのファイルしかできませんでした。 次にfor文をネストして7000×15のファイルを作ろうと思い組んでみたのですが、ファイル名に変数が使えないため実現できませんでした。 6桁以上の連番ファイルを作成するにはどうしたらいいのでしょうか? ファイル名に上手く変数を使う方法や別の方法がありましたら教えてください。 言語はscriptとJavaなどを少しかじった程度です。
6桁以上って言っておきながら、いきなり例として1桁だが??? なにをしたいのかなにを聞きたいのかさっぱりわからん。説明する能力って大事ね。
932 :
bloom :02/10/13 18:02 ID:7jsv3n6x
933 :
930 :02/10/13 18:07 ID:???
>>931 すいません。
1〜100000までの整数を一覧にするコードの書き方を教えてください。
for ( 1 .. 100000 ){ print $_,"\n"; }
935 :
930 :02/10/13 18:23 ID:???
スレを汚してすいませんでした。もう結構です。
936 :
830 :02/10/13 19:03 ID:???
レスしてくださった方すみませんでした。 そもそもこのテストの意味から勉強しようと思います。 例えば、 /usr/bin/make -- OK Running make test PERL_DL_NONLAZY=1 /usr/bin/perl -Iblib/arch -Iblib/lib -I/usr/lib/perl5/5.6.0/i386-linux -I/usr/lib/perl5/5.6.0 -e 'use Test::Harness qw(&runtests $verbose); $verbose=0; runtests @ARGV;' t/*.t のように makeが成功すると t/f000....ok t/f001....ok t/f002....ok のようにテストが始まりますが、 t/f** のはすべてOKですが t/m004....ok t/m005....FAILED test 5 Failed 1/30 tests, 96.67% okay t/m006....ok のように t/m005でエラーが出ます。 エラー表示はFailed Test Stat Wstat Total Fail Failed List of Failed ------------------------------------------------------------------------------- t/m005.t 30 1 3.33% 5 Failed 1/48 test scripts, 97.92% okay. 1/2710 subtests failed, 99.96% okay. make: *** [test_dynamic] エラー 11 /usr/bin/make test -- NOT OK といった感じです。
937 :
830 :02/10/13 19:05 ID:???
あ、上はDate::Calcをインストールした時のです。
938 :
830 :02/10/13 19:26 ID:???
~/.cpan/build/Date-Calc-5.3にて perl -d -Iblib/arch -Iblib/lib t/m005.t を実行しました。何かわかることあるでしょうか。 ok 4 main::(t/m005.t:42): $n++; DB<1> main::(t/m005.t:44): Date::Calc->date_format(2); DB<1> main::(t/m005.t:45): Date::Calc->language(11); DB<1> main::(t/m005.t:48): local($date->[0][2]) = undef; DB<1> main::(t/m005.t:48): local($date->[0][2]) = undef; DB<1> main::(t/m005.t:49): if ("$date" eq '4 1-ago-2001') DB<1> main::(t/m005.t:50): {print "ok $n\n";} else {print "not ok $n\n";} DB<1> not ok 5
939 :
nobodyさん :02/10/13 20:04 ID:sWhCrFb+
URLエンコーディングする正規表現を超特急で教えてたも!
,一-、 / ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■-っ < 呼んだ? ´∀`/ \__________ __/|Y/\. Ё|__ | / | | У.. |
941 :
nobodyさん :02/10/13 20:09 ID:sWhCrFb+
タモさんちゃうって! でもタモさんでもいい!おしえてっ迅速に!
>>939 sub urlenc {
my($x) = @_;
$x =~ s/([\W])/sprintf("%%%02X",unpack("C",$1))/ge;
return $x;
}
かえ?
>>942 あっ、ありがとーございますっ!
( ・∀・)ノI ホウビジャ
@log=<LOG>; よりも、whileで1行ずつ書きこむ方がベストなんですか?
>>944 ベスト?ベターじゃない?
それ、お大尽スクリプトって言ってた人いたな。
メモリが許しゃ同じことだろうけど、あとの処理は、
かえって面倒じゃん。for(@log)でループでしょ。
む、書き込みって書いてあるね。じゃ、
>>946 撤回。
それで書き込みは、私にゃ分からんチン。
赤ラクダより 「7.4.2 空間の効率を上げるためのヒント」 ・配列操作やファイル全体を読み込むことを避ける。 「7.4.3 プログラマの効率を上げるためのヒント」 ・配列全体をいじったり、ファイル全体を一気に読み込んだりする。
949 :
944 :02/10/13 22:14 ID:???
ファイルを読みこんで配列に格納する、という意味でつ。 $#log=298; とかやるだけでログ行数が制御できるので配列を使おうと思ったんですが どかっと @log=<LOG>; とかやっちゃまずいのかなと。 それともどのみち全部配列に入れるなら同じなのかなと。
>>949 100Kgの重りを10回上げるか、10kgのを100回上げるかの違いだ。
951 :
944 :02/10/13 23:26 ID:???
>>950 やぱりメモリ的には変わらないわけすね。
>>944-951 1000行あるログファイルの100行目から199行目を処理する時、
@log = <LOG>;
@log = @log[99..198];
なら1000行分 + 100行分のメモリを必要とする。
while (<LOG>) {
push @log, $_ if $. == $start .. $end == $.;
}
なら1行分 + 100行分のメモリを必要とする。
…と理解してたんだが、もしかして違いますか?
>>952 $start と $end の値がわからん
954 :
952 :02/10/14 00:25 ID:???
>>953 ごめんなさい。
$start = 100;
$end = 199;
955 :
953 :02/10/14 00:29 ID:???
>>952 だったら、最終的にどっちも100行分で同じだけど、
@log = <LOG>; をやったほうは、全行分一気にメモリ食うからやばいかも
956 :
944 :02/10/14 00:58 ID:???
この辺まとめてるサイトとかないですかね?<メモリ消費 検索下手なもんでみつけられじ
糞固定出番だぞ(大爆笑嘲笑激笑)
958 :
nobodyさん :02/10/14 03:17 ID:1xBJawHO
「出番」ね・・・ 「出たぞ」に見えた・・・ 寝よう
結局コテハンで新スレを立てて欲しいみたいです この際コテハンでスレ立てるのを伝統としてしまいますか トリップは#コテハンで
DOS上で使うとき、.PLファイルを入れてあるパスを指定しなくてもいいようにする方法はないでしょうか? 今はいちいちこんな風に書いています・・・ C:>perl c:\tools\perl\scripts\aaa.pl よろしくおねがいします。
Spreadsheet::WriteExcel にあった write_arrays.plという サンプルですが、 my $worksheet1 = $workbook->addworksheet('Example 1'); my $worksheet2 = $workbook->addworksheet('Example 2'); my $worksheet3 = $workbook->addworksheet('Example 3'); my $worksheet4 = $workbook->addworksheet('Example 4'); my $worksheet5 = $workbook->addworksheet('Example 5'); my $worksheet6 = $workbook->addworksheet('Example 6'); my $worksheet7 = $workbook->addworksheet('Example 7'); my $worksheet8 = $workbook->addworksheet('Example 8'); なんてコードがあった。 もっと綺麗に書けませんか?
963 :
962 :02/10/14 10:31 ID:???
my @sh_nums = qw(1 2 3 4 5 6 7 8 ); for my $idx (@sh_nums ){ my $worksheet${idx} = $workbook->addworksheet("Example $idx"); } みたく書けませんか
for (1 .. 8){ my $wordsheet[$_]= $workbook->addworksheet("Example $_"); }
965 :
nobodyさん :02/10/14 10:40 ID:OizI25TP
しつもーん。 変数に格納した文字列の長さを得るにはどうしたらよかとですか?
length
967 :
965 :02/10/14 10:42 ID:???
C:\>cd c:\tools\perl\scripts と入力してカレントディレクトリを変更する。 c:\tools\perl\scripts> となるので、 perl aaa.pl で実行できる。
969 :
961 :02/10/14 11:25 ID:???
>>968 すいませんが、それでは aaa.pl が引数としてパスを求めるばあいに
perl aaa.pl g:\msc\include\aaa\bbb\ccc\
こんな風になってしまいます・・・
つまりはダ、Perlパスとカレントディレクトリはパス通しとけってこった
971 :
961 :02/10/14 11:30 ID:???
そのゴ、c:\tools\scripts\ を PATH に加えてみましたがだめでした perl には JGAWK の AWKPATH みたいなものは無いのでしょうか?
972 :
961 :02/10/14 11:33 ID:mVfsm4sP
あ、970を読んで、改めてやってみたらできました。 なんでさっきできなかったんだろ? ありがとうございました。
975 :
973 :02/10/14 12:57 ID:mVfsm4sP
ファイル内の文字列を一括して置換します。 比較文字列に正規表現が使えます。 perl gres.pl -e 's!and!or!' *.htm これでカレントにある htm ファイルの 'and' が 'or' に変わるはずだと 思うのですが、動きません。 欲しい・・・
976 :
973 :02/10/14 12:59 ID:mVfsm4sP
内容全部なら 's!and!or!g' です. 動きませんけど
978 :
973 :02/10/14 14:16 ID:???
perlは初級なので、こんなの無理です。
979 :
962 :02/10/14 14:44 ID:???
>>973 動かないって「どう動かない」のよ・・・
「perlは有効なコマンドではありません」だったら笑うしかないが
981 :
973 :02/10/14 15:35 ID:mVfsm4sP
そこまでバカではないです・・・ できれば試してみていただきたいのですが 以下は何もおきずに終わります。 perl gres.pl -e 's!and!or!g' *.txt 以下は"Processed 0 files." と表示されて終わります。 perl gres.pl -v -e 's!and!or!g' *.txt ファイルを見つけられないのかとファイル名を直接指定すると、 perl gres.pl -e 's!and!or!g' readme.txt BLOB(XXXX) ←こんなのが画面いっぱいに表示されて、readme.txt は 0 バイトになってしまいます。 もうわけがわかりません
質問があるんですが foreach (@HOGE) { ここで$_を使って; } foreach (@HOGE2) { ここでも$_を使ったら; } 何か問題ありますか?
何も問題ありません
>>982 じぇーんじぇん。
ループの中は、それぞれの制御子で読まれるデータが$_に入る。
985 :
962 :02/10/14 16:16 ID:???
何度もすみません。 どうしても理解できません。 何故、973のように配列に格納することが出来ないのでしょうか?
986 :
962 :02/10/14 16:17 ID:???
987 :
982 :02/10/14 16:25 ID:???
988 :
982 :02/10/14 16:25 ID:???
これで俺もプログラマーだ!!!!!!!!!!!
hoge.txtから読みこんだ行に含まれる$aaaというのを変数として使う方法はありますか?
#!/usr/bin/perl print "Content-type: text/plain\r\n\r\n"; print "Hello world!!\n"; これで俺もプログラマーだ! ところで次スレは?
>>990 $aaaだけでいいなら
$line=s/\$aaa/$aaa/g;
何でも対応なら
$line=~s/$([A-Za-z_]\w*)/${$1}/g;
993 :
992 :02/10/14 17:00 ID:???
2行目「~」が抜けた
994 :
990 :02/10/14 17:10 ID:???
>>992 「何でも対応」の方を
$line=~s/\$([A-Za-z_]\w*)/${$1}/g;(「\」を追加)
としたら動きました。ありがとうございました。
995 :
992 :02/10/14 17:11 ID:???
あれ?ちゃんとテストしたのに。動かなかったか。
,、-──────-、 / `ヽ、 / \ / \ / \ / ,r-ト-、 ,' f /⌒ヽ! ,' i L、-、ヽ\ ! ` `ー、 ) } \ ! `ゝf j \ .| ' ノ \ ! ,,、ノ∠, ヽ、`ー' ヽ ,,;彡'' / / ヾ、ヽ i 、 /シイノ ,'´ '; i { ヽ `ー,イ`二 ̄-'' i!| \_,r-rフヽ‐'´ '´ 、_ i! | i / ̄ ̄ ̄ ̄ ̄ ̄ | `‐' ノ`' '⌒ヽ-、,_ ヽ、 ノ | ,' < 1000は渡さん! !  ̄ 〉 ,r-ノ  ̄``ヽ、 ヽ /{ | / / \______ \ ( / ,,、ミ-‐''⌒! ヽ i / | | / / / \ `ー‐‐'´,,、、ミッ‐',∠ノ ̄`! ! | / | / / / \ 〈 r!=‐'´_,_// /、 ! | レ' / / `ヾ、ヾ \ ̄|~´ / ノ } | // `ヾ、 ヽ└---'´`` ノ ! /! // ,、-‐ / `ヾ、ヽ、_ , ''´ j / // / / \丶ー‐'´ '´ / ノ´ / / \` / /
記念パピコV(^o^)V
999 :
nobodyさん :02/10/14 17:52 ID:g9J1cXOv
age
1000 :
1000 :02/10/14 17:52 ID:g9J1cXOv
やたー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。