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

【Perl】初心者コーナー Part17

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001 ◆Go4ZKngPGE 02/10/14 17:24ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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あたりを見よう。
0855nobodyさん02/11/16 19:34ID:LuG489Vk
>>851
グルって。

>>853
意味不明。説明が足りない。

>>854
君はどういう理由が考えられるか考えたのか?
0856nobodyさん02/11/16 19:38ID:???
>854
君の脳に問題がある。<理由
もしくは君の言語能力に問題が。
085785402/11/16 19:41ID:y1C/hDJG
CGIプログラムで読みこむdatファイルのパスを固定されているパス名に
かえたらオッケーだったんですけど、変数とかパスの中に使うとダメなんすか?
チョー初心者ですいませんがお願いします。
0858nobodyさん02/11/16 20:01ID:???
>>857
平気
0859nobodyさん02/11/16 20:18ID:meodONVA
質問なのですが、エースの日記を設置したのですが、
「書き込む」をクリックすると

CGIWrap Error: Execution of this script not permitted

Execution of (diaryh/diaryh.cgi) is not permitted for the following reason:
Script is not executable. Issue 'chmod 755 filename'

というエラー表示がでてしまいます。
エースにはサポート掲示板がないので、大変困っています。
お手数ですが、どうぞよろしくお願いします。
0860nobodyさん02/11/16 20:28ID:???
>>859
diaryh.cgiのパーミッションが間違っているだけじゃん?
Perlとは関係ないだろ。
0861nobodyさん02/11/16 20:44ID:IpoPd8nu
CGIの勉強をしたいと思うのですがサーバーがないと厳しいですよね。
やっぱりお金をはらってレンタルサーバーかりないと練習にならない
のでしょうか?
0862nobodyさん02/11/16 20:56ID:???
レンタルサーバで練習するのかよ…
0863nobodyさん02/11/16 21:01ID:???
>>861
勉強するならまずローカル環境を用意しる!
ActivePerlとApacheをインスコすればオフラインでCGIテストできて(゚д゚)ウマー
レンタルサーバーで練習するのは他のユーザーの迷惑になるので止めよう。
0864nobodyさん02/11/16 21:53ID:???
まずはエラーメッセージをきちんと読むことから始めたら?
それともずっとエラーメッセージをこのスレにコピペするの?
0865デフォルトの名無しさん02/11/16 22:30ID:???
久しぶりにこのスレ来たら、CGIスレに間違って来ちゃったのかと…
0866nobodyさん02/11/16 22:36ID:li3X+/+9
教えて君でスマソ

たとえば $file の中身が userid.dat という文字列で
ここから userid を得たいので

$file =~ s/\.dat$//;

とかやれば、userid を得られると思うが、元の文字列をファイル名としても使いたいので
いつも

$file =~ s/\.dat$//;
$id = $file;
$file .= ".dat";

とやったり

$file =~ /(.*)(\.dat$)/;
$id = $1;

のようにしていますが、これを1行で書きたい。
0867nobodyさん02/11/16 22:49ID:???
>>866
($id = $file) =~ s/\.dat$//;
0868nobodyさん02/11/16 22:52ID:li3X+/+9
>>867
うぉぉォォ、、鬱くしい。
さんくす。
0869nobodyさん02/11/17 00:04ID:rKD6R3WV
2ちゃんねる風の掲示板はどの様に作ればいいのですか?
教えて下さい。あと、素材があったら貼っといて下さい。
0870nobodyさん02/11/17 00:15ID:???
>>866
($id)= $file=~ /([^\.]+)/;
こうやったほうが速いべ?
0871nobodyさん02/11/17 00:58ID:???
>>869
スレ違い。
つうかさ、「貼っといて下さい」って、人にモノを頼む態度か?
0872rubyist@カラアゲうまうま02/11/17 01:11ID:???
厨房でも偉そうな顔ができる
それがPerlスレ
0873nobodyさん02/11/17 01:13ID:???
>>869
2ちゃんねる風に作ればいいです。
0874nobodyさん02/11/17 01:37ID:???
>>869
つりぼりかい。
0875nobodyさん02/11/17 01:41ID:???
今ごろ必死でPerl覚る奴は時代の流れがよめない奴。
あほだね〜♪ あほだねえ〜♪ Perl厨がPHP本買ってる〜♪。
087684302/11/17 01:46ID:???
>>846,848,849
相談に乗って頂き、ありがとうございます。
確認ということですが、$hogeを生成する方のスクリプトは以前動作確認済みだった為、
以下のような今回追加したい部分だけを抽出した
テスト用のスクリプトを作成し、生成される$hogeには
適当な数値をあらかじめ代入してテストしていたのです。

