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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0415nobodyさん04/06/20 16:36ID:???
>>404
my @new = sort{ $a->{b} <=> $b->{b} } @array;

>>406
print (OUT @nakami);
0416nobodyさん04/06/20 16:41ID:???
追記
>>406
>>125-127
0417nobodyさん04/06/20 20:47ID:???
>>415
シュウォーツ変換をお勉強しようね。
0418 ◆u2YjtUz8MU 04/06/20 22:17ID:???
@list = (name<>pass<>3, name<>pass<>7, name<>pass<>5);
このような配列があるときに、配列の一部に存在する
3, 7, 5の数字を使ってソートしたいです。
こう並べ替えたい↓
@list = (name<>pass<>7, name<>pass<>5, name<>pass<>3);
のですが、うまく処理する方法が思いつきません。
よろしくお願いします。
0419nobodyさん04/06/20 22:34ID:???
>>418
@list =(
"name3<>pass3<>3",
"name7<>pass7<>7",
"name5<>pass5<>5");
@array = sort{(split(/<>/,$b))[2] <=> (split(/<>/,$a))[2]}@list;

こんな感じか?
もうちょい綺麗な書き方ありそうだが…
0420nobodyさん04/06/20 22:35ID:???
>>417
このケースで効率的なシューウォーツ変換ってなによ?

シューウォーツ変換が効率的なのは>>418のようなケースだろう。
>>418
@list = map{ $_->[1] } sort { $a->[0] <=> $b->[0] } map{ [(split /<>/)[1], $_] } (...list...);
042142004/06/20 22:39ID:???
おっと、微妙にソートの前処理が間違ってたな。
適当に脳内補完してくれ。
0422 ◆u2YjtUz8MU 04/06/20 22:42ID:???
>>419
理解できてないですが、
テストした結果うまく動いてるようです。
ありがとうございました。
042341504/06/20 23:45ID:???
>>417
私にはさっぱり想像がつかないので、
>>404のケースでの使い方を教えてください。

>>418
数値が一桁固定なら、こんなのも。

my @new = map{ substr($_, 1) }
sort map { pack('A1A*', (split(/<>/))[2], $_) } @list;
042440604/06/21 04:08ID:???
うぅ
Perl から PHP を呼ぶ方法は無いのでしょうか
クライアント側の変更をお願いするしかないのかな...お金が飛んで行く〜
0425nobodyさん04/06/21 05:38ID:???
配列hogeにテキストがいくつか入っていて、
それを以下のような形で全て表示させたい場合、
合理的というか、無駄のない書き方が思い浮かば困ってます。
┌テキスト1
├テキスト2
├テキスト3
└テキスト4

今↓のように書いているのですが、おそらく効率がわるいような気がします。
foreach (0 .. $#hoge) {
my $prefix;
if ($_ == 0) {
$prefix = '┌';
} elsif ($_ == $#hoge) {
$prefix = '└';
} else {
$prefix = '├';
}
print "$prefix$hoge[$_]<br>\n";
}

こういうのを書くことって結構あると思うんですが、
ご教示いただけませんでしょうか。
0426nobodyさん04/06/21 07:29ID:pRQNX02o
$a='124'; $a=~tr/0-9/0-9/; print $a
これは「124」となる筈ですよね?
何故か「020305」となります。
もしかしてバグでしょうか?

環境は XP + ActivePerl 5.8.3 です。
0427nobodyさん04/06/21 07:52ID:???
>>426
あれだよ。あれ。全角使うならもう少し考慮すべきことがある。
0428nobodyさん04/06/21 08:06ID:???
すいません jcode.pl使います
0429nobodyさん04/06/21 14:53ID:???
>>425
foreach (0 .. $#hoge) {
printf qq|%s%s<br>\n|, $_ ? $_ == $#hoge ? '└' : '├' : '┌', $hoge[$_];
}
ややブサイコ

