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

Perl 初心者コーナー Part24

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0427nobodyさん03/06/16 12:04ID:???
>>426
どいうこと?ワイルドカード使ってやる方法キボンヌ。
awkにできてPerlにできないはずないだろうから。
0428nobodyさん03/06/16 12:07ID:???
>>425
http://www.google.com/search?num=100&hl=ja&inlang=ja&ie=Shift_JIS&safe=off&c2coff=1&q=perl+http+get&lr=lang_ja
0429nobodyさん03/06/16 12:11ID:???
>>427
できません
0430nobodyさん03/06/16 12:18ID:8IGausxn
>>428
ありがとうございます
0431nobodyさん03/06/16 12:19ID:???
>>429
厨め。できたよ。教えてやらない。
0432nobodyさん03/06/16 12:59ID:???
>>425
>>398は無視か?この糞野郎。二度と来んなボケ。氏ね。
0433nobodyさん03/06/16 13:34ID:???
この場合は
$a = 0;
if (!$a)
真でいいんですよね。
では↓こういう式の時は
if (!($a==0 && $b))

変数が
$a = 1 $b = 1 の時は 偽
$a = 1 $b = 0 の時は 真
$a = 0 $b = 1 の時は 偽
$a = 0 $b = 0 の時は 偽

でいいのかなそれとも

$a = 1 $b = 1 の時は 真
$a = 1 $b = 0 の時は 真
$a = 0 $b = 1 の時は 偽
$a = 0 $b = 0 の時は 真

こっちでしょうか? よろしくお願いします。
0434nobodyさん03/06/16 13:50ID:???
>>433
そこまでわかってるなら自分で試せよ…。
0435nobodyさん03/06/16 13:56ID:???
>>419
ASCIIモードで転送しろ
と誰も言わないのはなぜだ・・・
0436nobodyさん03/06/16 13:59ID:???
>>433
なんだ、そのif文の条件は。
ただの嫌がらせだろ。

$aが真であり、なおかつ、$bが偽の場合という条件。
0437nobodyさん03/06/16 14:08ID:???
>>434
自分で書いたものではなくて試そうにも中に実際中に何が
はいっているのかも解らず1つ1つ解決していこうとは思っているのですが、
検索したり、リファレンスみたりしてるのですが、こういった例が見当たら
なかったので質問しました。よろしくお願いします。
0438nobodyさん03/06/16 14:13ID:???
>>436
ありがとう。助かりました。
0439nobodyさん03/06/16 14:32ID:???
>437
ローカルにテスト環境を作って試す。
これ常識。
マジで。
0440nobodyさん03/06/16 14:40ID:???
>>439
一応ためしているのですが
解ったことは
$a = 0 $b = 0 は実行されているみたいです。
でもそれだとアレ?
0441nobodyさん03/06/16 14:41ID:???
>>437
まあマジレスすると

$a=1;
$b=1;
if (!($a==0 && $b)){
print "ok\n";
}

こんな感じにして、4回変数を書き換えればテストは出来る。
記述が正しいかの動作確認だけなら、一々スクリプト全体を
見直す必要は無い。
0442nobodyさん03/06/16 15:37ID:???
>>441
ありがとうございます!!
結果がわかりました。
でも、頭で理解しようとすると自分にはとても難しい。。。
0443nobodyさん03/06/16 17:25ID:0o9Ehb4h
メールフォームを作ってます。
$addr = $ENV{'REMOTE_ADDR'};
でIPアドレスを取得するように設定したのですが
友人に送ってもらったメールのIPアドレスと自分で送ってみたものが
同じIPアドレスになってました。
なんでー???
0444nobodyさん03/06/16 17:32ID:???
>>443
念のため確認だが、実は二人とも同じケーブルで同じ収容局とか、
そういった落ちは無いよな?
0445nobodyさん03/06/16 17:34ID:???
>>443
> なんでー???
あなたの描いたスクリプトがバカだから。
と答えて欲しいの?
0446nobodyさん03/06/16 17:34ID:???
>>443
REMOTE_ADDRが同じだったから。
0447nobodyさん03/06/16 17:45ID:???
>>425
$port = getservbyname('http', 'tcp');
$iaddr = inet_aton($host);
$sock_addr = pack_sockaddr_in($port, $iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, 0);
connect(SOCKET, $sock_addr);
select(SOCKET); $|=1; select(STDOUT);
print SOCKET "GET /$path HTTP/1.0\r\n";
print SOCKET "\r\n";
@get = <SOCKET>;

