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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0357nobodyさん04/06/15 14:41ID:???
>>356
だからここはコーディング質問スレだっていってんだろ!!!!!!
モジュールの使い方は専用のスレに行け!!!!!!!!!!!
0358nobodyさん04/06/15 15:08ID:???
if($res =~ m/!!!!!/) $flag = "厨房";
0359nobodyさん04/06/15 15:12ID:???
>>358=356
スレ違いな奴はくるな
0360nobodyさん04/06/15 16:21ID:dQxW4G/W
以下のような、1行に1件分の情報が記述されているタブ区切りテキストがあります。
このデータをブラウザから編集させたいと思うのですが、なにか参考になるモジュールなどは
ありませんでしょうか?
Perl5以上で動作するものがいいです。

-----
# 会員番号 名前 電話番号
0001山田 太郎090-1234-5678
0002山田 次郎090-1111-2222
-----
0361nobodyさん04/06/15 16:27ID:???
CGIとして使うならモジュールも糞もあるか?
0362nobodyさん04/06/15 16:53ID:???
ログを読み込んで<INPUT type="text">内に吐かせればいいんじゃないか?
もしかして俺は釣ら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:???
>>363
> メールアドレスを入力するフォーム部で、[0-9A-Za-z]と[@.-]以外の
> 文字列が含まれていた場合、エラーを返す処理を行いたいと思います。

$mail =~ /[^\-.0-9\@A-Za-z]/ and error();
0365nobodyさん04/06/15 17:16ID:???
言われて見れば全くその通りで・・・
>>364氏感謝。何で正規表現の否定が思いつかなかったんだ orz
036636004/06/15 18:24ID:dQxW4G/W
>361
>CGIとして使うならモジュールも糞もあるか?

すいません、意味が分かりません。
0367nobodyさん04/06/15 18:27ID:???
意味が分かるようになるまで最低限御勉強しようね。
言葉が通じないのでは御話にならない。
0368nobodyさん04/06/15 18:41ID:???
>>366
お前がモジュールなんていう言葉を使うのは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 でファイル開くことから教えてくんかい?
037136904/06/15 23:25ID:???
ファイル読み書きはできます。
特定のIDとパスワードを検索してその文字列だけを書き換えたい
という処理の仕方をどうすればいいかわからないんです。よろしくお願いします。
0372nobodyさん04/06/15 23:28ID:???
>>371
読み込んで書き換えて上書きしろよ
0373nobodyさん04/06/15 23:32ID:???
>>371
ifを使え
0374nobodyさん04/06/16 00:15ID:???
ちょっとは自分で考えないのかね。
0375sage04/06/16 01:00ID:???
頭が無いんです
0376nobodyさん04/06/16 01:06ID:???
> 特定のIDとパスワードを検索してその文字列だけを書き換えたい
正規表現を15分でいいから勉強するよろし。
0377nobodyさん04/06/16 04:13ID:???
>>369
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
037836904/06/16 17:05ID:???
>>377
ありがとうございます。
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:???
>>379
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();
  }
}
0381nobodyさん04/06/17 14:12ID:???
>>379です。
解決しました。レスありがとうございます。
0382nobodyさん04/06/18 08:52ID:???
すみません。正規表現について教えてください
文字列内に以下の条件を含む部分があるかどうかを
チェックするために正規表現を使ってみたいのですが
いかようにすればよいでしょうか?
?nnnn (nnnnは4桁の数字)
0383nobodyさん04/06/18 10:05ID:???
スレタイ嫁
でも俺すげー優しいからヒントをやろう。

0-9

あとは自分で考え。
スレタイ嫁
0384nobodyさん04/06/18 10:20ID:???
>>383
すげー優
しい


