Perl コーディング初心者質問コーナー Part35
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0357nobodyさん
04/06/15 14:41ID:???だからここはコーディング質問スレだっていってんだろ!!!!!!
モジュールの使い方は専用のスレに行け!!!!!!!!!!!
0358nobodyさん
04/06/15 15:08ID:???0360nobodyさん
04/06/15 16:21ID:dQxW4G/Wこのデータをブラウザから編集させたいと思うのですが、なにか参考になるモジュールなどは
ありませんでしょうか?
Perl5以上で動作するものがいいです。
-----
# 会員番号 名前 電話番号
0001山田 太郎090-1234-5678
0002山田 次郎090-1111-2222
-----
0361nobodyさん
04/06/15 16:27ID:???0362nobodyさん
04/06/15 16:53ID:???もしかして俺は釣らr(
0363nobodyさん
04/06/15 17:01ID:???メールアドレスを入力するフォーム部で、[0-9A-Za-z]と[@.-]以外の文字列が含まれていた場合、エラーを返す処理を行いたいと思います。
使用可能な文字列を配列@availableに入れるとして、$mailに配列@available内の文字以外のものがあれば○○する、という記述をしたいのです。
foreach (0 .. $#available) {
if (index ($mail, $available[$_]) >= 0) {
こう書くと、@available内の文字があった場合に処理を行うということになりますが、
@available内の文字以外のものがあれば、という判定はどのように書けばいいのでしょうか。
0364nobodyさん
04/06/15 17:12ID:???> メールアドレスを入力するフォーム部で、[0-9A-Za-z]と[@.-]以外の
> 文字列が含まれていた場合、エラーを返す処理を行いたいと思います。
$mail =~ /[^\-.0-9\@A-Za-z]/ and error();
0366360
04/06/15 18:24ID:dQxW4G/W>CGIとして使うならモジュールも糞もあるか?
すいません、意味が分かりません。
0367nobodyさん
04/06/15 18:27ID:???言葉が通じないのでは御話にならない。
0368nobodyさん
04/06/15 18:41ID:???お前がモジュールなんていう言葉を使うのは10年早い。
↓ここでCGIを探せ
【CGI】こんなCGI探してますver.13
http://pc5.2ch.net/test/read.cgi/hp/1081608108/
0369nobodyさん
04/06/15 22:50ID:???ID:passという書式でかかれているdatファイルから
特定のIDとパスワードを検索してその文字列だけを書き換えたいのですがどうすればいいでしょうか?
教えて下さい。お願いします。
0370nobodyさん
04/06/15 22:58ID:???open でファイル開くことから教えてくんかい?
0371369
04/06/15 23:25ID:???特定のIDとパスワードを検索してその文字列だけを書き換えたい
という処理の仕方をどうすればいいかわからないんです。よろしくお願いします。
0374nobodyさん
04/06/16 00:15ID:???0375sage
04/06/16 01:00ID:???0376nobodyさん
04/06/16 01:06ID:???正規表現を15分でいいから勉強するよろし。
0377nobodyさん
04/06/16 04:13ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
0379nobodyさん
04/06/17 12:14ID:???BBSでの投稿フォームの記入内容にNGワードが存在する場合にエラーを返す処理をしたいのです。
フォームはname,mail,textの3つのフィールドがあります。
@ng_word = ("逝ってよし");
# テキスト内を検索して、NGワードが存在した場合
foreach (0 .. $#ng_word) {
if (index ($name, $ng_word[$_]) >= 0 || index ($mail, $ng_word[$_]) >= 0 || index ($text, $ng_word[$_]) >= 0) { 以下略
上記の4行目の判定部分なのですが、フィールドが増えるたびに
index ($mail, $ng_word[$_]) >= 0 ||
のような書き方を追加して書かなければならないのでしょうか。
$nameや$mailなどをあらかじめ配列に追加しておいて、配列内のそれらの変数を判定させると言う書き方はできませんか?
0380nobodyさん
04/06/17 12:38ID:???http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsyn.html#Foreach_Loops
my @ng_word = qw( ... );
foreach my $word (@ng_word) {
foreach ($name, $mail, $text) {
index($_, $word) > -1 && error();
}
}
0382nobodyさん
04/06/18 08:52ID:???文字列内に以下の条件を含む部分があるかどうかを
チェックするために正規表現を使ってみたいのですが
いかようにすればよいでしょうか?
?nnnn (nnnnは4桁の数字)
0383nobodyさん
04/06/18 10:05ID:???でも俺すげー優しいからヒントをやろう。
0-9
あとは自分で考え。
スレタイ嫁
0385nobodyさん
04/06/18 10:48ID:???"?[0-9]{4}"
0386nobodyさん
04/06/18 10:49ID:???0387nobodyさん
04/06/18 10:49ID:???どうダメかは正規表現道場スレで聞け
0389nobodyさん
04/06/18 14:05ID:???0390nobodyさん
04/06/18 14:25ID:???0391nobodyさん
04/06/18 14:58ID:???0392nobodyさん
04/06/18 16:08ID:???お前等面白い
0393nobodyさん
04/06/18 20:06ID:???フォームからPOSTで送信してcgiから帰って来る結果を小さいウインドウを別にポップアップして
そこに表示したいのですが、どうすればいいでしょうか?
教えて下さい。お願い致します。
0394nobodyさん
04/06/18 21:11ID:???http://pc5.2ch.net/test/read.cgi/hp/1087025773/
http://pc5.2ch.net/test/read.cgi/php/1086715675/
0396nobodyさん
04/06/19 04:43ID:Bryn3NL2ブラウザからあるperlのプログラムを起動して、データベースの更新をしているのですが、
これをバッチとして自動起動したいと思っています。
で、 perl xxxx.cgi とすると、エラーになります。
どこでエラーになるかを調べたところ require xxxxx.cgi でrequireが正しくされていないようです。
perl はバッチ処理としては動かないのでしょうか?
0397nobodyさん
04/06/19 07:02ID:???0398nobodyさん
04/06/19 07:28ID:Bryn3NL2レスサンクスですが
絶対パスでもだめでした
0399nobodyさん
04/06/19 09:50ID:???順位付けをしたいです。「変動勝ち点制」とは、1位のチームは6点、
2位のチームは5点、という具合に各チームがランキングポイントを
持っています。試合の勝者が相手チームのランキングポイントを獲得し、
トータルポイントに加算していきます。その日の順位によってランキング
ポイントは変化します。
2.以下にソースを貼り付けます。データを保存しているresult.datは
1行がこんな風になっています。「d,l,w:k,n,w:l,o,q」。":"で区切った
一番目の要素が勝者で、2番目が敗者です。3番目に"w"となって
いるのは試合が決着した場合、"q"は引き分けです。
3.エラーは出ないのですが、何も答えてはくれません。CPUが100%になって
いるので何かやってはいるみたいなのですが……。
0400399
04/06/19 09:50ID:???#$?[2]は昨年の順位=ランキングポイント。
@d=("H","0","6");@s=("L","0","5");@k=("Bu","0","4");
@n=("F","0","3");@l=("M","0","2");@o=("Bw","0","1");
#result.datからその日の試合結果を入力する
open (RESULT,"result.dat");
while ($result = <RESULT>){
chop($result);
while($x = split (/:/,$result)){
while(@y = split(/,/,$x)){
if($y[2] eq "w"){
$$y[0][1]=$$y[0][1]+$$y[1][2];
}else{
$$y[0][1]=$$y[0][1]+($$y[1][2] / 2);
$$y[1][1]=$$y[1][1]+($$y[0][2] / 2);
}
}
#その日のランキングポイントを決める
#鷹
$rp=6;
if($d[1]<$s[1]){$rp=$rp-1;}elsif($d[1]<$k[1]){$rp=$rp-1;}
elsif($d[1]<$n[1]){$rp=$rp-1;}elsif($d[1]<$l[1]){$rp=$rp-1;}
elsif($d[1]<$o[1]){$rp=$rp-1;}
$d[2]=$rp;
#あとは同じなので省略。猫、牛……と去年の順位にしたがって続きます
}}
close (RESULT);
#結果を出力
print ("H\t$d[1]\n");print ("L\t$s[1]\n");print ("Bu\t$k[1]\n");
print ("F\t$n[1]\n");print ("M\t$l[1]\n");print ("BW\t$0[1]\n")
0401nobodyさん
04/06/19 10:17ID:???perl -IC:/WINNT/system32 foo.cgi
-Iオプションでrequireするディレクトリを追加してみるとか
>>400
whileって何するのか勉強してこい
0402nobodyさん
04/06/19 13:31ID:???0403nobodyさん
04/06/19 14:47ID:Bryn3NL2サンクスコ やってみます
0404nobodyさん
04/06/19 21:48ID:???@array(
{'a'=>'value1','b'=>'1234'},
{'a'=>'value2','b'=>'4518'},
{'a'=>'value6','b'=>'4879'},
);
とあったとして、bの値でarrayをソートしたいのですが。
0405nobodyさん
04/06/19 22:10ID:???http://www.cc.rim.or.jp/~midorin/mad-p/perl/benkyou/199909/mgp00039.html
0406nobodyさん
04/06/20 06:51ID:F4x9/MNB元々 Perl(CGI) で動いてたものを PHP へ移植したんですが、クライアントからの呼び出しが
a.cgi 固定で PHP を cgi として動かせないサーバで困っています
そこで a.cgi(Perl) は a.php を呼び出すだけの機能にしたいのですが Perl(CGI) から PHP は
どのように呼び出せばいいのでしょうか?
よろしくお願いします
0407nobodyさん
04/06/20 12:09ID:???<Files a.cgi>
AddType application/x-httpd-php .cgi
</Files>
(w
0408nobodyさん
04/06/20 14:13ID:???open(IN,"$logfile") || &error("ファイルがオープン出来ませんでした。");
@nakami=<IN>;
close(IN);
$log = "$title<>$time<>message\n";
unshift(@nakami,"$log");
open(OUT,">$logfile") || &error("ファイルに書き込み出来ませんでした。");
print (OUT "@nakami");
close(OUT);
と書いたのですがログファイルの先頭にスペースがついていってしまいます。
$title<>$time<>message
$title<>$time<>message
$title<>$time<>message
とこういう風に上書きしていくとどんどん増えていってしまいます。
どこがわるいのでしょうか?教えて下さい。お願いします。
0409nobodyさん
04/06/20 14:38ID:???ところで @nakami=<IN>; って、
昔俺が赤ラクダ本を読んだときには「そんなことするな」と書いてあったような記憶が
あるんだが、最近はみんなやってることなの?
ファイルを全部いっぺんに読み込むからメモリが膨れ上がって、
共用サーバだと結構世の中の迷惑なんじゃないかという気がするんだが。
一行毎に処理していたフィルタ全盛時代の美徳はもはや失われてしまったのか。
0411406
04/06/20 15:10ID:???ありがとうございます
これって apache の設定ですか?
であればレンタル鯖なのでいじれないんです
他になにかいいアイディアはないでしょうか
よろしくお願いします
0412nobodyさん
04/06/20 15:42ID:???@nakami=<IN>;
close(IN);
$log = "$title<>$time<>message";
unshift(@nakami,"$log");
open(OUT,">$logfile") || &error("ファイルに書き込み出来ませんでした。");
$" = "\n";
print (OUT "@nakami");
close(OUT);
0414406
04/06/20 16:19ID:???0415nobodyさん
04/06/20 16:36ID:???my @new = sort{ $a->{b} <=> $b->{b} } @array;
>>406
print (OUT @nakami);
このような配列があるときに、配列の一部に存在する
3, 7, 5の数字を使ってソートしたいです。
こう並べ替えたい↓
@list = (name<>pass<>7, name<>pass<>5, name<>pass<>3);
のですが、うまく処理する方法が思いつきません。
よろしくお願いします。
0419nobodyさん
04/06/20 22:34ID:???@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:???このケースで効率的なシューウォーツ変換ってなによ?
シューウォーツ変換が効率的なのは>>418のようなケースだろう。
>>418
@list = map{ $_->[1] } sort { $a->[0] <=> $b->[0] } map{ [(split /<>/)[1], $_] } (...list...);
0421420
04/06/20 22:39ID:???適当に脳内補完してくれ。
理解できてないですが、
テストした結果うまく動いてるようです。
ありがとうございました。
0423415
04/06/20 23:45ID:???私にはさっぱり想像がつかないので、
>>404のケースでの使い方を教えてください。
>>418
数値が一桁固定なら、こんなのも。
my @new = map{ substr($_, 1) }
sort map { pack('A1A*', (split(/<>/))[2], $_) } @list;
0424406
04/06/21 04:08ID:???Perl から PHP を呼ぶ方法は無いのでしょうか
クライアント側の変更をお願いするしかないのかな...お金が飛んで行く〜
0425nobodyさん
04/06/21 05:38ID:???それを以下のような形で全て表示させたい場合、
合理的というか、無駄のない書き方が思い浮かば困ってます。
┌テキスト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これは「124」となる筈ですよね?
何故か「020305」となります。
もしかしてバグでしょうか?
環境は XP + ActivePerl 5.8.3 です。
0428nobodyさん
04/06/21 08:06ID:???0429nobodyさん
04/06/21 14:53ID:???foreach (0 .. $#hoge) {
printf qq|%s%s<br>\n|, $_ ? $_ == $#hoge ? '└' : '├' : '┌', $hoge[$_];
}
ややブサイコ
>>428
おーい 5.8 だろ?(w
0430nobodyさん
04/06/21 23:07ID:???print "┌$hoge[ 0 ]\n";
for(1..($#hoge-1)){ print "├$hoge[ $_ ]\n" }
print "└$hoge[$#hoge]\n";
0431nobodyさん
04/06/21 23:21ID:???$first = shift @hoge;#効率悪いかも
$last = pop @hoge;
print "┌$first\n";
print "├$_\n" for(@hoge);
print "└$last\n";
0432nobodyさん
04/06/21 23:30ID:???0433nobodyさん
04/06/21 23:47ID:???0434nobodyさん
04/06/22 11:03ID:???jcodeを使っても、sjisの場合とかは第二引数に範囲指定が効かない場合がある。
&jcode::tr (\$value, "0123456789", "0-9");
0435nobodyさん
04/06/22 12:14ID:???ていうか、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:???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:???<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の命令文とかです。受けたデータをそのまま使うの大丈夫なのかなと
疑問に思ったので質問しました。どなたかお願いします。
0441nobodyさん
04/06/22 19:45ID:???渡すのもあなた、受け取るのもあなた。
変なものを渡さないようにするのもあなたでしょ?
誰か知らない人から受け取るんなら、どんなもの渡したのかその人に聞くか、
中身みて期待値かどうか自分で見て下さい。
どなたか知りませんがお願いします。
0442440
04/06/22 20:24ID:???質問の仕方がわるかったのでしょうか?
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
print $buffer;
とかした場合にJSとかHTMLのタグじゃなくperlの関数とか命令文が入っていた場合に
その命令文が実行されてしまうのですか?という質問です。
お願いします。
0443nobodyさん
04/06/22 20:36ID:???0445440
04/06/22 22:27ID:???ですよね。簡潔で最高な答えありがとうございました。
>>444
鯖はまだなのでhttpdとactiveperlでやってます。どっちにしろレンサバでperlのテストなんか
馬鹿なことしませんけどね。
ところで何故にperlの命令文は無効になるんですか?evalしたら実行されますよね?
#自治厨
スレ違い
>>自治厨
森へお帰り
#444
やってみろよ
>>444
お前の話はつまらん
0446nobodyさん
04/06/22 22:41ID:???0447nobodyさん
04/06/22 23:40ID:???0449nobodyさん
04/06/22 23:56ID:???0450nobodyさん
04/06/23 00:09ID:???具体的には、passwdコマンドをperlから実行し、2回促される
入力をプログラムから自動的に入力させたいといったもの
です。
もしも何か方法があれば教えていただきたい次第です。
宜しくお願い致します。
0451nobodyさん
04/06/23 00:11ID:???0452440
04/06/23 01:16ID:???0453nobodyさん
04/06/23 01:19ID:???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:???■ このスレッドは過去ログ倉庫に格納されています