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

Perl コーディング初心者質問コーナー Part26

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/07/24 19:48ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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あぼーんNGNG
あぼーん
0234nobodyさん03/07/30 00:01ID:KKMTj9U0
分解数がわからないsplitの場合、

$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>";
}

がんばってこんな感じになりました。
けっこう長いです・・サブルーチンになりそう・・・
もっと簡潔な方法あれば教えてください。
023523403/07/30 00:06ID:KKMTj9U0
すんません。
$a = '$path'.$n;
push(@match,"$a");
これは、
push(@match,"%n");に変えます。

配列の全値をjoinでスカラ($match)に代入
そして、($match) =split・・・・
ってやるつもりだったんですが、$matchが展開されないってことに気づいて、
リファレンス良く見ると、そのまま配列でsplitできることがわかって、
$pathっての消すの忘れてました。
023623403/07/30 00:06ID:KKMTj9U0
× %n
○ $n
何回もすいません。
0237nobodyさん03/07/30 00:08ID:???
>>234

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

これを読め。結局何がしたのが伝わってこない
0238nobodyさん03/07/30 00:08ID:???
×結局何がしたのが伝わってこない
○結局何がしたいのか伝わってこない
023923403/07/30 00:09ID:KKMTj9U0
>>237
簡潔な方法がないか聞きたかったんです。
けっこう長いから・・・
0240nobodyさん03/07/30 00:10ID:???
>>239
簡潔な「何をする」方法なのか?
024123403/07/30 00:10ID:KKMTj9U0
ここは、エラーがどうしても消えなくて、助けをほしい人がくるスレなんですね。
簡略なソースを求めるスレでないんですね。
どうもすいませんでした。
0242nobodyさん03/07/30 00:12ID:???
>>241
分かればよろしい。
0243nobodyさん03/07/30 00:13ID:???
どんな結果を言葉で示してくれないと答えようがない。
ただ単にソースをダラダラ書かれても困るだけ。
このスレの解答者はソース解析屋でもないんだから
0244あぼーんNGNG
あぼーん
0245nobodyさん03/07/30 00:14ID:QkXS28T1
デバッガ付きのPerl処理系ありますか?
ErrorメッセージがInternal Server Errorだけじゃ捗りませんよね。
0246nobodyさん03/07/30 00:15ID:???
perl -d
024723403/07/30 00:17ID:KKMTj9U0
>>243
ええと、このソースは、フォームから「文字列」と、「分解の基準になる文字列」(なんか分かりにくいかな・・
split(/aa/,"")←ここのaaの部分です。
で、フォームからだと、だれがどんな文字列もってくるかわからないでしょ?
だから、当然分解数も違う。
それで、分解数がはじめから分からなくても、ちゃんとsplitで分解する
っていうのが上のスクリプトなんです。


あぁ、説明下手で伝わらなかったらゴメン
024823403/07/30 00:20ID:KKMTj9U0
なんかダラダラ書いてるから日本語おかしくなってる・・・
4行目の「で」は「受け取って、splitで分解するスクリプトなんです。」ですね・
なんか日本語変になってる
0249nobodyさん03/07/30 00:20ID:???
日本語の解析も必要みたいです。
0250nobodyさん03/07/30 00:22ID:???
>>248
とりあえず、年齢とPerl歴、日本語歴をお書きになってください。
025123403/07/30 00:24ID:KKMTj9U0
ごめんなさい。書き直します。


>>234のスクリプトは、フォームから「文字列」と「分解の基準になる文字」を受け取って、
それをsplitして表示する、というものです。

でも、フォームから送られてくるのは人によってまちまちだし、当然分解する数も違うので、はじめっから
($a,$b) = split(/$bunkaimojiretu/,"$mojiretu");なんてできません。
だから、上のようにまず、whileで「分解の基準になる文字列」の数を調べて、
次に、その数+1個分の値がある配列を作ります。
そして、その配列を分解

こうすれば、分解数がわからなくても、ちゃんとsplitしてくれる、そういうスクリプトです。
025223403/07/30 00:26ID:KKMTj9U0
それで、自分なりにがんばってみて>>234ができあがったわけなんですが、
どうもソースが長いなぁ、と思い、簡略化できないかと聞いてみた次第です。

お手数かけてすみません。これでマシな日本語になりましたか?
0253nobodyさん03/07/30 00:27ID:???
>>251
なんでそんなことをする必要があるのか全然わからん。

@pairs = split /\&/, $STDIN;
foreach ( @pairs ) {
($k, $v) = split /=/;
$form{$k} = $v;
}

これでは何故いかんのか?
0254nobodyさん03/07/30 00:29ID:???
>>234

$name = 'c:\windows\system32';

foreach (split(/\\/,$name)) {
print "$_<br>";
}

もう飽きた。
0255nobodyさん03/07/30 00:29ID:???
>>252
うん。よくわかった。
025623403/07/30 00:29ID:KKMTj9U0
$STDIN???
僕がやっているのは、ブラウザからなんですよ。DOS窓じゃないんです・・・
025721303/07/30 00:30ID:???
収束してから書き込もう…
0258nobodyさん03/07/30 00:30ID:???
split(/\\/,$name)は\で区切った配列になるのだ。
025923403/07/30 00:30ID:KKMTj9U0
>>254
えと、この場合は、フォームからの文字列が、たとえば「c:\windows\system32」の場合の話ですよ〜
ってことです。
なにも言ってなくてスイマセン。
026023403/07/30 00:31ID:KKMTj9U0
そうですね。この場合は、ちゃんと
split(/$cut/,$name)くらいにしておけばよかったです。
誤解を招くようなこと書いてすいません。
0261nobodyさん03/07/30 00:33ID:???
>>260
おまい、どんどん頭よくなっていくなぁ・・。
026223403/07/30 00:33ID:KKMTj9U0
すいません。
初めの一行に「フォームからの文字列(c:\windows\system32)、分解の基準の文字(\)の場合の例」
と、一言かいておければよかったです。
無駄なレスさしてほんとに申し訳ないです。。
0263nobodyさん03/07/30 00:34ID:???
>>256
その台詞で貴様の技能がどの程度かよくわかった。
標準入力からだろうがブラウザからだろうが入力は入力だろうが。応用の利かない阿呆が。
0264nobodyさん03/07/30 00:36ID:???
>>263
はぁ、アフォだ。STDINなんかcgiで使えるわけないだろ、氏ね
026523403/07/30 00:37ID:KKMTj9U0
>>263
え?STDINって、DOS窓じゃなかったんですか?
フォームのデータは、ReadParse使って、変数に格納してる状態なんですけど・・・
026623403/07/30 00:37ID:KKMTj9U0
もしかして、POSTの場合の、フォームの受け取りのことを言っていたんでしょうか?
0267nobodyさん03/07/30 00:38ID:???
264nobodyさんsage03/07/30 00:36 ID:???
>>263
はぁ、アフォだ。STDINなんかcgiで使えるわけないだろ、氏ね
0268nobodyさん03/07/30 00:40ID:???
234 の混乱ぶりが面白いw
026923403/07/30 00:43ID:KKMTj9U0
253の言いたいことがようやくわかりました。
標準入力、GETの場合は?以降を、分割するってことを言っていたんですね。
そういうことではないんです。
フォームから、好きな文字列とキーの文字を送ってもらって、
そのキーで「文字列」を分解するってことです。
GETの場合でいうと、
?moji=c:\windows\system32&key=\
それで、この「\」で「c:\windows\system32」を分解したいんです。
?moji=aiueo,kakikukeko,sasisuseso&key=,
こんなことです。
0270nobodyさん03/07/30 00:46ID:???
>>269
だから応用できるだろって言ってるだろ。
0271nobodyさん03/07/30 00:47ID:???
俺、未だに 234 が何をしたいのか良く解らないんだけど…

> 初めの一行に「フォームからの文字列(c:\windows\system32)、分解の基準の文字(\)の場合の例」

要は、ある文字列を分解の基準の文字で分解してリストにしたいって事?
split でいいんじゃねーの?って思うが、肝心な「期待しているリストにはこう入って欲しい」
みたいなこと書いてねーからさっぱり解らん
0272nobodyさん03/07/30 00:53ID:???
234のしゃべりとスクリプトがそっくりでおもしろい。
027323403/07/30 00:53ID:0qjcwLeT
>>271
そういうことです。
それで、「ある文字列」も、「基準の文字」も、「何分割される」かも、分からない、という状況で、
どういうスクリプトで処理したらいいかといろいろ試行錯誤して、上のスクリプトができました。
それで、このスクリプトは正しいのか?、もっと簡単にできるんではないか?と思いまして、聞いてみました。
0274nobodyさん03/07/30 00:56ID:???
で、@match にはどう入って欲しい訳?
君はその事について未だ何も記述してないね
027523403/07/30 01:00ID:0qjcwLeT
>>274
@match = split(/$kijun/,"$data")って処理されるわけですから、
基準の文字の数+1が必要な値になりますよね?
たとえば、\で切る、データが「a\b」だったら、2個という具合で。

だから、
@match = ();
for($n=1; $n<=$i+1; $n++){
push(@match,"$n");
}
ここで、その数だけ、配列の値を・・・・・・・・・・
あら、もしやこれ不要なんでは・・・
まさか、いらない・・・
あぁ、いらないんだ。。。
そーだったのか、アフォなことをした・・・・
027623403/07/30 01:02ID:0qjcwLeT
あっはっは


$name = 'c:\windows\system32';


@match = split(/\\/,$name);

foreach $col (@match){
print "$col<br>";
}

これでいけたわ
すまんな、
027725403/07/30 01:04ID:???
>>276
それ俺が書いたまんま…
027823403/07/30 01:05ID:0qjcwLeT
いやぁ、@matchってのは、splitで分割する数だけ値をいれてやらないかんと思っとったんよ。
でも、良く考えると、
push(@match,"$n")って、値がはいってるのに、
なんでc:とか変わってるのかと思ったら

あっはっは
0279nobodyさん03/07/30 01:05ID:???
>>277
ご愁傷様……(;´Д`)
028023403/07/30 01:06ID:0qjcwLeT
よーするにだ、
@aaa = split(/$aa/,$bb)
ってすりゃぁ、
勝手に@aaaの値の数が調節されるんだな

あっはっは
すごいな、パールって

あっはっは
028123403/07/30 01:08ID:0qjcwLeT
ほんとにすまんな、みんな
あっはっは

えらい迷惑かけちまってあっはっは

パールってのはすごい言語だ
あっはっは

俺としたことが・・

みんなこれ知っててだまってたんだろ?

まったく、恥かくぜあっはっは
028223403/07/30 01:10ID:0qjcwLeT
しかも>>254のって
foreach (split(/\\/,$name)) {
だったんだな
なんかほかの物に見えたよ。

この時点で答えでてんじゃん
あっはっは
俺ってどんくさいな
0283nobodyさん03/07/30 01:11ID:???
次の方お待たせ。

0284nobodyさん03/07/30 01:11ID:???
アハハ吊られたね。

では次の質問どーぞ!
0285nobodyさん03/07/30 01:16ID:???
>>282
おまい、Cのやりすぎだ。
028623403/07/30 01:19ID:0qjcwLeT
確かにそうかも、
授業でCあるからな・・
0287nobodyさん03/07/30 01:19ID:???
>>286
配列の大きさとか初めに宣言しなくていいのばペールですよ^^;
0288nobodyさん03/07/30 01:26ID:???
すみません、「<>;」ってどういう意味なんですか?
0289nobodyさん03/07/30 01:32ID:???
<ARGV>
0290nobodyさん03/07/30 01:33ID:???
<^ ^;>
0291nobodyさん03/07/30 01:58ID:???
>>290
おぉ、コンパイルとおるぞ。
029221303/07/30 01:59ID:???
>>215 ぐぐったけど敷居が高そう。今後の課題にします。
>>225 <>で入力完了を待ってシグナルを発生させるみたいです。
0293nobodyさん03/07/30 02:14ID:???
>>288
@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
029429203/07/30 03:18ID:???
>>293 謝謝 ちと勉強してみます
0295nobodyさん03/07/30 03:25ID:JGELpVxk
cgiproxyの動作は
アクセスがあったらその間だけ
proxyサーバとして動作させ、目的のページを吐き出したら
proxyサーバを終了させる。といった感じですか?
それともproxyサーバとcgiproxyは別の原理ですか?
0296nobodyさん03/07/30 03:31ID:chNZYbR6
すいません。
Perlのことで質問したいのですが。
変数名の一部に変数の中の数字を埋め込んで
その変数名を代入したいのですが
どのようにいくのでしょうか?
ちょっと、言葉では分かりにくいので例を挙げると
例えば、$a1 $a2 $a3という変数があって
$bの中に1〜3のいずれかの数字が含まれているとし
この$bの中の数字を変数名として使いたいのです。
これを
$c = '$a' . "$b";
といった感じでやれば$aの方はそのまま文字列として出て
$bの方は変数の中身が展開されて出ると思ってやってみたのですが
エラーが出てしまいます。

どなたかお助けください。
よろしくお願いいたします。
0297あぼーんNGNG
あぼーん
0298nobodyさん03/07/30 03:57ID:???
print ${'a'.$b};
0299nobodyさん03/07/30 06:20ID:???
>>296
ハッシュか配列を使う。
0300nobodyさん03/07/30 10:34ID:???
↑答えもう出てるだろ( ´,_ゝ`)プッ

300 GET ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
0301nobodyさん03/07/30 10:34ID:???
こういう、変数名自体を動的に云々っていう質問よく見かけるけど、
なんでそういう発想になるんかね。
他の言語じゃそういう質問見かけないんだが(ないことはないと思う)。
やっぱソフトリファレンスのせいなんだろうか。
0302nobodyさん03/07/30 11:00ID:???
>>296
> すいません。
> Perlのことで質問したいのですが。
> どのようにいくのでしょうか?
> ちょっと、言葉では分かりにくいので例を挙げると
> どなたかお助けください。
> よろしくお願いいたします。

読みにくくなるだけだから無駄に6行も余計なことを書くな
0303nobodyさん03/07/30 11:03ID:???
>>301
リファレンスとかじゃなく、単に発想がおかしいだけなんじゃない?
0304nobodyさん 03/07/30 11:36ID:???
ソフトリファレンスは悪です・・・

まぁ、ちゃんと変数の整理が出来てないつーのと、変数のスコープを理解してないってことじゃないだろうか・・・
0305nobodyさん03/07/30 11:53ID:???
Perlはその辺を逐一理解してなくても扱える言語だからな。
それはPerlの優秀な点である。
その分ユーザーのレベルが下がるのは仕方がない。
0306nobodyさん03/07/30 12:32ID:???
下手にソフトリファレンスなんてもんがあるせいで、配列やハッシュの有効な使い方を
理解しないまま進んでしまうんじゃないかな。
030729603/07/30 13:22ID:VqnJP0e8
質問にお答えくださってありがとうございます。

print ${'a'.$b};
だとスカラ変数だとうまくいったのですが
配列の変数だとうまくいかないようです。

$sen1[] $sen2[] $sen3[]という変数があって
$randaに1〜3という値が入ていて
print("{${sen$randa}[$i]}");
のように書いたのですが、どうもうまくいかないみたいです。
0308nobodyさん03/07/30 13:43ID:???
>"{${sen$randa}[$i]}"
ヽ(*`Д´)ノ むちゃくちゃやんけー!
0309nobodyさん03/07/30 14:05ID:???
>>304
モジュールまたがってソフトリファレンス使ってるソースを見たことがある。
最初どこから変数が湧いてくるのか理解できなくて気絶するかと思った。
……って、これはマ板ネタか。

>>307
勉強しなおした方が良いと思われる。
031029603/07/30 14:09ID:QHsgEgDp
>>308-309
Perlは今回初めての仕様で、まだ慣れてないんで
お許しください。
外の括弧で囲めば、配列の[]が文字列として認識されずに済むと
聞いてやってみたのですが
もしかして、これはPHPの文法でしょうか?
031129603/07/30 14:10ID:QHsgEgDp
仕様→使用でした
0312あぼーんNGNG
あぼーん
0313nobodyさん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:???
>>307
> $sen1[] $sen2[] $sen3[]という変数があって

ってのは@sen1, @sen2, @sen3ってことか?
perlの配列がわかってれば、こんな書き方にはならないと思うのだが。

${'a'.$b}という回答を貰っておいて${sen$randa}[$i]はないだろ……。

print ${'sen' . $randa}[$i];
0315nobodyさん03/07/30 16:38ID:Nvxneeyi
初心者質問失礼致します。

if(!open(FH, ">>file")){ print 'file open error'; }
else{
  flock(FH, 2);
  print FH 'abcde';
  close(FH);
}

このように追記モードの場合、flockは必要になるの
でしょうか。
0316nobodyさん03/07/30 16:50ID:???
うん
0317あぼーんNGNG
あぼーん
0318nobodyさん03/07/30 17:09ID:???
>>315
モードに関係なく必要なときは必要だと思うが。
0319nobodyさん03/07/31 03:15ID:???
>>318
お返事有難うございます。
ロック使うことにしました。
有難うございました。
0320nobodyさん03/07/31 05:53ID:INH5PtXx
readline,<FH>を使ってデータを取り込みたいのですが、
上(最初)から順ではなく、下(最後)から読ませることは出来ませんか?
0321nobodyさん03/07/31 06:32ID:???
>>320
無理ぽ
あとはPerlメモ嫁
0322nobodyさん03/07/31 07:08ID:???
了解 seekで頑張ります
有難うございました。
0323nobodyさん03/07/31 10:39ID:???
unshiftしたらえんちゃうんかと
0324nobodyさん03/07/31 10:44ID:???
>>323βακα..._〆(゚▽゚*)
0325あぼーんNGNG
あぼーん
0326あぼーんNGNG
あぼーん
0327あぼーんNGNG
あぼーん
0328あぼーんNGNG
あぼーん
0329nobodyさん03/07/31 12:08ID:???
use Time::Local;

$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:???
戻すと言ってもそれじゃ無意味だしな
■ このスレッドは過去ログ倉庫に格納されています