>>382
スレタイ嫁
0385nobodyさん04/06/18 10:48ID:???
できました。
"?[0-9]{4}"
0386nobodyさん04/06/18 10:49ID:???
スレタイ嫁ってなんですか?
0387nobodyさん04/06/18 10:49ID:???
それじゃダメだと思うが
どうダメかは正規表現道場スレで聞け
0388nobodyさん04/06/18 11:14ID:???
>>387
マジですか?
お願いします。教えてください。なにとぞなにとぞ
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:???
perlと言うかjavaスクリプトも絡んでくるかと思いますが
フォームからPOSTで送信してcgiから帰って来る結果を小さいウインドウを別にポップアップして
そこに表示したいのですが、どうすればいいでしょうか?
教えて下さい。お願い致します。
0394nobodyさん04/06/18 21:11ID:???
>>393
http://pc5.2ch.net/test/read.cgi/hp/1087025773/
http://pc5.2ch.net/test/read.cgi/php/1086715675/
0395nobodyさん04/06/18 22:13ID:???
>>393
perlは全く関係ないじゃん
0396nobodyさん04/06/19 04:43ID:Bryn3NL2
質問です

ブラウザからあるperlのプログラムを起動して、データベースの更新をしているのですが、
これをバッチとして自動起動したいと思っています。
で、 perl xxxx.cgi  とすると、エラーになります。
どこでエラーになるかを調べたところ require xxxxx.cgi でrequireが正しくされていないようです。
perl はバッチ処理としては動かないのでしょうか?
0397nobodyさん04/06/19 07:02ID:???
requireをドライブ名からの絶対パスで指定すればいいんでないの?
0398nobodyさん04/06/19 07:28ID:Bryn3NL2
>>397
レスサンクスですが
絶対パスでもだめでした
0399nobodyさん04/06/19 09:50ID:???
1.プロ野球の順位を「変動勝ち点制」(と私が名づけたシステム)で
順位付けをしたいです。「変動勝ち点制」とは、1位のチームは6点、
2位のチームは5点、という具合に各チームがランキングポイントを
持っています。試合の勝者が相手チームのランキングポイントを獲得し、
トータルポイントに加算していきます。その日の順位によってランキング
ポイントは変化します。

2.以下にソースを貼り付けます。データを保存しているresult.datは
1行がこんな風になっています。「d,l,w:k,n,w:l,o,q」。":"で区切った
一番目の要素が勝者で、2番目が敗者です。3番目に"w"となって
いるのは試合が決着した場合、"q"は引き分けです。

3.エラーは出ないのですが、何も答えてはくれません。CPUが100%になって
いるので何かやってはいるみたいなのですが……。
040039904/06/19 09:50ID:???
#$?[0]はチームの頭文字。$?[1]はトータルポイント。
#$?[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:???
>>396
perl -IC:/WINNT/system32 foo.cgi
-Iオプションでrequireするディレクトリを追加してみるとか

>>400
whileって何するのか勉強してこい
0402nobodyさん04/06/19 13:31ID:???
わいろ
0403nobodyさん04/06/19 14:47ID:Bryn3NL2
>>401
サンクスコ やってみます
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:???
>>404
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:???
>>406
<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>; って、
昔俺が赤ラクダ本を読んだときには「そんなことするな」と書いてあったような記憶が
あるんだが、最近はみんなやってることなの?
ファイルを全部いっぺんに読み込むからメモリが膨れ上がって、
共用サーバだと結構世の中の迷惑なんじゃないかという気がするんだが。
一行毎に処理していたフィルタ全盛時代の美徳はもはや失われてしまったのか。
041040804/06/20 14:44ID:???
>>409
私は自宅鯖なのでその処理はメモリ使うって書いていましたが気にせず使っています。
041140604/06/20 15:10ID:???
>>407
ありがとうございます
これって apache の設定ですか?
であればレンタル鯖なのでいじれないんです
他になにかいいアイディアはないでしょうか
よろしくお願いします
0412nobodyさん04/06/20 15:42ID:???
open(IN,"$logfile") || &error("ファイルがオープン出来ませんでした。");
@nakami=<IN>;
close(IN);
$log = "$title<>$time<>message";
unshift(@nakami,"$log");
open(OUT,">$logfile") || &error("ファイルに書き込み出来ませんでした。");
$" = "\n";
print (OUT "@nakami");
close(OUT);
041340604/06/20 16:18ID:???
>>412
うまくいきました。
ありがとうございます。
041440604/06/20 16:19ID:???
と思ったらうまくいきませんでした・・・
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:???
時と場合によるよ。たくさんプログラムを書いてる内にうまく使い分けができるようになる。
■ このスレッドは過去ログ倉庫に格納されています