こんな感じで
044844303/06/16 18:05ID:0o9Ehb4h
REMOTE_ADDRは同じではないと思います。
住んでる所は友人は関東で私は中部だしプロバイダーも違うし。
$addr = $ENV{'REMOTE_ADDR'}; の箇所以外に
IP取得に干渉するものがあるんでしょうか?
もちょい試行錯誤してみます。
0449nobodyさん03/06/16 18:43ID:???
1秒ごとに@dataの文字を書き出したいのですが、
↓のようにすると、sleep(1)×配列の個数ぶん待った後
一気に出力されます。。
1文字づつ1秒間隔で出力したいのですが、、どこがまちがってますか?


@data = ("あ","い","う","え","お","か","き","く","け","こ");

print "Content-Type: text/html\n\n";
print "<html>\n";
print "<title>self</title>\n";
print "<body>\n";

for($i=0; $i<=$#data; $i++){
print "$data[$i]<br>\n";
sleep(1);
}
0450nobodyさん03/06/16 19:35ID:???
>>449
CGIスクリプトとして動かしてる?
0451nobodyさん03/06/16 19:42ID:???
>>450
どういうことでしょうか?
ローカルで動かしているんですが、
AddHanderもして、
拡張子もcgiで、ちゃんとスクリプトのはずですが。。。
0452nobodyさん03/06/16 19:47ID:???
>>448
REMOTE_ADDRを記録して、それが同じだったということはREMOTE_ADDRが同じだったということではないですか?
>>451
CGIは全部実行した後出力するんだよ。たしか。
0453nobodyさん03/06/16 19:51ID:???
え、じゃあスリープの意味って・・・・
0454nobodyさん03/06/16 19:51ID:???
>>453
PerlはCGIためだけのものではありません。
0455nobodyさん03/06/16 19:56ID:???
>>449
俺にもよく分からんけど、この辺とか
ttp://www.google.co.jp/search?q=cache:yNlP1fhIQ48J:tohoho.wakusei.ne.jp/lng/199802/98020500.htm+%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%AA%E3%83%B3%E3%82%B0+cgi&hl=ja&lr=lang_ja&ie=UTF-8
0456nobodyさん03/06/16 20:40ID:???
MobileType(スペルあってるかな?モバイルタイプ)っていう
スクリプトで、mt-load.cgiを実行したときに1行ずつ表示されてたんだけどなぁ。
nphでもなさそうだし・・・
0457nobodyさん03/06/16 21:32ID:???
>>456
mt-load.cgi の20行目で、>>455の "$|=1" してるから
0458nobodyさん03/06/16 21:34ID:???
>>457
ほんとだ、localついてて見落としてた。。。
でも、sleepもないし、nph-*.cgiでもないのに・・・
どういう仕組みなんでしょうか?
0459nobodyさん03/06/16 21:38ID:???
うぅ、何回も1行ずつ流れてるのみてる・・
イイナァ
0460nobodyさん03/06/16 22:00ID:???
>>443
IPをHOSTに変換してみたら何かわかるかも
0461nobodyさん03/06/16 22:06ID:???
どれもこれもネタか?
あああ鬱。
046245803/06/16 22:08ID:???
ほんとお願いしますよ〜〜
どうやったらできるんでしょ。。
ネタとか言わないで・・・
0463nobodyさん03/06/16 22:26ID:???
REMOTE_ADDRが常に同じ値になるように設定してあるサーバがあるよ。
0464nobodyさん03/06/16 23:52ID:???
REMOTE_ADDRを表示するだけのスクリプト書いて
いろんな串さしてみて試せば?
0465nobodyさん03/06/16 23:55ID:???
>>449