&decode;
$hoge="001";
$cou=$form{"$hoge"};
print "Content-type: text/html\n\n";
print "<html><head>";
print "<META HTTP-EQUIV=Content-type CONTENT=text/html; charset=euc-jp>";
print "<title>test</title>";
print "<body>";
for($i=0; $i<$cou+1; $i++){print "$hoge";}
print "<form action=sample.cgi method=post>";
print "<input type=text size=4 name=$hoge><input type=submit value=送信>";
print "</form></body></html>";
sub decode{省略}

これを実行した結果、name=001の属性を持つ
テキストボックスを表示するところまでは上手く行きましたが、
送信ボタンを押した後に入力した数の分だけ表示される筈の『001』が表示されないのです。

そもそも、値を最初から代入してテストするという思考自体が間違っていたのでしょうか。
(849さんのご指摘の『勘違い』が正しいのかも・・・)
至らない初心者で本当に申し訳ありませんが、
何とぞもう少しご教授いただけませんか。よろしくお願いします。
0877nobodyさん02/11/17 02:09ID:???
<input>valueはいいのか?
0878nobodyさん02/11/17 03:42ID:???
>>876
それでできたけど・・?($i = 1ね)
0879nobodyさん02/11/17 04:24ID:???
>>875
まさか君Perlを webで使うことしか考えてないのか?
ちょっとしたSystem管理みたいなことやらせるのに
PHPとかは向いてないでしょ (w
0880nobodyさん02/11/17 04:34ID:???
ぷっPerl厨房必死だな。
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perl
0881nobodyさん02/11/17 05:35ID:???
とりあえずRuby厨はこんなカキコするよりもCPAN全部移植汁!
0882nobodyさん02/11/17 08:12ID:???
Perl向きの(・∀・)イイ!エディタありませんか?
PerlEditorとかなんか挙動不審なんですけど…
(・∀・)イイ!エディタに乗り換えたいよ…
0883nobodyさん02/11/17 12:27ID:???
>>879
追いつめられた羊のような事を書かないで欲しいです。
PerlはWEB使うことが主流です。
そんな使い方をする人なんて極々わずかです。いや今は他の言語を使います。
あなたはWEBはPHPを使ってるんですか?Perlでしょ?
だったらもっとPerlを応援してください。
Perl最高! Perl最高! Perl最高! 
0884nobodyさん02/11/17 12:39ID:???
>>882
素直にEmacsを使え。
0885nobodyさん02/11/17 12:46ID:???
>>882
素直にHIDEMARUを使え。
0886nobodyさん02/11/17 14:00ID:???
フォルツァ(゚д゚)HIDEMARUってアニメが昔あったな
0887nobodyさん02/11/17 16:44ID:eZnGzPxh
たとえば同じフォルダ内にあるHTMLファイルの中に<SET1>〜<SET9>とか独自のタグを入れておいて、それを読み込んでそのタグの直後に文字を代入するにはどうしたらいいですか?
0888nobodyさん02/11/17 16:48ID:???
>そんな使い方をする人なんて極々わずかです。いや今は他の言語を使います。
自分周辺の狭い世界だけで語るなボケ
0889nobodyさん02/11/17 16:51ID:???
Perlhaksuoういv!
0890nobodyさん02/11/17 16:54ID:???
>>887
whileで回せ
089188702/11/17 16:55ID:eZnGzPxh
こんなかんじ?
while (<DATA>){
if (/set|SET/){
print "$line : $_<br>";}
$line++;
}
0892nobodyさん02/11/17 17:12ID:???
>>891
while (<DATA>){
if (/set|SET/){
print "$line : $_<br>";}
$line++;
print;
}
089388702/11/17 17:12ID:eZnGzPxh
追記。
さっきのHTMLの中に埋め込むタグは<SET1></SET1>と対にさせて、その中身を取り出すってかんじです
0894nobodyさん02/11/17 17:26ID:???
>タグの直後に文字を代入するには
>中身を取り出す

いったいどっちがやりたいの?
089588702/11/17 17:36ID:eZnGzPxh
>>894
スマソ
まず、HTML内の<SET1>この文字を取り込む</SET1>から対象文字「この文字を取り込む」をを読み込む。
その後、「この文字を読み込む」を消し、別の文字列を代入
こんなかんじです。どうぞおながいします
0896nobodyさん02/11/17 21:00ID:JxVm/eIS
キーボードから配列$hoge[$i]にEOFが代入された時にループを抜けたいのですが、
文字列の最後に改行コードが入ってる為か抜けられません。
chopで改行コードを取り除かずにEOF(改行)のまま認識させるためにはどうしたら良いでしょうか?
0897nobodyさん02/11/17 22:33ID:???
>>851
頭に書いてあるではないか。
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は削った残りを返り値として欲しい
場合などに使う。
0898nobodyさん02/11/17 22:52ID:???
>>897
HTML::Templateじゃ、895の要件満たしてねーだろ。
偉そうに一般論ぶってるだけのperl厨シネヨ。
0899test ◆wSaCDPDEl2 02/11/17 23:08ID:???
YYBBSにトリップ昨日をつけたいのですが・・・
挫折。
わかる方宜しくおねがいします
0900nobodyさん02/11/17 23:11ID:???
>>898
HTMLでは、独自に定義したタグを使うことはできない。
そのため、「完成品」からは、独自タグが消えていなければならない。
HTML::Templateでは、独自タグを残せないので>>895の用件を満たせないと指摘したい
のだと思われるが、もしそうなら用件がおかしい。
しかしながら、>>887を見ると独自タグ自体に意味はないものと考えられるため、上の
ような回答を行った。
0901nobodyさん02/11/17 23:16ID:???
>899
どんな風に挑戦したかソース出してみ。
俺は意地悪だからアドバイスをする気はあっても、答えをそのまま載せる気はなくてね。
0902nobodyさん02/11/17 23:16ID:???
>>899
とりあえずこちらのスレへどうぞ

【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
090388302/11/17 23:56ID:???
>>884
Lisp分からないでつ
Meadowは入れたけど

>>884
フサギコはお金無いから
0904test ◆wSaCDPDEl2 02/11/18 00:05ID:???
>>902
Thank You
090589602/11/18 00:12ID:JyAtIJIy
>>897
現在、Perlでキーボードから一行ずつ文字列を入力し、
その文字列を保存するスクリプトを組んでいるのですが、
文字列入力をするループから抜ける終了判定として文字列"EOF"が入力された時にしたいんです。
しかし、<STDIN>でキーボードから"EOF"と入力した場合、最後に改行コードが入ってしまって

while ($hoge[$i] ne "EOF")

だとEOF(改行)とEOFが一致しないんです。
改行コードを取り除けば可能ですが、それだと保存した際に一行になってしまいますよね?(多分
何か良い方法はありますでしょうか??
0906nobodyさん02/11/18 00:29ID:???
>>905
EOF(改行)と比較したらダメなのか?
090789602/11/18 00:34ID:JyAtIJIy
>>906
そのやりかたがわからないんです・・・
0908nobodyさん02/11/18 00:37ID:Lol6CcQn
ぶっちゃけPHPってなに?
PHP研究所?
0909nobodyさん02/11/18 00:44ID:???
>>905
これでどう?

while ($hoge[$i] !~ /^EOF$/)
0910nobodyさん02/11/18 00:47ID:???
>>907
結局なにがしたいの? 結局、キーボードから1行取得したいの?
0911rubyist@カラアゲうまうま02/11/18 00:47ID:???
書き出すときに改行付けとくだけでいいだろヴォケ
0912nobodyさん02/11/18 00:57ID:???
open(OUT, ">savefile");
print OUT substr(scalar(<STDIN>), 0, -1);
close(OUT);
091389602/11/18 01:12ID:JyAtIJIy
>>909
ぐぁ!?出来ました。ループ抜けられました。感動。
これは^以降から$の間の文字が一致すれば終了って意味かな。正規表現?
力不足でどのような処理か理解出来てませんけど、ありがとうございました。

>>910
キーボードから文字列EOFが入力されたときに、
EOFの後ろについてしまう改行コードを取り除くことなくEOFと比較したかったんです。

>>911
改行コードを取り除い、更に後からまた付け足すんですか?
まぁその方法もまだわからないんですが・・・。
0914nobodyさん02/11/18 14:52ID:???
スクリプトの中で配列って使いすぎるといけないんですか?
でも、例えば格納データとかが多いとどうしても
配列を多く使わないといけない場合とかありますよね。
配列が多すぎて動かないとかいう事あるんですか?
0915nobodyさん02/11/18 14:56ID:???
>>914
やってみりゃいいじゃん。やってみてエラーが出てから質問すること。
0916nobodyさん02/11/18 14:57ID:???
>915
「ただし、試すならローカルで」も付け加えといてね。
0917てすとさん02/11/18 15:22ID:I0IdwfDh
htmlでフォームを作成し、<input type="text" name="child">をaction="cgi-bin/***.cgi" method="post"で送ったのですが、
肝心のCGIで$FORM{'child'}を取り出そうとしても中身が空っぽになってしまいます。
どうしてでしょうか?
サーバーエラーが出るわけでもなく、フォームの中身が全て空なこと以外は正常動作します。
また、method="post"を削るとちゃんとデータが送信されていることがURLに出てきます。
フォームに書き込んだ情報をCGIで表示するだけなのに、てこずってしまっています…。
0918nobodyさん02/11/18 15:37ID:???
フォーム×デコード×連想配列
0919てすとさん02/11/18 15:57ID:I0IdwfDh
>>918
デコード忘れてた、鬱氏。
4時間くらいそれで詰まってた、マジで死にたい…
0920nobodyさん02/11/18 16:33ID:???
>>919
んじゃ死ねば?
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:ODy6L3pp
データベース使った時もパスワードは暗号化した方がいいのでしょうか。
0925nobodyさん02/11/18 20:03ID:???
>923
毎起動ごとにログの保存チェックをしろ。
0926nobodyさん02/11/18 20:54ID:19d2puZr
>>925
そのアルゴリズムがうまくいかなくて悩んでます

0927nobodyさん02/11/18 21:03ID:???
>>922
localtime(time)を使えば日付とか曜日が配列で返ってくるはず
あとは自分で勉強しや
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:???
>>930
if (!(-d "存在するディレクトリ") and 略) {

!(-d "存在するディレクトリ") もしくは not -d "存在するディレクトリ" で「存在しない」になるはずだけど。
0932nobodyさん02/11/18 23:09ID:???
つか自分で答え書いてるジャン
0933デフォルトの名無しさん02/11/18 23:10ID:???
>>930
>if(!(-d "存在するディレクトリ")){〜〜〜}
>if(-d !"存在するディレクトリ"){〜〜〜}
両方OKよ。
>unless(略){
>  if(略){〜〜}
>}
略の部分が同じなら常に真。
>if(!略 and 略){
これもそう。

0934デフォルトの名無しさん02/11/18 23:11ID:???
間違った。常に偽だ。
0935nobodyさん02/11/18 23:29ID:???
>>929
目視で十分じゃない? 3つしかないよ?
093684302/11/18 23:31ID:???
>>877,878
ありがとうございます。
まだこちらでは依然として動いてくれないのですが、
考え方自体は間違っていないのですね。
$i=1のところを$i=0にしてしまったようなケアレスミスが
こちらに残っているのだと思います。

もう少し自分で頑張ってみて、どうしてもできないようでしたら
また相談させていただきます。本当にありがとうございました。
0937935 02/11/18 23:37ID:???
全国です!!!

さらに「自然観察会」ってのも数えたいので、スクリプトの登場まってます!!
093892902/11/18 23:38ID:???
>>935
の間違いでした
0939nobodyさん02/11/18 23:41ID:???
そんな勇者が現れると思う?(´・ω・`)
0940nobodyさん02/11/18 23:45ID:???
>>929
で、あのへぼいスクリプトでCSVに変換できたの?
094192902/11/18 23:59ID:???
csv変換はバチーリでした。

スクリプトの登場まってます!!
094293002/11/19 00:02ID:???
>>931
あれれー(;;´Д`) とりあえずnotが見た目わかりやすいし、それでできたのでそれで行きます
ありがとうございますた

>>932
自分で最初やってみた時はだめだったんですよぅ

>>933
もっかい実験してみたところif(!(〜略の方はおっけだったみたいです
-d !"存在する(略"はやっぱりだめぽでした
if(!"もうだめぽ" eq ""){print "ほんとにだめじゃん";}
とかやってみると"ほんとにだめじゃん"と出力されたり…
なんで空文字列?
ちなみに略部分は同じではないです、ありがとうございました

>>939
現れないに一票
094392902/11/19 00:04ID:???
aichi,akita,aomori,chiba,ehime,fukui,gihu,gunma,hiroshima,hokkaido,hukuoka,hukushima,
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式で利用してください。
094492902/11/19 00:07ID:???
高知県はhtml作ったやつがアホで、「県別」とかいうフィールドがありますので注意してください。
0945nobodyさん02/11/19 00:12ID:???
人に頼るなヴォケが 自分でやれ むしろ金払ってやってもらうなりしろ
0946nobodyさん02/11/19 00:24ID:???
>>929
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:???
>>929
perl -i.bak -pe 's/(\n|<br>)//sgi'でもやっておいた方がよさげ。
少なくとも、北海道のを見る限り。
それからは、高知以外のCSVくっつけて、
perl -F, -nae '$a++if$F[4]eq q|●|;END{print$a}'
てな感じでどうかな。
4は自然観察会、9がビオトープ。
その後、高知の数字を数えて足す。
泥臭いけどね。
094894702/11/19 00:34ID:???
perl -i.bak -pe 's/(\n|<br>)//sgi' *.html
↑これをやったあとでCSVにするってこと
094994702/11/19 01:08ID:???
var array = new Array("aichi", ...);
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:???
>>933
>if(-d !"存在するディレクトリ"){〜〜〜}
これがOK? マジで?

>>942
>if(!"もうだめぽ" eq ""){print "ほんとにだめじゃん";}
>とかやってみると"ほんとにだめじゃん"と出力されたり…
!"もうだめぽ" … 偽
"" … 空文字列は偽
なので全然不思議じゃない。
095193002/11/19 01:36ID:???
>>950
えと、なんか分かるような分からないようななんですけど、
eqとかって真偽を比較するのですか? 文字列を比較した結果、値を返すものだと思ってたのですが…
0952nobodyさん02/11/19 02:21ID:???
(;´Д`)アァ・・
0953nobodyさん02/11/19 04:52ID:???
if(!("もうだめぽ" eq "")){print "ほんとにだめじゃん";}
unless("もうだめぽ" eq ""){print "ほんとにだめじゃん";}
095493302/11/19 08:32ID:???
>>950
>>if(-d !"存在するディレクトリ"){〜〜〜}
>これがOK? マジで?
ごみん、嘘言った。
レス数が950を超えています。1000を超えると書き込みができなくなります。