【Perl】初心者コーナー Part15
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/08/08 23:19ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0414nobodyさん
02/08/27 12:08ID:???日本語のページからwindows runtime Exceptionを検索しました。
http://www.google.com/search?hl=ja&inlang=ja&ie=Shift_JIS&q=windows+runtime+Exception&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
Perl じゃなくて Windows じゃないかしら。マ板かWin板へ。
0415nobodyさん
02/08/27 13:09ID:???0416nobodyさん
02/08/27 13:56ID:???0417nobodyさん
02/08/27 15:55ID:???<img src="pngcount.cgi?4">
<img src="pngcount.cgi?3">
<img src="pngcount.cgi?2">
<img src="pngcount.cgi?1">
とやると4回も起動することになるので1回にまとめたいのですが
@listにそれぞれの画像のパスが格納されている場合
例:@list = ("./image/0.png","./image/1.png","./image/0.png");
上の場合だと010と表示させたいのですが
foreach $number(@list)
{
open(IMG,"$number") || exit; print "content-type: image/x-png\n\n";
binmode(IMG); binmode(STDOUT); print <IMG>; close(IMG); exit;
}
上のようにやっても1つしか画像が表示されません。
いくつも画像を表示できないのでしょうか?
0418nobodyさん
02/08/27 15:59ID:???0419nobodyさん
02/08/27 17:12ID:dvEqdJRZ文字化け対策がうまく行きません。
(文字化けする絵文字としない絵文字がある。)
処理をうまくしてる人はどうやってやってます?
0421nobodyさん
02/08/27 17:30ID:???ヘッダーに空白行(\n\nってとこね)を出力した後には、もうContent-typeとかやってもダメです。
つまり出力できる画像は1つだけです。
0422419
02/08/27 18:00ID:???どうもありがとうございます。文字化けするものと、しないものを一部抜粋しました。
***************************************
NO1 F89F 晴れ 文字化け
NO2 F8A0 曇り 文字化け
NO3 F8A1 雨 大丈夫
NO94 F8FC 車椅子 大丈夫
NO95 F940 新月 文字化け
NO135 F9B0 決定 大丈夫
NO136 F991 黒ハート 文字化け
***************************************
if (!open(OUT,"| $SENDMAIL -t")) { &error('送信できません'); }
print OUT "To: $MAIL_TO\n";
print OUT "From: $WEBMAS\n";
&jis("Subject: $SUBJECT"); print OUT "$msg\n";
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT 'Content-Type: text/plain; charset=iso-2022-jp' . "\n\n";
&jis("$NAME_FROMさんの質問が届きました。"); print OUT "$msg\n";
#絵文字対応
$sjis = '[\x80-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]|[\x00-\x7F]|[\xA1-\xDF]';
$emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]';
$QUERY{'COM'} =~ s/\G((?:$sjis)*)($emoji)/$1.''.unpack('n',$2).';'/ego;
&jis("--$QUERY{'COM'}"); print OUT "$msg\n";
&jis("▽答えはココから"); print OUT "$msg\n";
&jis("$CGI?M=H&T=$ID_FROM&F=$ID_TO&P=$PASS_TO"); print OUT "$msg\n";
close(OUT);
こんな感じにしたんですけども駄目なんです。
0423nobodyさん
02/08/27 23:36ID:???http://pc.2ch.net/test/read.cgi/php/1028052835/l50
0424nobodyさん
02/08/28 02:34ID:TSMc6GTX新しい文字列に置換えるスクリプトを作成したいのですが、わかりません。
下記のメールアドレスで行を取得して、元データ(@old)を
新しいデータ(@new)に置換る(行の置換え)スクリプトを、
上記の様に修正したいのですが・・・。
教えてください。お願い致します。
open(IN,"data/data.csv") or die;
while($line=<IN>){
chomp($line);
if($line =~ $mail){
push(@old,$line);
@tmp1 = "@new";
open(OUT,"+<data/data.csv");
print OUT "@new";
close(OUT);
}
}
close(IN);
0425nobodyさん
02/08/28 03:56ID:???とりあえず元ソースは全放棄したほうがいいと思った
#置き換え対象文字列
$mail="[email protected]";
#置き換え文字列
$replace="[email protected]";
open(IN,"data/data.csv") or die;
@old=<IN>;
close(IN);
foreach (@old){
s/$mail/$replace/g;
}
open(OUT,">data/data_after.csv") or die;
print OUT @old;
close(OUT);
みたいなのでダメなんすか?って全部書いちゃったよおい。
0426425
02/08/28 04:06ID:???一時ファイル作ったほうがいいね。
open(IN,"data/data.csv") or die;
#一時ファイルを開く
open(OUT,">temp.csv") or die;
while($line=<IN>){
$line=~s/$mail/$replace/g;
print OUT $line;
}
close(OUT);
close(IN);
#一時ファイルを消して、ファイルを置き換える
rename('temp.csv','data/data.csv') or die;
はいオナニー終わり!
0427nobodyさん
02/08/28 10:57ID:3EY8gxC5来訪者の度にCGIを実行して、時刻をチェックする方法以外ないでしょうか?
この方法だと、来訪者が増えるたびに処理が重くなってしまいます。
0430nobodyさん
02/08/28 15:34ID:z8uBgDDwm/^hoge$array[0]hoge/;
↑このように書いても、$array[0]はうまく展開されないんです。
どなたかいい知恵貸してください。
おながいします。
0431nobodyさん
02/08/28 16:42ID:???正規表現中のブラケット [] は文字クラスを表します。
foreach などで他の変数に代入してから処理する等の回避方法が考えられます。
0433431
02/08/28 17:11ID:???ごめん。
5.003 Build 316
で試したら、それ、多分期待通りに動いた。他の原因があるかも。
@aaa = ("どおして",);
$bbb = "どおしてそんなことすんのー。やめてーなー。ほんとにもー。";
if($bbb =~ /^$aaa[0]/){print "is true$aaa[0]\r\n"}
else{print "is false$aaa[0]\r\n"}
0434430
02/08/28 18:25ID:???すまそ、おっしゃる通りうごきますた。
正規表現を解釈するよりも前に変数展開してるんでしょうね、きっと。
>>430で「うまく展開されない」と書きましたが、別の原因でした……
…………………吊ってくるっす ゴメ
0435nobodyさん
02/08/28 18:44ID:???readdirで得たファイルリスト「@datafiles」から
カレントディレクトリやデータファイル以外のファイル名が収まっている要素をspliceしたいのですが
なにかうまい方法は無いでしょうか?
データファイルかどうかは命名規則「/^\d+(dat)$/」で判断したいと思っています
0436435
02/08/28 19:06ID:???@datafiles = grep(/^\d+(dat)$/, @filelist);
としてもダメでした
grepの使い方間違ってます?
0437nobodyさん
02/08/28 19:37ID:???だったりはしない?
0438結構前スレ888さん
02/08/28 19:38ID:99E4DmXW前教えてもらったのは"特定のURLから飛んできた人を弾く"
if ($ENV{'HTTP_REFERER'} =~ /aaa/) {
print "Location: abab\n\n";
exit;
}
(aaaから来た人をababに飛ばす)
"特定のURL以外から飛んできた人を弾く"を....
0439結構前スレ888さん
02/08/28 19:39ID:99E4DmXW弾きたいのだけど
0440437
02/08/28 19:46ID:???あと、ファイルテスト演算子 file test operator ってのもあるから。
それで良ければ調べてみるヨロシ
0442結構前スレ888さん
02/08/28 19:56ID:99E4DmXWつまり外部リンクできた人を弾きたいと(.cgiに)
0443nobodyさん
02/08/28 20:25ID:???else か not か !
0444結構前スレ888さん
02/08/28 20:44ID:99E4DmXW0445nobodyさん
02/08/28 20:52ID:???0446435
02/08/28 21:03ID:???そうでした・・・穴掘って埋まってきます・・・
0447nobodyさん
02/08/28 21:22ID:???PerlがRuntime exceptionでこける事例は、例えば
NamazuのBBS
WinNTでNamazuが落ちる事例
http://search.namazu.org/ml/namazu-users-ja/msg00011.html
当たりでやりとりがあります。
ただ、あまりはっきりした解決方法はでてきませんでした。
このやりとりの中で触れられている正規表現の処理に関する問題が
>>412で書いたマッチ64K制限は、確かActivePerlのサイトあたりに
あったことです。
Perlのversionを上げるもしくはUnix系OSの上で処理をするか
いずれかができればいいのですが(普段はそうしてます)、
この件に関してはちょっとそのへんの変更が難しいもんで。
ちなみにperl Runtime exceptionでぐぐるとかなりたくさん
Active Perlのこの問題はでてきます。
0448414
02/08/28 21:38ID:???いや、板違いってゆうのは撤回しますが、結局 ゲイツ が悪いんでしょ?
えーと、現在のところ、どうも原因不明の様ですし、初心者向けの話題でもないようですから。
Active Perl + Win の新スレ立ててみたらどうでしょうか。
0450437じゃないけど
02/08/28 22:29ID:???0451nobodyさん
02/08/29 02:33ID:r6Il9+nbでのアクセント付き記号の扱いに困っています。
例えば、&egarve;を入力して、&egarve;だけにマッチさせたいんで
すが、&egarve;とeが引っかかってきます。
ご存知のお助けください。
0452451
02/08/29 02:36ID:r6Il9+nb>例えば、&egarve;を入力して、&egarve;だけにマッチさせたいんで
>すが、&egarve;とeが引っかかってきます。
は
例えば、èを入力して、èだけにマッチさせたいんで
すが、èとeが引っかかってきます。
です。
0453?
02/08/29 05:06ID:???スキンから読み込んだのを変換するとき、
$skin =~ s/title<!--s-->/$title/i;
$skin =~ s/***/***/g;
$skin =~ s/***/***/i;
$skin =~ s/***/***/i;
・
・
・
って感じなんですが、
$skin =~ s/title<!--s-->/$title/i;
と打ったところ、一つだけしか「s/title<!--s-->」が
変換されなかったんですね。
で、なんとなく、
$skin =~ s/title<!--s-->/$title/g;
にしてみたら、いけたんでけど・・・
この後ろについてる「i」とか「g」の意味はなんですか?
他にも「s」とかもあったんですが・・・
検索しても見つからないのでお願いします。
0455nobodyさん
02/08/29 07:09ID:???検索の仕方を聞いたほうがいいんじゃねーの?
http://www.google.com/search?num=30&hl=ja&inlang=ja&ie=Shift_JIS&newwindow=1&q=%90%B3%8BK%95%5C%8C%BB+%8FC%8F%FC%8Eq&lr=lang_ja
0456482
02/08/29 07:41ID:8thG1OyK( ´,_ゝ`)誰かここのパスワード解いて教えろ
オエの知識じゃわ が ん ね !!
0457nobodyさん
02/08/29 10:53ID:???http://pc.2ch.net/test/read.cgi/hack/997452913/101
0458?
02/08/29 14:55ID:???有難うございます。
つまり、
iは「大文字小文字を区別しない」で、
gは、「全体から探す」ってことで、
oは、「変数を1度しか展開しない」ってことなんですね
で、もう一つ疑問が・・・
=~ /***/ や
=~ m/***/ は解ったんですが、
=~ s/***/ の説明がないんですよ・・・
「m」が「/」以外のディリミタを使えるようにするためのものですよね?
同じ意味なのでしょうか?
違ったら、この「m」とか「s」入る場所?の名称なんかを教えて頂けないでしょうか?
検索すら出来ない状況なので・・・ホントすいません。
0459nobodyさん
02/08/29 15:00ID:???@dataにテキストファイル(S-JIS)から文字列を読み込んで
「print "<TEXTAREA name=\"text\" cols=\"80\" rows=\"16\">@data</TEXTAREA>";」
としたときに、なぜか@dataの2行目以降行頭に半角スペースが入ってしまいます
おかしいな、と思って「print @data;」してみても
行頭に半角スペースが入っている事はありませんでした
改行コードの問題かと思いforeachで「$_ =~ s/\r\n/\n/g;」としても状況に変化がありません
IE,NN共に同じ症状を確認しているのですが
これはHTML、あるいはブラウザの問題なのか、Perl側の問題なのか
どうやって回避したらいいんでしょうか?
0460292
02/08/29 15:01ID:???$XXXに入ってる「Z」を「A」に書きかえる。(最初に見つかったやつだけ)
$XXX =~ s/Z/A/g;
$XXXに入ってる「Z」を「A」に書きかえる。(すべて)
$XXX =~ s/Z/A/i;
$XXXに入ってる「Z,z」を「A」に書きかえる。(大文字小文字を区別しない)
0463459
02/08/29 15:06ID:???テキストデータには展開される可能性がある文字列はありませんでした
・・・そういう意味じゃないのかな
>462
はい、TEXTAREAで挟むと半角スペースが現れますが
「print @data;」だとソースでも半角スペースは現れません
0464?
02/08/29 15:08ID:???sが、置き換えるって意味ですか!
ホントおばかでした。
スレ汚しすいませんでした。
皆さん有難うございました!
0466459
02/08/29 15:17ID:???うーん、直接その答えにはたどり着けませんでしたが
「print "<TEXTAREA name=\"text\" cols=\"80\" rows=\"16\">" . @data . "</TEXTAREA>";」
とすることで解決しました
ありがとう
0467292
02/08/29 15:27ID:???0469nobodyさん
02/08/29 15:28ID:jYAiqFv3*******.ap.plala.or.jp
こんなやつ
$ENV{'REMOTE_ADDR'};
だとIPアドレスが表示されるようなのですが
0470292
02/08/29 15:29ID:???>>466
$" という変数を見てみな。デフォルトでは半角スペース入ってるから。
この変数はprint "@xx";の時に区切りとして使うものを入れてるモノ。
先だって
$" = '';
としておけば半角スペースは無くなる。
0472292
02/08/29 15:32ID:???ただし、最近のプロバイダではここにリモホが入ってる設定にしてるところは少ない(無駄だから)
その場合は次のコードで行けるだろう。
$ENV{'REMOTE_HOST'} = &nslook($ENV{'REMOTE_ADDR'});
sub nslook{
local($x)=@_;
local($ip,$addr);
if($x=~/([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){
$ip="$1.$2.$3.$4";
$addr=(gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0];
if($addr ne ""){
return $addr;
}
}
return $x;
}
0473469
02/08/29 15:33ID:oKWRspRKそうなのかしら。
でもぱっと見わかりやすいのもいいわ。
っていうかじゃぁ両方で。
0474469
02/08/29 15:35ID:oKWRspRKそう、REMOTE_HOSTでやってみたら
何も取得できなかったんですよ。
上のはアドレスから変換してるのでしょうか?
0475292
02/08/29 15:39ID:???nslookというサブルーチンに、IPアドレス$ENV{'REMOTE_ADDR'}を教えて
リモートホストを教えてもらって、空っぽだった$ENV{'REMOTE_HOST'}に代入するコードじゃよ。
0476nobodyさん
02/08/29 15:49ID:???何を取得できてるの?
foreach(sort(keys(%ENV))){$chk .= "$_ is $ENV{$_}<br>\n"}
0478476
02/08/29 15:57ID:???foreach(keys(%ENV)){$chk .= "$_<br>\n"}
0479469
02/08/29 16:03ID:KExh1vW6やってみましたが、それでもIPアドレスになっちゃう。
CGIサーバーはPlalaです
自分のPC上でやるとパソコンの名前が表示されます。
(ActivePerl+httpd)
0480nobodyさん
02/08/29 16:08ID:???あきらめるか、別の鯖で試す。
0481nobodyさん
02/08/29 16:32ID:SCkpIe5Lパースして、htmlから特定のデータを取得したいのですが
必要なモジュールとか、ソースとか解説のHPがあれば教えてください。
0483469
02/08/29 16:50ID:1fSV4HtQこんなのでいけました。
0484nobodyさん
02/08/29 17:01ID:SCkpIe5L何番目のスレの何番になります?
それ読みますから教えてください。
0486初心者の依頼者(´∀`; ◆3zTzMwh2
02/08/29 17:16ID:w2vhS8x7↑に答えが出てることはわかっているんですが、理解できません。
fusianasanで表示されるやつはどうやって取得するんですか?
0488初心者の依頼者(´∀`; ◆3zTzMwh2
02/08/29 17:20ID:w2vhS8x7別に
0490nobodyさん
02/08/29 17:30ID:SCkpIe5Lありがとうございます。
0491nobodyさん
02/08/29 18:02ID:???2chの使い方になると思うんだが、この板から全文検索したいんだが、どうすればいいの?
「全部表示してブラウザで検索」しかないのか? それとも googleに拾ってもらわなければいけないのかな?
0492nobodyさん
02/08/29 18:03ID:???google de "string site:www.2ch.net"
0494424
02/08/29 19:47ID:k9SFERS8有難うございました。
私の勘いで、作成したいスクリプトの記述が間違っていました。
すみませんでした。
(勉強の為、書いて頂いたソースは保存しました)
以下、教えて頂きたい内容です。
任意の文字列が含まれる1行を抽出し、複数の該当文字列を
新しい文字列に置換えるスクリプトを作成したいのですが、わかりません。
(置換え対象の文字列には、手入力の文字列も含まれます)
495の様に、メールアドレスで行を取得し、
@oldに格納されている全ての文字列を個々の変数に代入して、
ファイルに出力させるスクリプトを作成しましたが、うまく動作しません。
確認出来たエラーは2点です。
1.ファイルの一行目しか$lineに入りません。
その為、該当レコードがあるにも拘らず、「データがありません」と
なってしまいます。
2.レコードの改行が削除され、次のデータが同じ行に出力されてしまいます。
($old1,$old2,$old3,$old4,$old5) = split(/,/,$old);
@oldから抽出する上記以外の方法がわからず、困っています。
ソースは495です。お願い致します。
(改行が多く書き込めなかった為、分けました。)
0495424
02/08/29 19:47ID:k9SFERS8置き換えたい変数です→($new1,$new2,$new3,$new4,$new5)
open(IN,"data/data.csv") or die;
while($line = <IN>){
chomp($line);
if($line =~ $mail){
push(@old,$line);
} else {
print "該当するデータがありません。\n";
exit(0);
}
foreach $old (@old){
($old1,$old2,$old3,$old4,$old5) = split(/,/,$old);
}
open(OUT,"+<data/data.csv") or die;
print OUT "$old1,$new2,$new3,$old4,$new5";
close(OUT);
print "書き換えが完了しました。\n";
exit(0);
}
close(IN);
exit(0);
0497nobodyさん
02/08/29 20:22ID:???何をやりたいのだか解らないんだけど。
>>425 をこうするって事かしら。
foreach(@old){
if(s/$mail/$replace/g){push(@new,$_)}
}
print OUT "@new";
使用している各関数がどういう働きをするものかよく調べた方が良いと思います。
ラクダ本を買うとか。
0498nobodyさん
02/08/29 21:09ID:mQvrBYqz何も手を加えてないのに、昨日まで動いてたcgiが動かなくなったんですが、
これは何が原因でどうすれば直るんでしょう。
kentのyybbsを色々いじってたんですけど、文法エラー解消しても動かないので
まずは無改造のスクリプトをただ上げたんです。
そしたら動かない。
しかも、それまで使ってたスクリプト(2つあるうち1つだけ)が突然internal server error。
頭抱えてます。
どなたか助けてください。
0499nobodyさん
02/08/29 21:12ID:0ltwZgpC1件につき最大10.000円の高額収入。月収100万円以上も可能。
■画期的なビジネス!
インターネットを利用したこれまでにない斬新で画期的なビジネスです。
■誰でも出来ます!
インターネットができる環境の方なら誰でも参加可能です。
インターネットを利用したビジネスですので、自宅や会社で好きなときにで
きるビジネスです。
■専門的な知識は一切不要!
ビジネスに必要なツールは全て当社で用意いたします。
また、サポートも万全です。
■詳細は今すぐこちらから
http://www.future-web.tv/haru/
0503498
02/08/29 22:31ID:mQvrBYqz逝ってきます。
0504424
02/08/29 23:02ID:zsUv5K1Pレス有難うございました。
書き方が悪くてすみませんでした。
>>425 様にも>>426で教えて頂いたのですが・・・。
置換え前の文字は$mail以外、変数では無いので
マッチさせる事が出来ない状態でした。
ファイルから文字を取得し、変数に格納したいと思っていました。
入力フォームを作り直します。
0505505
02/08/29 23:31ID:kiu2pPYaopen(HTML, ">hoge.html") || &error("HTMl化に失敗しました。");
print HTML &end;
close(HTML); }
開いたファイル(hoge.html)に書き込みたくて上のように記述したのですが、
ファイルを開いて直接サブルーチン(&end)を使うのは無理なのでしょうか。
0506_
02/08/30 00:12ID:???/ ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■■-っ < >>505んな こたァない
´∀`/ \__________
__/|Y/\.
Ё|__ | / |
| У.. |
0508505
02/08/30 13:07ID:tuhObyZ6&header;
open(IN,"$file") || &error("$file を読み込めません");
@lines = <IN>;
close(IN);
foreach $line (@lines) {
local($name,$url,$mail,$body,$hogehoge) = split(/<>/,$line);
&output;
}
&footer;
exit; }
こんな感じです。
0510
02/08/30 13:29ID:UPHK1/CWフォントサイズを大きくしたり、名前を変更している人がいました。
どうやったらできるのでしょうか?
0512nobodyさん
02/08/30 13:43ID:???戻り値を print 死体なら
return @lines;
だろうけど…。どう説明して良いやら。
>>510
そのチャットの管理人に聞いて下さい。
0513
02/08/30 13:45ID:UPHK1/CWソースを書き換えるのですか?
どうやれば書き換えられますか?
■ このスレッドは過去ログ倉庫に格納されています