$| = 1;
@data = ("あ","い","う","え","お","か","き","く","け","こ");
print "Content-Type: text/plain\n\n";
for($i=0; $i<=$#data; $i++){
print "$data[$i]<br>\n";
sleep(1);
}
exit;

これでやってみれ。
046645803/06/16 23:57ID:???
>>465
ん〜、やっぱり始めに全部sleepして一気に吐き出しますねぇ。。。
0467nobodyさん03/06/17 00:02ID:???
いっそのこと、1行ずつ表示する部分はJavaScriptに任せちゃうとか。
0468nobodyさん03/06/17 00:09ID:???
>>466
そりゃ環境がおかしいんだわ
046945803/06/17 00:12ID:???
>>468
マジっすか?
0470nobodyさん03/06/17 00:14ID:???
>>466
htmlについてもよく考えてみれ。
ブラウザがソースを受け取り、解釈してからレイアウトを決めて
どの時点でどういう順番で表示するか保証はないんだぞ?
047145803/06/17 00:14ID:???
NNならちゃんと1文字ずつ出ました。
IEだと無理です。
047245803/06/17 00:17ID:???
うーんと、、、
1行ずつ表示する文字をdatなりに保存して読み出したいので、cgiがいいんですけどね〜。。
javaはソース見え見えなのがいやだなぁ。。
0473nobodyさん03/06/17 00:18ID:???
>>465
WinのIE6で1秒ずつ表示になるね
047445803/06/17 00:20ID:???
>>473
え???
俺、ローカル(Win)でやると、
あ<br>
い<br>
ってのが一気に表示されて、
レンタルサーバ(linux)だと、
ファイルのダウンロードになった
0475nobodyさん03/06/17 00:31ID:???
>>472
とりあえずJavaとJavaScriptは別モンだゴルァ!とお約束の突っ込み。

