Perl コーディング初心者質問コーナー Part26
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/07/24 19:48ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0233あぼーん
NGNG0234nobodyさん
03/07/30 00:01ID:KKMTj9U0$name = 'c:\windows\system32';
$i = 0;
while($name =~ /\\/g){
$i+=1;
}
@match = ();
for($n=1; $n<=$i+1; $n++){
$a = '$path'.$n;
push(@match,"$a");
}
@match = split(/\\/,$name);
foreach $col (@match){
print "$col<br>";
}
がんばってこんな感じになりました。
けっこう長いです・・サブルーチンになりそう・・・
もっと簡潔な方法あれば教えてください。
0235234
03/07/30 00:06ID:KKMTj9U0$a = '$path'.$n;
push(@match,"$a");
これは、
push(@match,"%n");に変えます。
配列の全値をjoinでスカラ($match)に代入
そして、($match) =split・・・・
ってやるつもりだったんですが、$matchが展開されないってことに気づいて、
リファレンス良く見ると、そのまま配列でsplitできることがわかって、
$pathっての消すの忘れてました。
0236234
03/07/30 00:06ID:KKMTj9U0○ $n
何回もすいません。
0237nobodyさん
03/07/30 00:08ID:???>>1の
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
これを読め。結局何がしたのが伝わってこない
0238nobodyさん
03/07/30 00:08ID:???○結局何がしたいのか伝わってこない
0239234
03/07/30 00:09ID:KKMTj9U0簡潔な方法がないか聞きたかったんです。
けっこう長いから・・・
0241234
03/07/30 00:10ID:KKMTj9U0簡略なソースを求めるスレでないんですね。
どうもすいませんでした。
0243nobodyさん
03/07/30 00:13ID:???ただ単にソースをダラダラ書かれても困るだけ。
このスレの解答者はソース解析屋でもないんだから
0244あぼーん
NGNG0245nobodyさん
03/07/30 00:14ID:QkXS28T1ErrorメッセージがInternal Server Errorだけじゃ捗りませんよね。
0246nobodyさん
03/07/30 00:15ID:???0247234
03/07/30 00:17ID:KKMTj9U0ええと、このソースは、フォームから「文字列」と、「分解の基準になる文字列」(なんか分かりにくいかな・・
split(/aa/,"")←ここのaaの部分です。
で、フォームからだと、だれがどんな文字列もってくるかわからないでしょ?
だから、当然分解数も違う。
それで、分解数がはじめから分からなくても、ちゃんとsplitで分解する
っていうのが上のスクリプトなんです。
あぁ、説明下手で伝わらなかったらゴメン
0248234
03/07/30 00:20ID:KKMTj9U04行目の「で」は「受け取って、splitで分解するスクリプトなんです。」ですね・
なんか日本語変になってる
0249nobodyさん
03/07/30 00:20ID:???0251234
03/07/30 00:24ID:KKMTj9U0>>234のスクリプトは、フォームから「文字列」と「分解の基準になる文字」を受け取って、
それをsplitして表示する、というものです。
でも、フォームから送られてくるのは人によってまちまちだし、当然分解する数も違うので、はじめっから
($a,$b) = split(/$bunkaimojiretu/,"$mojiretu");なんてできません。
だから、上のようにまず、whileで「分解の基準になる文字列」の数を調べて、
次に、その数+1個分の値がある配列を作ります。
そして、その配列を分解
こうすれば、分解数がわからなくても、ちゃんとsplitしてくれる、そういうスクリプトです。
0252234
03/07/30 00:26ID:KKMTj9U0どうもソースが長いなぁ、と思い、簡略化できないかと聞いてみた次第です。
お手数かけてすみません。これでマシな日本語になりましたか?
0253nobodyさん
03/07/30 00:27ID:???なんでそんなことをする必要があるのか全然わからん。
@pairs = split /\&/, $STDIN;
foreach ( @pairs ) {
($k, $v) = split /=/;
$form{$k} = $v;
}
これでは何故いかんのか?
0254nobodyさん
03/07/30 00:29ID:???$name = 'c:\windows\system32';
foreach (split(/\\/,$name)) {
print "$_<br>";
}
もう飽きた。
0256234
03/07/30 00:29ID:KKMTj9U0僕がやっているのは、ブラウザからなんですよ。DOS窓じゃないんです・・・
0257213
03/07/30 00:30ID:???0258nobodyさん
03/07/30 00:30ID:???0259234
03/07/30 00:30ID:KKMTj9U0えと、この場合は、フォームからの文字列が、たとえば「c:\windows\system32」の場合の話ですよ〜
ってことです。
なにも言ってなくてスイマセン。
0260234
03/07/30 00:31ID:KKMTj9U0split(/$cut/,$name)くらいにしておけばよかったです。
誤解を招くようなこと書いてすいません。
0262234
03/07/30 00:33ID:KKMTj9U0初めの一行に「フォームからの文字列(c:\windows\system32)、分解の基準の文字(\)の場合の例」
と、一言かいておければよかったです。
無駄なレスさしてほんとに申し訳ないです。。
0263nobodyさん
03/07/30 00:34ID:???その台詞で貴様の技能がどの程度かよくわかった。
標準入力からだろうがブラウザからだろうが入力は入力だろうが。応用の利かない阿呆が。
0265234
03/07/30 00:37ID:KKMTj9U0え?STDINって、DOS窓じゃなかったんですか?
フォームのデータは、ReadParse使って、変数に格納してる状態なんですけど・・・
0266234
03/07/30 00:37ID:KKMTj9U00267nobodyさん
03/07/30 00:38ID:???>>263
はぁ、アフォだ。STDINなんかcgiで使えるわけないだろ、氏ね
0268nobodyさん
03/07/30 00:40ID:???0269234
03/07/30 00:43ID:KKMTj9U0標準入力、GETの場合は?以降を、分割するってことを言っていたんですね。
そういうことではないんです。
フォームから、好きな文字列とキーの文字を送ってもらって、
そのキーで「文字列」を分解するってことです。
GETの場合でいうと、
?moji=c:\windows\system32&key=\
それで、この「\」で「c:\windows\system32」を分解したいんです。
?moji=aiueo,kakikukeko,sasisuseso&key=,
こんなことです。
0271nobodyさん
03/07/30 00:47ID:???> 初めの一行に「フォームからの文字列(c:\windows\system32)、分解の基準の文字(\)の場合の例」
要は、ある文字列を分解の基準の文字で分解してリストにしたいって事?
split でいいんじゃねーの?って思うが、肝心な「期待しているリストにはこう入って欲しい」
みたいなこと書いてねーからさっぱり解らん
0272nobodyさん
03/07/30 00:53ID:???0273234
03/07/30 00:53ID:0qjcwLeTそういうことです。
それで、「ある文字列」も、「基準の文字」も、「何分割される」かも、分からない、という状況で、
どういうスクリプトで処理したらいいかといろいろ試行錯誤して、上のスクリプトができました。
それで、このスクリプトは正しいのか?、もっと簡単にできるんではないか?と思いまして、聞いてみました。
0274nobodyさん
03/07/30 00:56ID:???君はその事について未だ何も記述してないね
0275234
03/07/30 01:00ID:0qjcwLeT@match = split(/$kijun/,"$data")って処理されるわけですから、
基準の文字の数+1が必要な値になりますよね?
たとえば、\で切る、データが「a\b」だったら、2個という具合で。
だから、
@match = ();
for($n=1; $n<=$i+1; $n++){
push(@match,"$n");
}
ここで、その数だけ、配列の値を・・・・・・・・・・
あら、もしやこれ不要なんでは・・・
まさか、いらない・・・
あぁ、いらないんだ。。。
そーだったのか、アフォなことをした・・・・
0276234
03/07/30 01:02ID:0qjcwLeT$name = 'c:\windows\system32';
@match = split(/\\/,$name);
foreach $col (@match){
print "$col<br>";
}
これでいけたわ
すまんな、
0278234
03/07/30 01:05ID:0qjcwLeTでも、良く考えると、
push(@match,"$n")って、値がはいってるのに、
なんでc:とか変わってるのかと思ったら
あっはっは
0280234
03/07/30 01:06ID:0qjcwLeT@aaa = split(/$aa/,$bb)
ってすりゃぁ、
勝手に@aaaの値の数が調節されるんだな
あっはっは
すごいな、パールって
あっはっは
0281234
03/07/30 01:08ID:0qjcwLeTあっはっは
えらい迷惑かけちまってあっはっは
パールってのはすごい言語だ
あっはっは
俺としたことが・・
みんなこれ知っててだまってたんだろ?
まったく、恥かくぜあっはっは
0282234
03/07/30 01:10ID:0qjcwLeTforeach (split(/\\/,$name)) {
だったんだな
なんかほかの物に見えたよ。
この時点で答えでてんじゃん
あっはっは
俺ってどんくさいな
0283nobodyさん
03/07/30 01:11ID:???↓
0284nobodyさん
03/07/30 01:11ID:???では次の質問どーぞ!
0286234
03/07/30 01:19ID:0qjcwLeT授業でCあるからな・・
0288nobodyさん
03/07/30 01:26ID:???0289nobodyさん
03/07/30 01:32ID:???0290nobodyさん
03/07/30 01:33ID:???0293nobodyさん
03/07/30 02:14ID:???@ARGVがあれば、@ARGVが行入力演算子に割り当てられ、
@ARGVが空ならSTDINが割り当られる。
代入先がないので、読み出して捨ててる。
STDINが割り当てられたのなら、STDINを一行読み飛ばしている。
STDINにターミナルデバイスが割り当てていれば、一行待って、中身を捨てるということに。
(単なる改行待ち)
>>292
キーボードに関してはperldoc -q keyで、faq5辺りに情報が載ってますよ。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_can_I_read_a_single_characte
0295nobodyさん
03/07/30 03:25ID:JGELpVxkアクセスがあったらその間だけ
proxyサーバとして動作させ、目的のページを吐き出したら
proxyサーバを終了させる。といった感じですか?
それともproxyサーバとcgiproxyは別の原理ですか?
0296nobodyさん
03/07/30 03:31ID:chNZYbR6Perlのことで質問したいのですが。
変数名の一部に変数の中の数字を埋め込んで
その変数名を代入したいのですが
どのようにいくのでしょうか?
ちょっと、言葉では分かりにくいので例を挙げると
例えば、$a1 $a2 $a3という変数があって
$bの中に1〜3のいずれかの数字が含まれているとし
この$bの中の数字を変数名として使いたいのです。
これを
$c = '$a' . "$b";
といった感じでやれば$aの方はそのまま文字列として出て
$bの方は変数の中身が展開されて出ると思ってやってみたのですが
エラーが出てしまいます。
どなたかお助けください。
よろしくお願いいたします。
0297あぼーん
NGNG0298nobodyさん
03/07/30 03:57ID:???0300nobodyさん
03/07/30 10:34ID:???300 GET ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
0301nobodyさん
03/07/30 10:34ID:???なんでそういう発想になるんかね。
他の言語じゃそういう質問見かけないんだが(ないことはないと思う)。
やっぱソフトリファレンスのせいなんだろうか。
0302nobodyさん
03/07/30 11:00ID:???> すいません。
> Perlのことで質問したいのですが。
> どのようにいくのでしょうか?
> ちょっと、言葉では分かりにくいので例を挙げると
> どなたかお助けください。
> よろしくお願いいたします。
読みにくくなるだけだから無駄に6行も余計なことを書くな
0304nobodyさん
03/07/30 11:36ID:???まぁ、ちゃんと変数の整理が出来てないつーのと、変数のスコープを理解してないってことじゃないだろうか・・・
0305nobodyさん
03/07/30 11:53ID:???それはPerlの優秀な点である。
その分ユーザーのレベルが下がるのは仕方がない。
0306nobodyさん
03/07/30 12:32ID:???理解しないまま進んでしまうんじゃないかな。
0307296
03/07/30 13:22ID:VqnJP0e8print ${'a'.$b};
だとスカラ変数だとうまくいったのですが
配列の変数だとうまくいかないようです。
$sen1[] $sen2[] $sen3[]という変数があって
$randaに1〜3という値が入ていて
print("{${sen$randa}[$i]}");
のように書いたのですが、どうもうまくいかないみたいです。
0308nobodyさん
03/07/30 13:43ID:???ヽ(*`Д´)ノ むちゃくちゃやんけー!
0309nobodyさん
03/07/30 14:05ID:???モジュールまたがってソフトリファレンス使ってるソースを見たことがある。
最初どこから変数が湧いてくるのか理解できなくて気絶するかと思った。
……って、これはマ板ネタか。
>>307
勉強しなおした方が良いと思われる。
0310296
03/07/30 14:09ID:QHsgEgDpPerlは今回初めての仕様で、まだ慣れてないんで
お許しください。
外の括弧で囲めば、配列の[]が文字列として認識されずに済むと
聞いてやってみたのですが
もしかして、これはPHPの文法でしょうか?
0311296
03/07/30 14:10ID:QHsgEgDp0312あぼーん
NGNG0313nobodyさん
03/07/30 15:13ID:???print ${'sen'.$b}[$i];
あと >>299 >>304 >>306 >>309 を10回ずつ声を出して読んで!!
お帰りはこちら ↓
http://www.google.co.jp/
0314nobodyさん
03/07/30 15:17ID:???> $sen1[] $sen2[] $sen3[]という変数があって
ってのは@sen1, @sen2, @sen3ってことか?
perlの配列がわかってれば、こんな書き方にはならないと思うのだが。
${'a'.$b}という回答を貰っておいて${sen$randa}[$i]はないだろ……。
print ${'sen' . $randa}[$i];
0315nobodyさん
03/07/30 16:38ID:Nvxneeyiif(!open(FH, ">>file")){ print 'file open error'; }
else{
flock(FH, 2);
print FH 'abcde';
close(FH);
}
このように追記モードの場合、flockは必要になるの
でしょうか。
0316nobodyさん
03/07/30 16:50ID:???0317あぼーん
NGNG0320nobodyさん
03/07/31 05:53ID:INH5PtXx上(最初)から順ではなく、下(最後)から読ませることは出来ませんか?
0322nobodyさん
03/07/31 07:08ID:???有難うございました。
0323nobodyさん
03/07/31 10:39ID:???0325あぼーん
NGNG0326あぼーん
NGNG0327あぼーん
NGNG0328あぼーん
NGNG0329nobodyさん
03/07/31 12:08ID:???$t = time;
print "UTC =", timegm( gmtime( $t ) ), "\n";
print "UTC =", timelocal( localtime( $t ) ), "\n";
gmtime とか localtime で返してくる値を time で
返す値の形式に戻すコードってこんなんでいい?
テストしたら一応2つとも同じ値返す様になったけど…。
0330nobodyさん
03/07/31 12:56ID:???誰かのお墨付きが欲しいの?
0331nobodyさん
03/07/31 13:18ID:???UTC の解釈もチョット間違ってたし<自分
0332nobodyさん
03/07/31 13:32ID:???■ このスレッドは過去ログ倉庫に格納されています