【Perl】初心者コーナー Part17
レス数が950を超えています。1000を超えると書き込みができなくなります。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0877nobodyさん
02/11/17 02:09ID:???0879nobodyさん
02/11/17 04:24ID:???まさか君Perlを webで使うことしか考えてないのか?
ちょっとしたSystem管理みたいなことやらせるのに
PHPとかは向いてないでしょ (w
0880nobodyさん
02/11/17 04:34ID:???Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perl
0881nobodyさん
02/11/17 05:35ID:???0882nobodyさん
02/11/17 08:12ID:???PerlEditorとかなんか挙動不審なんですけど…
(・∀・)イイ!エディタに乗り換えたいよ…
0883nobodyさん
02/11/17 12:27ID:???追いつめられた羊のような事を書かないで欲しいです。
PerlはWEB使うことが主流です。
そんな使い方をする人なんて極々わずかです。いや今は他の言語を使います。
あなたはWEBはPHPを使ってるんですか?Perlでしょ?
だったらもっとPerlを応援してください。
Perl最高! Perl最高! Perl最高!
0886nobodyさん
02/11/17 14:00ID:???0887nobodyさん
02/11/17 16:44ID:eZnGzPxh0888nobodyさん
02/11/17 16:48ID:???自分周辺の狭い世界だけで語るなボケ
0889nobodyさん
02/11/17 16:51ID:???0891887
02/11/17 16:55ID:eZnGzPxhwhile (<DATA>){
if (/set|SET/){
print "$line : $_<br>";}
$line++;
}
0892nobodyさん
02/11/17 17:12ID:???while (<DATA>){
if (/set|SET/){
print "$line : $_<br>";}
$line++;
print;
}
0893887
02/11/17 17:12ID:eZnGzPxhさっきのHTMLの中に埋め込むタグは<SET1></SET1>と対にさせて、その中身を取り出すってかんじです
0894nobodyさん
02/11/17 17:26ID:???>中身を取り出す
いったいどっちがやりたいの?
0895887
02/11/17 17:36ID:eZnGzPxhスマソ
まず、HTML内の<SET1>この文字を取り込む</SET1>から対象文字「この文字を取り込む」をを読み込む。
その後、「この文字を読み込む」を消し、別の文字列を代入
こんなかんじです。どうぞおながいします
0896nobodyさん
02/11/17 21:00ID:JxVm/eIS文字列の最後に改行コードが入ってる為か抜けられません。
chopで改行コードを取り除かずにEOF(改行)のまま認識させるためにはどうしたら良いでしょうか?
0897nobodyさん
02/11/17 22:33ID:???頭に書いてあるではないか。
print Jcode->new($str)->h2z->tr($from, $to)->utf8;
これが理解できないのなら、おそらく一般的なモジュールの使い方が理解できていない
ので、少し戻ることをお勧めする。
また、英語のマニュアルが読めないと、プログラミングにいちじるしい支障をきたすこ
とが多いので、あなたが職業プログラマなら即刻退職を、趣味のプログラマなら英語の
マニュアルに慣れることを勧告する。
>>895
HTML::Templateを使ってみることをお勧めする。
>>896
@hoge = ();
$i = 0;
while ($hoge[$i] = <STDIN>) {
print "$hoge[$i]", "\n";
$i++;
}
と書いてみたらC-dで抜けられたが、どういうコードを想定しているのか教えて欲しい。
それから、改行を削るのは通常chompで行なう。chopは削った残りを返り値として欲しい
場合などに使う。
0899test ◆wSaCDPDEl2
02/11/17 23:08ID:???挫折。
わかる方宜しくおねがいします
0900nobodyさん
02/11/17 23:11ID:???HTMLでは、独自に定義したタグを使うことはできない。
そのため、「完成品」からは、独自タグが消えていなければならない。
HTML::Templateでは、独自タグを残せないので>>895の用件を満たせないと指摘したい
のだと思われるが、もしそうなら用件がおかしい。
しかしながら、>>887を見ると独自タグ自体に意味はないものと考えられるため、上の
ような回答を行った。
0901nobodyさん
02/11/17 23:16ID:???どんな風に挑戦したかソース出してみ。
俺は意地悪だからアドバイスをする気はあっても、答えをそのまま載せる気はなくてね。
0902nobodyさん
02/11/17 23:16ID:???とりあえずこちらのスレへどうぞ
【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
0905896
02/11/18 00:12ID:JyAtIJIy現在、Perlでキーボードから一行ずつ文字列を入力し、
その文字列を保存するスクリプトを組んでいるのですが、
文字列入力をするループから抜ける終了判定として文字列"EOF"が入力された時にしたいんです。
しかし、<STDIN>でキーボードから"EOF"と入力した場合、最後に改行コードが入ってしまって
while ($hoge[$i] ne "EOF")
だとEOF(改行)とEOFが一致しないんです。
改行コードを取り除けば可能ですが、それだと保存した際に一行になってしまいますよね?(多分
何か良い方法はありますでしょうか??
0907896
02/11/18 00:34ID:JyAtIJIyそのやりかたがわからないんです・・・
0908nobodyさん
02/11/18 00:37ID:Lol6CcQnPHP研究所?
0911rubyist@カラアゲうまうま
02/11/18 00:47ID:???0912nobodyさん
02/11/18 00:57ID:???print OUT substr(scalar(<STDIN>), 0, -1);
close(OUT);
0913896
02/11/18 01:12ID:JyAtIJIyぐぁ!?出来ました。ループ抜けられました。感動。
これは^以降から$の間の文字が一致すれば終了って意味かな。正規表現?
力不足でどのような処理か理解出来てませんけど、ありがとうございました。
>>910
キーボードから文字列EOFが入力されたときに、
EOFの後ろについてしまう改行コードを取り除くことなくEOFと比較したかったんです。
>>911
改行コードを取り除い、更に後からまた付け足すんですか?
まぁその方法もまだわからないんですが・・・。
0914nobodyさん
02/11/18 14:52ID:???でも、例えば格納データとかが多いとどうしても
配列を多く使わないといけない場合とかありますよね。
配列が多すぎて動かないとかいう事あるんですか?
0916nobodyさん
02/11/18 14:57ID:???「ただし、試すならローカルで」も付け加えといてね。
0917てすとさん
02/11/18 15:22ID:I0IdwfDh肝心のCGIで$FORM{'child'}を取り出そうとしても中身が空っぽになってしまいます。
どうしてでしょうか?
サーバーエラーが出るわけでもなく、フォームの中身が全て空なこと以外は正常動作します。
また、method="post"を削るとちゃんとデータが送信されていることがURLに出てきます。
フォームに書き込んだ情報をCGIで表示するだけなのに、てこずってしまっています…。
0918nobodyさん
02/11/18 15:37ID:???0919てすとさん
02/11/18 15:57ID:I0IdwfDhデコード忘れてた、鬱氏。
4時間くらいそれで詰まってた、マジで死にたい…
0921nobodyさん
02/11/18 19:09ID:19d2puZrログ保存部分までは出来たのですが
週別に新規ファイルを作成して保存うまくいきません
具体的には 月〜日曜 を一週間として
翌週には新しいログファイルを作成するというのを考えてます
しかし
・新しい週になったかどうか
という判定がうまくいきません
何か良い方法は無いでしょうか?
0922nobodyさん
02/11/18 19:25ID:???0923nobodyさん
02/11/18 19:41ID:19d2puZr翌週の月曜日まで新規ファイルにならないのです・・・
0924nobodyさん
02/11/18 19:45ID:ODy6L3pp0925nobodyさん
02/11/18 20:03ID:???毎起動ごとにログの保存チェックをしろ。
0926nobodyさん
02/11/18 20:54ID:19d2puZrそのアルゴリズムがうまくいかなくて悩んでます
0928rubyist@カラアゲうまうま
02/11/18 21:24ID:???0929nobodyさん
02/11/18 22:48ID:???http://pc.2ch.net/test/read.cgi/unix/1000303370/697
を書き込んだものです。
急いで、数を数える必要があるので、こっちでも聞きます。
awkで書こうと思ったのですが、perlでもできそうなので、
質問しますた。
スクリプト書いてくだされば、助かります。我がまますみません。
0930nobodyさん
02/11/18 22:55ID:???if文とかで、返り値を否定したい時はどうすればよいのでしょうか?
if(!(-d "存在するディレクトリ")){〜〜〜} とか
if(-d !"存在するディレクトリ"){〜〜〜} とかやってみたのですがダメでした
今現在、
unless(略){
if(略){〜〜}
}
ってカンジで書いてるのですが、なんとか一回ですませたいので…
if(!略 and 略){ ←みたくしたいのです…
どうか御教授ください
0931nobodyさん
02/11/18 23:04ID:???if (!(-d "存在するディレクトリ") and 略) {
!(-d "存在するディレクトリ") もしくは not -d "存在するディレクトリ" で「存在しない」になるはずだけど。
0932nobodyさん
02/11/18 23:09ID:???0933デフォルトの名無しさん
02/11/18 23:10ID:???>if(!(-d "存在するディレクトリ")){〜〜〜}
>if(-d !"存在するディレクトリ"){〜〜〜}
両方OKよ。
>unless(略){
> if(略){〜〜}
>}
略の部分が同じなら常に真。
>if(!略 and 略){
これもそう。
0934デフォルトの名無しさん
02/11/18 23:11ID:???0936843
02/11/18 23:31ID:???ありがとうございます。
まだこちらでは依然として動いてくれないのですが、
考え方自体は間違っていないのですね。
$i=1のところを$i=0にしてしまったようなケアレスミスが
こちらに残っているのだと思います。
もう少し自分で頑張ってみて、どうしてもできないようでしたら
また相談させていただきます。本当にありがとうございました。
0937935
02/11/18 23:37ID:???さらに「自然観察会」ってのも数えたいので、スクリプトの登場まってます!!
0939nobodyさん
02/11/18 23:41ID:???0941929
02/11/18 23:59ID:???スクリプトの登場まってます!!
0942930
02/11/19 00:02ID:???あれれー(;;´Д`) とりあえずnotが見た目わかりやすいし、それでできたのでそれで行きます
ありがとうございますた
>>932
自分で最初やってみた時はだめだったんですよぅ
>>933
もっかい実験してみたところif(!(〜略の方はおっけだったみたいです
-d !"存在する(略"はやっぱりだめぽでした
if(!"もうだめぽ" eq ""){print "ほんとにだめじゃん";}
とかやってみると"ほんとにだめじゃん"と出力されたり…
なんで空文字列?
ちなみに略部分は同じではないです、ありがとうございました
>>939
現れないに一票
0943929
02/11/19 00:04ID:???hyogo,ibaraki,ishikawa,iwate,kagawa,kagoshima,kanagawa,kouchi,kumamoto,kyoto,
mie,miyagi,miyazaki,nagano,nagasaki,nara,niigata,okayama,okinawa,osaka,saga,saitama,
shiga,shimane,shizuoka,tochigi,tokushima,tokyo,tottori,toyama,wakayama,yamagata,
yamaguchi,yamanashi
全国都道府県を落とす時のwget式で利用してください。
0944929
02/11/19 00:07ID:???0945nobodyさん
02/11/19 00:12ID:???0946nobodyさん
02/11/19 00:24ID:???CSVデータに , がふくまれてなさそうなので簡易に以下のようなものでできるんじゃ?
$key= 'ビオトープ';
open(IN, "hokkaido.csv");
while (<IN>){
$n= $1=~ tr/,// if !$n && /^(.*)[^,]*\Q$key\E/o;
print if /^(?:[^,]*,){$n}●/;
}
close(IN);
0947nobodyさん
02/11/19 00:33ID:???perl -i.bak -pe 's/(\n|<br>)//sgi'でもやっておいた方がよさげ。
少なくとも、北海道のを見る限り。
それからは、高知以外のCSVくっつけて、
perl -F, -nae '$a++if$F[4]eq q|●|;END{print$a}'
てな感じでどうかな。
4は自然観察会、9がビオトープ。
その後、高知の数字を数えて足す。
泥臭いけどね。
0948947
02/11/19 00:34ID:???↑これをやったあとでCSVにするってこと
0949947
02/11/19 01:08ID:???var fs = new ActiveXObject("Scripting.FileSystemObject");
var xl = new ActiveXObject("Excel.Application");
xl.DisplayAlerts = false;
for (var i = 0; i < array.length; ++i) {
var filename = fs.GetAbsolutePathName(array[i]+".html");
var savefile = fs.GetAbsolutePathName(array[i]+".csv");
var wbook = xl.Workbooks.Open(filename);
wbook.SaveAs(savefile, 6);
wbook.Close();
}
xl.Quit();
こうやってもCSV変換はできるな。(Excel2000)
つーか自分が勉強になった。
0950nobodyさん
02/11/19 01:30ID:???>if(-d !"存在するディレクトリ"){〜〜〜}
これがOK? マジで?
>>942
>if(!"もうだめぽ" eq ""){print "ほんとにだめじゃん";}
>とかやってみると"ほんとにだめじゃん"と出力されたり…
!"もうだめぽ" … 偽
"" … 空文字列は偽
なので全然不思議じゃない。
0951930
02/11/19 01:36ID:???えと、なんか分かるような分からないようななんですけど、
eqとかって真偽を比較するのですか? 文字列を比較した結果、値を返すものだと思ってたのですが…
0952nobodyさん
02/11/19 02:21ID:???0953nobodyさん
02/11/19 04:52ID:???unless("もうだめぽ" eq ""){print "ほんとにだめじゃん";}
0955nobodyさん
02/11/19 11:39ID:???0957てすと
02/11/19 18:00ID:a4uQLCBL外部Webサーバーのデータを読込みたいのですが、
$data = "http://......txt"
ではもちろんダメですよね…
どうすれば取得する事がでるんでしょうか?
もしわかる方がおりましたらお願いしますm(_ _;)m
0960nobodyさん
02/11/19 20:45ID:???相互リンク・・・・
0962nobodyさん
02/11/19 23:17ID:???0963nobodyさん
02/11/19 23:20ID:7H8zCiDSショッピングカートで注文確認メールを出しているのですが、
違う注文確認メールが届きました。
たとえば注文番号100番の人に100番の確認メールが届き(正常)
数時間後その人に98番の確認メールも届いた(異常)ってことなんです。
注文の終了時に行われるスクリプトの概要は
ユーザーがフォームに入力したメールアドレスを取得(cgi-lib.pl)
自分宛に注文メール送信
ユーザー宛に注文確認メール送信
ログに注文データ保存
送信しましたメッセージ表示
exit;
という具合なのですが、このプロセスで前の注文データが流れるって事は
あり得るのでしょうか?
ちなみにメール送信はそのままsendmailに渡しています。
よろしくお願いいたします。
0965963
02/11/20 00:56ID:???注文通りのデータのならびで前後したりはしてません。
1年以上同じ方法で今回初めてなりました。
0966nobodyさん
02/11/20 11:54ID:???分からないという状況でないと面白くも何ともない
0967nobodyさん
02/11/20 12:22ID:???0968nobodyさん
02/11/20 15:41ID:???open OUT, "hoge.txt";
print OUT "$hogehoge";
print "$hogehoge";
close OUT;
という何の変哲もない文が、設置場所によっては「画面に出力できるのに
ファイルに出力できない」という事態に悩まされています。このような状況が
発生するのは、この文が実行位置の後ろの方にあるときです。全く同じ物を
実行位置の先頭の方に置くと画面にもファイルにも出力できます。
この問題の対処法を教えて下さい。
0969nobodyさん
02/11/20 15:45ID:???読み込み専用で開いてよくファイルに出力できるね。
Content-type の位置じゃないの?
後ろの方とか言われても第三者にはさっぱりですが。
0970nobodyさん
02/11/20 16:00ID:???失敗、つまらんミスしてた…
open OUT,">>hoge.txt";
と読み替えて下さい。
で、「後ろの方」ってのは「1つのファイルを読み込んで、あれこれ操作をして、
最後に書き出す」という処理の後ろ、つまり最後の「書き出す」部分です。
これを「あれこれ操作をする」前に置くときちんと動作するのです。
あと、これはローカル環境で起きている問題なので、Content-typeは
たぶん関係ないと思います。
0971nobodyさん
02/11/20 16:08ID:???seek FP, 0, 0;
で先頭に戻さないと。
0973nobodyさん
02/11/20 16:24ID:???ファイルポインタを先頭に戻すと追記の意味がなくなってしまうんじゃないでしょうか…
と思いつつ試してみましたが、無理でした。
>972
それじゃあ、ちょっと長くなりますが。yomikomi.txtを処理して結果をhoge.txtに書き出します。
open FILE, "yomikomi.txt";
@line = <FILE>;
close FILE;
#1
foreach(@line){
処理あれこれ
}
#2
#1の場所に
open OUT, ">>hoge.txt";
print OUT "$hogehoge";
print "$hogehoge";
close OUT;
を入れると正常に動作しますが、#2に入れると動作しません(画面には出力される)。
これでご理解頂けますか?
0974nobodyさん
02/11/20 16:32ID:???0975nobodyさん
02/11/20 16:38ID:???「ちゃんと意味のある変数」として読み変えていただければ。
わかりにくければ$line[0]とでも。実際に$hogehogeを$line[0]に
変えても症状は変わりませんし。
0976nobodyさん
02/11/20 16:45ID:???「画面には出力される」てのは、foreachの中でprintかなんか
入れちゃってる。
に1票
レス数が950を超えています。1000を超えると書き込みができなくなります。