CGIでは、表示するぶんだけの文字列とそれを表示するためのJavaScriptを出力して
実際の表示はJavaScriptに委ねる、って意味なんだけど。
まあ、可能かどうかは分からんが。
0476nobodyさん03/06/17 00:39ID:fNA5EU9/
初心者の質問で申し訳無いのですが
foreach文の中で次のループに移るコマンド(for文のcontinueみたいなやつ)
はあるのでしょうか?
御教授くださいませ。
0477nobodyさん03/06/17 00:40ID:???
sage忘れスンマソン(;´Д`)
0478nobodyさん03/06/17 00:43ID:???
>>476
next

あとsageてもスレが下がるわけじゃないんで。
0479nobodyさん03/06/17 00:48ID:???
>>476
goto

あとsageてもスレが下がるわけじゃないんで。

0480nobodyさん03/06/17 00:50ID:???
>>478,>>479
即レスありがd。早速試してみます。
0481nobodyさん03/06/17 01:02ID:???
しかし何で一文字づつ表示させたいの?
まさか、CGIで よ う こ そ とか、下らない事やりたい訳じゃないよね。
JavascriptやFlashが無難だと思うけど・・・。
0482nobodyさん03/06/17 01:06ID:???
だよな
見るほうはさっさと表示されたほうがありがたいだろうに
自分のセンスでおもしろいカッコイイと思ってもみんながそうとは
0483nobodyさん03/06/17 01:08ID:3tOJ9ih6
皆さん目が悪いようなのでもう一度質問します。

SSIでCGIを呼び出そうとして失敗したときに
[an error occurred while processing this directive]
というエラー文が.sthmlファイルの中に出てくるんですが、
この文章を自由な文面に変更したり出来るんでしょうか?
出来ればリンクタグに変えたいんですが・・・
0484nobodyさん03/06/17 01:10ID:???
えっと、まずスレタイと>>1をどうぞ。
0485nobodyさん03/06/17 01:12ID:???
>>483
<!--#config errmsg="?????" -->
0486nobodyさん03/06/17 01:13ID:QhMbf/ik
globについて質問ですが、

my $file = '/dir/*';
my @list = glob("$file");

このようなイメージでglob内ワイルドカードを
変数化することは可能でしょうか。
0487nobodyさん03/06/17 01:22ID:???
>>486
>>1を読んで出直せ。答える必要なし。
0488nobodyさん03/06/17 01:22ID:???
>>486
そのやり方じゃダメなの?

それより、何でスカラー変数をいちいち "" で囲むんだろう。
たまにリストでそれやってハマってる人がいるけど、なんかそういう参考書があるのだろうか。
0489nobodyさん03/06/17 01:29ID:???
>>483
頭が悪いようなのではっきり言っておきます。
Perlに関係ないだろうが。
049048603/06/17 02:09ID:???
いや、ごめんなさい。

$file = '/dir/*';
my @list = <$file>;

はいかないのに

$file = 'dir/*';
my @list = </$file>;

はいったので、すごい疑問に感じ、ここでglobについて
質問させていただきました。
雰囲気を壊してしまいすみませんでした。
0491nobodyさん03/06/17 06:23ID:???
>>490
<$file>と書いた場合は、$fileがファイルハンドルと解釈されてるだけだよ。
<>演算子は、中身によって行入力になったりグロブ演算子になったりと、紛らわしい。
だからPerl5以降では、glob()を使ったほうがいい。
0492nobodyさん03/06/17 07:06ID:???
掲示板の記事削除処理において
ファイルを開き、記録された記事番号とパスワードを取りだし
入力されたパスワードと選択された記事をそれぞれ比較して
該当した記事以外を記録しなおすという処理を作ったんですが
いろいろいじってるうちになんだか変な動作するようになりました。
入力したパスワードが正しいとなぜが一番違いの記事のパスワードと比較します。
入力されたパスワードが間違ってると、その記事のパスワードと比較します。
何が悪いんでしょう?
0493nobodyさん03/06/17 07:07ID:???
foreach $line (@lines) {
$del = 0;
local($no,$key) = split(/,/,$line);
if( ( $FORM{'delete'} eq $key ) ){
if ( $no eq $FORM{'target'} ) {
$del = 1;
}
if ( $del == 0 ) {
push (@line2,$line);
}
}
else {
&error("キーが違います。");
}
}
049449203/06/17 07:08ID:???
493も俺です(´∀`;)
0495nobodyさん03/06/17 09:48ID:???
オブジェクト指向で書いているのですが、ファイルのラッパーのような
ものを作っています。その際、ファイルハンドルなどはインスタンスごとに
違うものにしたいのですが、どのようにすればよいのでしょうか?