>>428
おーい 5.8 だろ?(w
0430nobodyさん04/06/21 23:07ID:???
die if $#hoge < 1;

print "┌$hoge[ 0 ]\n";
for(1..($#hoge-1)){ print "├$hoge[ $_ ]\n" }
print "└$hoge[$#hoge]\n";
0431nobodyさん04/06/21 23:21ID:???
die if $#hoge < 1;

$first = shift @hoge;#効率悪いかも
$last = pop @hoge;

print "┌$first\n";
print "├$_\n" for(@hoge);
print "└$last\n";

0432nobodyさん04/06/21 23:30ID:???
どいつもこいつも die だの 死ぬだの、、、もっと命を大事にしてくれよ!
0433nobodyさん04/06/21 23:47ID:???
かと言って本7みたいに逃げてばかりなのもイカガ谷^hなものかと。
0434nobodyさん04/06/22 11:03ID:???
>>426
jcodeを使っても、sjisの場合とかは第二引数に範囲指定が効かない場合がある。
&jcode::tr (\$value, "0123456789", "0-9");
0435nobodyさん04/06/22 12:14ID:???
>>434
ていうか、jcode.plに範囲指定はJISとEUCでしか使えないって書いてあるよ。

;# Range operator like `A-Z' for 2 byte code is partially
;# supported. Code must be JIS or EUC, and first byte
;# have to be same on first and last character.
0436nobodyさん04/06/22 14:14ID:???
PerlでForm動かすのが激しく苦手なので得意な方教えてください。

FormでボタンAとボタンBを作って、web上でボタンA、Bを押すとそれぞれ
$Xの数値を変える(たとえばボタンAを押したら$x = 1、Bを押したら$x = 2)
というのを作りたいんですが、どうすればいいでしょうか。
教えてください。お願いします。
0437nobodyさん04/06/22 15:07ID:???
↑とりあえず黙ってくれる?そしてスレタイ嫁
0438nobodyさん04/06/22 15:16ID:???
きっと説明も激しく苦手なんだろうよ
0439nobodyさん04/06/22 18:00ID:???
<form method="POST" action="hoge.cgi>
<input type="radio" name="x" value=1>Aボタン
<input type="radio" name="x" value=2>Bボタン
</form>
−−−hoge.cgi
#! /path/to/perl
use CGI;
$cgi = CGI->new();
$x = $cgi->param('x');
print $cgi->header();
print $cgi->start_html();
print $x;
print $cgi->end_html();
0440nobodyさん04/06/22 19:37ID:???
PERLでフォームからのデータをSTDINから受け取ってそれを使って色々処理をする場合
受け取った一番初めに中身に変な文字列が入っていないかを検査したほうがいいのですか?

変な文字列というのはPERLの命令文とかです。受けたデータをそのまま使うの大丈夫なのかなと
疑問に思ったので質問しました。どなたかお願いします。

0441nobodyさん04/06/22 19:45ID:???
>>440
渡すのもあなた、受け取るのもあなた。
変なものを渡さないようにするのもあなたでしょ?

誰か知らない人から受け取るんなら、どんなもの渡したのかその人に聞くか、
中身みて期待値かどうか自分で見て下さい。

どなたか知りませんがお願いします。
044244004/06/22 20:24ID:???
>>441
質問の仕方がわるかったのでしょうか?
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
print $buffer;
とかした場合にJSとかHTMLのタグじゃなくperlの関数とか命令文が入っていた場合に
その命令文が実行されてしまうのですか?という質問です。

お願いします。
0443nobodyさん04/06/22 20:36ID:???
されるわけがない。
0444nobodyさん04/06/22 20:50ID:???
>>442
やってみろよ。

# 442
レン鯖なので怖くて出来ません。

>>442
森へお帰り
044544004/06/22 22:27ID:???
>>443
ですよね。簡潔で最高な答えありがとうございました。
>>444
鯖はまだなのでhttpdとactiveperlでやってます。どっちにしろレンサバでperlのテストなんか
馬鹿なことしませんけどね。

ところで何故にperlの命令文は無効になるんですか?evalしたら実行されますよね?

#自治厨
スレ違い

>>自治厨
森へお帰り

#444
やってみろよ

>>444
お前の話はつまらん
0446nobodyさん04/06/22 22:41ID:???
またh(ry
0447nobodyさん04/06/22 23:40ID:???
バカが(ry
0448nobodyさん04/06/22 23:44ID:???
>>440は馬鹿なのかお調子者なのか。
どっちにしてももう答えてくれる人はいないだろうけど。
0449nobodyさん04/06/22 23:56ID:???
今さらjcode.plもないだろ。奥付見て、3年以上前のPerlCGI入門書は買わないよーに。
0450nobodyさん04/06/23 00:09ID:???
perlスクリプトで、標準入力へ入力させる方法がわかりません。

具体的には、passwdコマンドをperlから実行し、2回促される
入力をプログラムから自動的に入力させたいといったもの
です。

もしも何か方法があれば教えていただきたい次第です。
宜しくお願い致します。
0451nobodyさん04/06/23 00:11ID:???
perlじゃなくて、expectを使おう。
045244004/06/23 01:16ID:???
わかんないですか?
0453nobodyさん04/06/23 01:19ID:???
↑古典的且つ模範的な教えて君登場↑
0454nobodyさん04/06/23 01:20ID:???
>>450
Net::Telnet
0455nobodyさん04/06/23 02:03ID:???
スクリプトを書きながら気になったのですが、
各サブルーチンをスクリプト内に全部記述するのと、
それぞれにライブラリファイルを作成して必要なときのみrequireで読み込むのとどっちがいいんでしょうかね?
いまいち意味不明っぽいですが、つまりは

if ($bar) {
 require "hogehoge.pl";
 &hogehoge::foo(\$bar);
}

と

if ($bar) { &foo(\$bar); }

のどっちがいいのでしょうか?

0456nobodyさん04/06/23 02:07ID:???
時と場合によるよ。たくさんプログラムを書いてる内にうまく使い分けができるようになる。
0457nobodyさん04/06/23 02:26ID:???
>456
レスありがとうございます。
使い分け、頭の片隅に置いておきます。
まだまだ常時考えながらはコード書けませんです、はい。

もう少し色んなこと考えながらコード書かないとだめだなぁ…
0458nobodyさん04/06/23 03:04ID:???
>>440>>452
445のレスを見たら誰も答えなくなるよ。
常識の無い奴はスルーされる。
0459nobodyさん04/06/23 05:27ID:???
>>426
http://pc5.2ch.net/test/read.cgi/php/1063562491/861
0460nobodyさん04/06/23 10:31ID:???
1<>い<>12:50<>
4<>あ<>20:02<>
2<>き<>08:41<>

このように並んでいるテキストを、入力された数値によってソートしたいのですが
今は
if($num==1){ };
if($num==2){ };
if($num==3){ };
みたいに書いてるのですが、もっとスマートなやり方は無いでしょうか?
0461nobodyさん04/06/23 11:41ID:???
やかましいわいヴォケ
ちゃんと説明しろ
0462nobodyさん04/06/23 11:44ID:???
$data{$num} = $line;
見たいにハッシュにぶち込んで、

foreach my $num (sort( keys %data)){
#$data{$num} の処理
}

にする
046344004/06/23 12:42ID:???
>>458
わかんないんですか?
0464nobodyさん04/06/23 18:02ID:???
うん。わかんないよ。
さあ帰った帰った。
0465nobodyさん04/06/23 18:08ID:???
>>463
すんげー難しいからわかるやつはどこにもいないよ。
じゃあバイバイ。
0466nobodyさん04/06/23 21:04ID:???
cookieを読みこんで配列にしたいんだけど、
$a = $ENV{'HTTP_COOKIE'};
@a = split /\;/,$a;
foreach(@a){
(my $a , my $b) = split /=/;
$form{$a} = $b ;
}
クッキーの中にNAME=VALUEが一つだけでも複数あっても大丈夫のようにしたいんだけど、↑ので
合ってる?一つの場合は@aの中には$aがそのまま入るから一応大丈夫だと思うけど、
ここのお墨付きをもらいにきた。
0467nobodyさん04/06/23 21:16ID:???
>>466
チェックぐらい自分でしろ。
http://www.studyinghttp.net/cookies.html
046846604/06/23 21:37ID:???
>>467
わかんないなら、答えずともよい。
0469nobodyさん04/06/23 21:39ID:???
うん。わかんないよ。
さあ帰った帰った。
0470nobodyさん04/06/23 21:40ID:???
>>468
すんげー難しいからわかるやつはどこにもいないよ。
じゃあバイバイ。
047146604/06/23 21:41ID:???
>>469-470
ここには回答者は一人しかいないのか?
とりあえず一人二役とか恥ずかしいから止めとけって。
047244004/06/23 21:44ID:???
なんかキモイですねここ。

>さあ帰った帰った。

ってまるで、ここがあなたの居場所みたいな言い方ですけど、
ここがあなたの居場所なんですか?
0473nobodyさん04/06/23 21:44ID:???
(´-`).。oO(恥ずかしい質問をしてる奴がよく言うよ・・・)
0474nobodyさん04/06/23 21:46ID:???
>>471-472
一人二役とか恥ずかしいから止めとけって。
047546604/06/23 21:46ID:???
誰かまともな人いたら>>466お願いね。
まともな人のお墨付きが欲しいんだ。
0476nobodyさん04/06/23 21:46ID:???
>>472
まあ、お前の居ていい場所ではないな。
0477nobodyさん04/06/23 21:47ID:???
ここは香ばしいインターネッツですね
047844004/06/23 21:48ID:???
>>473
私に言ってるのですか?
ところでこのスレがあなたの居場所なんですか?
0479nobodyさん04/06/23 21:49ID:???
>>475
オッケーオッケー完璧です
0480nobodyさん04/06/23 21:50ID:???
お前ら幼稚な争いはやめれ。
ここは質問スレなんだから、喧嘩はよそでやってくれ。
0481nobodyさん04/06/23 21:52ID:???
>>480
お前らって言うより440=466
048246604/06/23 21:54ID:???
>>479
おまいは>>469-470だろ?でもまあ俺は単純だから、俺より詳しそうなおまいに
okを出してもらえば、それで安心だよ。ありがとね。

>>467でくれたサイトもいいとこみたいだから見に行くよ。それじゃ。ごめんね。
048348004/06/23 21:56ID:???
>>481
俺にはここに俺ともう二人しかいないようにしか思えないんだが・・・・
そして俺以外の二人に向けて言ったんだけど、まあとりあえず早く正常に戻そうよ。

それでは次の質問どぞ↓
048444004/06/23 21:57ID:???
ところでこのスレがあなたの居場所なんですか?

いつになったら答えてくれるんですか?恥ずかしくて答えられませんか?
0485nobodyさん04/06/23 22:10ID:???
----- 終了 -----
0486nobodyさん04/06/23 22:20ID:???
>>440
ここに解説がある。
http://www2.strangeworld.org/uedakana/perl_tips105.txt
0487nobodyさん04/06/23 22:22ID:???
一連の流れを読んでみて思った。
質問者も悪いが、すぐムキになる回答者もどうかと。
っていうかこのスレの回答者は特有だね。
母親に向かってすぐ「くそババァ!」って連呼するタイプの人間だな。内弁慶っていうかな。
0488nobodyさん04/06/23 22:27ID:???
>>487
>>1
良い回答は良い質問から。
^^^^^^^^^^^^^^^^^^^^^^
0489nobodyさん04/06/23 22:38ID:???
>>488
そうやっていつでも相手のせいにする辺りもどうかと。どちらかが大人になるしかないでしょ。
0490nobodyさん04/06/23 22:53ID:???
ロクでもない質問はいっさいレスをせずに無視しとくか
0491nobodyさん04/06/23 23:08ID:???
>>486
俺がくらったじゃねえかよ!マジで鬱・・・・何のウイルス?
色々探したが見つからなかった・・・・ウイルス対策なしの俺がここのURLを見に行くなんて
しくじった。
perl_tipsっていかにも正当な名前なのに。マジで直し方教えてくれ。
0492nobodyさん04/06/23 23:33ID:???
http://www.symantec.com/region/jp/sarcj/data/j/js.trojan.windowbomb.html
0493nobodyさん04/06/24 00:03ID:???
>>491
どんくせえやつだな、ったく
049449104/06/24 00:04ID:???
>>492
ありがとう・・・・スキャンかけたいけど、っていうか対策ソフトいれたいけど、c:\が残り
50MBしかないから・・・・

とりあえず、ブラクラ系みたいなのでほっとしてる。変な症状もないし、スタートアップにも
新しい奴なかったからほっとく。

それにしても何故にこのスレでトロイの木馬が貼られてるんだよ・・・・・そんなに憎悪を抱いたのか?
049549104/06/24 00:05ID:???
>>493
そんなこと言うなよ・・・・・既に鬱なんだから、追い撃ちかけるのは止めて・・・・
0496nobodyさん04/06/24 01:29ID:???
>491
ソース見てみたが、ウィルスではないと思うぞ。
<meta http-equiv="Refresh" content="0">と、
コンコンクラッシャーとメールストーム。
ただし、
<img src="http:// www. raus. de/ crashme/">
の部分が完全一致でをウィルスとして認定するらしい。 
(全角スペースを空けて反応しないようにしてある)
049749104/06/24 02:23ID:???
>>496
ありがと。その優しさに軽く感動;;
俺実は2回踏んだのね。一度目はセキュリティ中のままで行ったらいきなり画面が真っ青になって
例外なんとかってやつが出て再起動して、レジストリ修復してセーフであげてscandiskとかした後、
普通に立ち上げたらとくには問題ないみたいだった。

2回目はそのソースをブラクラチェッカにかけてみたけど、そのチェッカの使い方がわからずに、セキュリティを
最高に挙げて愚直にトライ。結果同じ症状で再起動した後、同じ事やって今の状況・・・・・・

俺の場合ウイルスのとこに行く前に、例外発生画面になった気がする。クリック1秒未満で画面が何も変化
ないまま次の画面は青い例外発生画面だったから。

ほんと優しくしてくれてありがと。癒されたぽ
049849104/06/24 03:13ID:???
http://www.trendmicro.co.jp/vinfo/virusencyclo/default5.asp?VName=HTML_SUAR.A

これだったみたい。一応オンラインのウイルススキャンかけてみたら
このウイルスがテンポラリファイルから4つ検出された。とりあえず危険なものではなくて「ほっ」・・・・
0499nobodyさん04/06/24 10:36ID:???
おまいらスレ違いすぎ。

- - - - - Perl コーディング初心者質問コーナー Part35 - - - - -
0500nobodyさん04/06/24 18:54ID:???
ブラウザの「進む」とか「戻る」でcgiのページに移動すると、
警告:ページの有効期限切れ
というメッセージが出るのですが、それが出ないサイトもあるみたいですが、
それはどういう方法を使ってるのですか?PERLでのやりかたが知りたいので教えて下さい。
0501nobodyさん04/06/24 18:59ID:???
htmlのノーキャッシュじゃねーの?
0502nobodyさん04/06/24 19:10ID:???
厳密にはhtmlとは限らない罠
0503nobodyさん04/06/24 20:00ID:???
>>500
formのmethodをgetにする。
050450004/06/24 20:31ID:???
>>501
キャッシュの制御を<meta>で変えればいいのですか?

>>502
HTTPのヘッダーの辺りということでしょうか?

>>503
getだとできるんですね!getの時はブラウザの戻る、進むでクエリ付きURLだから
そのまま処理をしてくれるということみたいですね。
postの場合は標準入力から読みこむ。それで、postで送ったフォームデータは
セキュリティ上の都合でブラウザ?のデフォルト設定が自動再送信しないようになって
いるんですよね?HTTPのヘッダに何かを追加すると、その設定が変えられるというわけでしょうか?

0505nobodyさん04/06/24 20:37ID:???
Expires:
0506nobodyさん04/06/24 20:38ID:???
俺も昔気になったときにメソッドによるのかな?と思ったが、
結局違うくて、ノーキャッシュだったと思うんだがなぁ

兎に角何でもかんでも1から10まで全部他人に頼ろうと思わず、
与えられた情報を自分で試す努力しろっての
0507nobodyさん04/06/24 20:41ID:???
それ以前にスレ違い
0508nobodyさん04/06/24 21:30ID:???
>>504
一応header関連だった気がするが、cgiの出力をキャッシュさせるかどうかは
pragma
expires
cache-control
他にもなんかあった気がするけど、HTTPサーバによっては-nphで自分で一からheader
を設定しないと、勝手にno-cacheを吐き出すよ。たしかね。

どうだったっけかな。思い出せない。
050950004/06/24 21:56ID:???
ありがとうございます!今ローカル環境で試してますがなかなかできません。

print "Content-type:text/html\n";
print "Expires:Sun, 06 Nov 2005 08:49:37 GMT"."\n\n";

このようにしてみましたが、効果なしでした。かなり高度なテクニックなんですかね?
0510nobodyさん04/06/24 22:11ID:???
この手のはブラウザ依存すると思うので、セッションを持たせて、セッションデータから毎回ページを作リ直す、って方向でやった方がいいと思う。
0511nobodyさん04/06/24 22:13ID:???
>>509
おまいには悪いが、誰もわからない悪寒・・・・・・・
ついでに>>507のいうようにスレ違いぽ
まあ一応
PERLでどうコーディングしたら出力がUAにキャッシュされるか
という質問みたいだからあながち的ハズレなスレ選びではないが。
どっちにしろ様子をみてる限りではわかる人は今のとこ、まだ来てないんじゃないか?
結局自力で調べるしかない。ガンガレ
051250004/06/24 22:19ID:???
>>510
シェア90%を誇るIEだけクリアできれば満足なんですが、やはり難しいんですね。
cgiの使い勝手のよさを上げようと思っただけなので、無理でも一応機能的には影響はないです。

>>511
応援ありがとうございます。頑張ります!
0513nobodyさん04/06/24 22:48ID:???
http://www.mnot.net/cache_docs/
いいページ見つけた。俺も後で読んでみるよ。
0514nobodyさん04/06/24 23:03ID:???
>>513
またウイルスだったりして・・・・とりあえず関係ない俺は踏まないでおこう。
0515nobodyさん04/06/24 23:10ID:???
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=http%3A%2F%2Fwww%2Emnot%2Enet%2Fcache%5Fdocs%2F
心配なときは、一旦グーグルに入れればいいのだ。
■ このスレッドは過去ログ倉庫に格納されています