滅茶苦茶な例なのですがC&Perlで言うと下のようなイメージでやりたいと思っています
my $seif = shift;
$self->{handle} = fopen( …
0496nobodyさん03/06/17 10:39ID:???
>>495
IO::File
0497>>49203/06/17 13:30ID:XeNVFdef
foreach $line (@lines)
{
  $del = 0;
  local($no,$key) = split(/,/,$line);
  if( ( $FORM{'delete'} eq $key ) ){
   if ( $no eq $FORM{'target'} ) {
    $del = 1;
   }
   if ( $del == 0 ) {
    push (@line2,$line);
   }
  }
  else {
   &error("キーが違います。");
  }
}

字下げくらいしろ。
見易さが違うだろうが。

っといいつつ、俺はPerlに関しては初心者だからまだ分からんがな。
今アクセスログやってんねや。んじゃ
0498nobodyさん03/06/17 13:36ID:???
>>492-493
その書き方はおかしいだろう。
記事番号$noはユニークだろうが、パスワード$keyは同じ値が
ありえるはず。
評価の順番が逆だ。
これでどうだ?

foreach $line (@lines) {
local($no, $key) = split(/,/,$line);
if ( $FORM{'target'} eq $no) {
if ( $FORM{'delete'} ne $key ) { &error("キーが違います。"); }
} else {
push (@line2, $line);
}
}

書き直しただけで、上記は再考の余地あり。
最初のほうで一致しても最後までループ処理が続いてしまって無駄。
0499新着03/06/17 14:12ID:nJC3WMH6
ホームページはこちら---> http://www.ecopig.jp/comucale/index.htm
0500nobodyさん03/06/17 14:23ID:???
質問です。
cryptの暗号化についてです。
cryptによる暗号化は、サーバーによって結果が異なるのでしょうか?
自分のローカル環境とinfoseekの鯖では同じ結果になったのに、
友人のFreeBSDの鯖では結果が異なりました。
ラクダ本も見てみたのですが、詳しく載ってないみたいで。

以下がソースです。
#!/usr/local/bin/perl

$salt = 'sa';
$key = 'hogehage';
$crypt = crypt($key,$salt);
print "Content-type: text/plain\r\n\r\n";
print "salt=$salt\n";
print "key=$key\n";
print "crypt=$crypt\n";

ローカルの結果が、
salt=sa
key=hogehage
crypt=saaqOoONNsWPU

友人の鯖での結果が、
salt=sa
key=hogehage
crypt=$1$sa$YaIYjBa3kyQD6Oqo6pfMi.

でした。
もし可能なら、暗号化した後の結果が同じにしたいのですが、
どなたか方法をご存知ないでしょうか?
0501nobodyさん03/06/17 14:34ID:???
というか、同じになったら暗号化にならないだろ。
0502nobodyさん03/06/17 14:37ID:???
同じ種と同じキーを使えば、同じ結果になるのがcryptではないんでしょうか?
0503nobodyさん03/06/17 14:40ID:???
>>500
cryptはOSによって暗号化のアルゴリズムが異なることがある
ttp://hasunuma.pobox.ne.jp/support/cyclamen.cgi?log=perl&tree=r18

こんなのを使う手もあるし
ttp://www.mikeneko.ne.jp/~lab/perl/des/
050450003/06/17 14:56ID:???
>503
どうやら友人の鯖ではMD5がなにか関係しているようですね。
ライブラリの紹介もありがとうございました。
試してみたところ、これを利用すれば同じ結果になりました。
ありがとうございました。
0505nobodyさん03/06/17 15:37ID:in7oUIeX
CSVを開いたあと、各行(@values)について、
$LOCATION[$values[0]] = {
"locationname" => $values[1],

としているのですが、


@locationlist = split(/_AND_/,$in{'locationid'});
#($in{'locationid'}は「1_AND_3_AND_7」のカタチで入ってきます。)
for($i = 0; $i <= $#locationlist; $i++){
  $HtmlLocationList .= $LOCATION[$locationlist[$i]]->{locationname} . "***":
}

で、表示されるのでが「***」の部分だけで、
$LOCATION[$locationlist[$i]]->{locationname}の部分が表示されません。
なぜなのでしょうか?
0506nobodyさん03/06/17 16:03ID:???
document.write("<font color="#FF9900">◆</font>リニューアルオープンいたしました!");
というものから、「<font color="#FF9900">◆</font>リニューアルオープンいたしました!」を取り出したいのですが、


$JSAll =~ m/document\.write\(\"(.*)\"\)\;)/;

で。$1を得ようとすると、
/document\.write\("(.*)"\);)/: unmatched () in regexp at index.cgi line 34.
といわれてしまいます。
どうしたらちゃんと動くのでしょう?
そもそも、 unmatched ()ってどういう意味なのでしょう?
0507nobodyさん03/06/17 16:37ID:???
>506
()の数があってない。
板違いだが、1行目のJSすらエラーだな。
0508nobodyさん03/06/17 16:37ID:AMyzcYWt
$str = 'document.write("<font color="#FF9900">◆</font>リニューアルオープンいたしました!")';
$str =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;
0509nobodyさん03/06/17 16:38ID:???
「2chからきました」ってコメントに書いたら値引きしちゃうよ(^_^)v
↓↓↓
 http://www.dvd-yuis.com/
0510nobodyさん03/06/17 16:41ID:vHbufOUB
$str = "abcdabcdef";
@array = split(/\t/, $str);

foreach $value (@array){
$flag = 0;
foreach (@result){
if($_ eq $value){ $flag = 1; }
}
if($flag == 0){
push(@result,$value);
}
}

重複した要素を除く処理を作ったんですけど無駄はありますか?
0511nobodyさん03/06/17 16:49ID:???
>510
ツッコミどころが多すぎてどこからつっこんでいいかわからん。
無駄以前に、思い通りの動作しないだろ。
0512nobodyさん03/06/17 16:51ID:???
>>506
エスケープしなきゃいけないんじゃないですか?
0513_03/06/17 16:51ID:???
http://homepage.mac.com/hiroyuki44/
0514nobodyさん03/06/17 16:51ID:???
>>512
誤射、すいません。
0515nobodyさん03/06/17 16:52ID:???
>>510
漏れもそんなに詳しいわけじゃないが、こんなんは駄目か?

$str = "abcdabcdef";
@array = split(/\t/, $str);

foreach $value (@array){
$hoge{$value} = '';
}

foreach $value(keys(%hoge)){
push(@data,$value);
}
0516nobodyさん03/06/17 17:19ID:???
$a = 'abcdabcdef';
@a = split(//,$a);
for (@a) {
$a{$_} += 1;
}
@a = sort keys %a;
0517nobodyさん03/06/17 17:26ID:vHbufOUB
>>511
いえ、します。

>>515-516
ちょっと試してみます。
0518nobodyさん03/06/17 17:33ID:???
>511
@resultはどこから沸いて出たんだ?
$strにタブがないのにタブで区切ってどうするんだ?
0519nobodyさん03/06/17 17:33ID:???
>518 =~ s/>511/>510/;
0520nobodyさん03/06/17 17:34ID:UJvendEv
>>510
その処理が、全体のパフォーマンスに影響するのかな?
影響しないなら、考えるのが無駄。
0521nobodyさん03/06/17 17:50ID:vHbufOUB
>518
@resultは宣言してないだけ、
タブが勝手に消えるのは2ちゃんねるの掲示板の仕様

>520
パフォーマンスのこともあるけど、
もっといい方法があるならそれを見て勉強になるし。
0522nobodyさん03/06/17 17:53ID:GIfprx1b
質問です。
サブルーチンのなかで、サブルーチン書くのはなんか悪いことありますか?
グローバル変数つかうのと、一連の処理をすべて、同じブロックに入れるのはどれがいいでしょうか?
0523nobodyさん03/06/17 18:16ID:vgoejlvM
すみませんが、
正規表現で使う「=~」の「~」つまりチルダですが、これってチルダでいいですか?
というのは私の持っている本ではこの波が真ん中に来ていて、チルダに見えないんですよ。
実際これはチルダで委員ですか?
0524nobodyさん03/06/17 18:27ID:???
>522
サブルーチンの中にあるサブルーチンを
どこか別のサブルーチンから呼び出す時に
面倒だ罠。
0525nobodyさん03/06/17 18:28ID:???
>>523
それはフォントの問題。どうしても心配ならキャラコード調べてみれば?
0526nobodyさん03/06/17 18:28ID:???
>>524
その同じブロックにある中から以外から呼ぶことはありません。
それならどうでしょうか?
■ このスレッドは過去ログ倉庫に格納されています