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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/22 01:41ID:???
Perlのコーディングで困ってる人のスレです。
誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。

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

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

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

過去ログやお勧めサイトは >>2-10
057756504/09/20 03:24:21ID:WP+I8Woy
>>575,576
勘違いしていたようです。汗
indexは文字列検索に使う関数だと思っていたのですが、文字列の位置を返す関数なのですね。
CGIの本に書かれていたサンプルソースがパターンマッチっぽい例だったので、文字列検索向けの関数かと思っていました。
ifは数値が 「0」 か 「空」 の場合には偽、それ以外の場合には真なんですよね。
負の値も偽と判断されると思い込んでいました。
>>567さんのやり方で確実に動作する事を確認しました。
結構、適当にPearlを勉強していたのですが、もっと真面目にやろうと思います。汗
有り難う御座いました。
0578nobodyさん04/09/20 03:59:55ID:???
>>577
Perlね
0579nobodyさん04/09/20 04:16:07ID:???
久しぶりに見たな。
0580nobodyさん04/09/20 06:08:04ID:???
実際にはPearlと名づけたかったんだが、すでにあったからPerlに無理にしたから
そお遠いわけでもないがな。
0581nobodyさん04/09/20 09:22:55ID:???
ばかだな
0582nobodyさん04/09/20 10:17:23ID:???
>577
まあ、ガンガレ
0583nobodyさん04/09/20 18:56:55ID:???
下のcgiを実行すると
3
と表示されました。どうなっているんでしょうか?



print "Content-type:text/html\n\n";

@_ = ("あ<>か","い<>き","う<>く");
@value = split(<>, @_);
print $value[0],<br>;
print $value[1],<br>;
print $value[2],<br>;
print $value[3],<br>;
print $value[4],<br>;
print $value[5],<br>;
print $value[6],<br>;
print $value[7],<br>;
0584nobodyさん04/09/20 19:01:04ID:???
splitの第2引数にリストは使えんのだが
0585nobodyさん04/09/20 19:13:51ID:???
push @value, split(/<>/, $_) foreach (@array);
0586nobodyさん04/09/20 19:24:26ID:???
>>583
それはまともに動くのか?
0587nobodyさん04/09/20 19:26:10ID:???
push @value, split /<>/ for @_;
0588583御破算04/09/20 20:29:46ID:???
>584
え、そうなんですか(;_;)
>586
404は出ませんでした。httpdとinfoseekで確認しました。

>585>587
ありがとうございます。今携帯から見ているので、後で試してみます。
0589nobodyさん04/09/20 20:40:58ID:???
>>588
404・・・?
0590nobodyさん04/09/20 20:47:03ID:???
共用サーバでCGIの実験するな。師ね。
0591nobodyさん04/09/20 21:15:09ID:???
@_には3個入ってるんだから、
@value = split(<>, '3');
と同じ
0592nobodyさん04/09/20 21:27:36ID:???
これくらいローカルでやってくれよ。
059358304/09/20 22:31:17ID:???
>589
403でしたorz
>590
httpdがバグった、と思ったので…httpdで試してsyntax errorが出ず、永久ループでなくてもダメですか?
>591
ありがとうございます。それも調べてみます
>592
ローカルとはmyのことですか?だとしたらどこをローカル化すればいいんですか?
0594nobodyさん04/09/20 22:39:12ID:???
                             |
                             |
      ∩___∩             |
      | ノ  _,  ,_ ヽ        ((  | プラプラ
     /  ●   ● |         (=)
     |    ( _●_)  ミ _ (⌒)   J  ))
    彡、   |∪|  ノ
⊂⌒ヽ /    ヽノ  ヽ /⌒つ
  \ ヽ  /         ヽ /
   \_,,ノ      |、_ノ
0595nobodyさん04/09/20 22:52:17ID:???
>>593
ttp://support.microsoft.com/default.aspx?scid=kb;ja;879066

httpdがバグったって・・・。
何故プログラムを先に疑わないんだ。
0596nobodyさん04/09/20 22:52:25ID:???
2重の釣りか
0597nobodyさん04/09/20 22:56:31ID:???
print "Content-type:text/html\n\n";

@_ = ("あ<>か","い<>き","う<>く");

foreach(@_){
$baka .= $_;
}

@value = split(<>, $baka);
print $value[0],<br>;
print $value[1],<br>;
print $value[2],<br>;
print $value[3],<br>;
print $value[4],<br>;
print $value[5],<br>;
print $value[6],<br>;
print $value[7],<br>;
0598nobodyさん04/09/20 23:04:00ID:???
>>597
君アホでしょ
せめて確認してから貼れよw
0599nobodyさん04/09/20 23:20:32ID:???
@_ = ("あ<>か","い<>き","う<>く");
print "Content-type:text/html\n\n";
print $_."<br>",for split /<>/ ,join("<>",@_);
0600nobodyさん04/09/20 23:27:37ID:???
join関数を知らなかった俺はバカです
0601nobodyさん04/09/20 23:28:38ID:???
joinとか以前に動かないから
0602nobodyさん04/09/20 23:29:06ID:???
>>583のスクリプトを*そのまま* aa.plという名前で保存する。
echo hage| perl aa.plすると、確かに3と出力される。
何が起こっているか誰か解説してくれ。
0603nobodyさん04/09/20 23:31:26ID:???
>>602
>>591
0604nobodyさん04/09/20 23:34:53ID:???
>>602
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
060560204/09/20 23:42:47ID:???
>>603-604
�dクス
060658304/09/20 23:55:49ID:???
>593
よく強制終了するので…クロック数300�rヘルツ鯖(´・ω・`)
>599
join関数なんてあったんですね。知りませんでした
>591
>603で気付いた、前スレ誤解スマソ
>604
そういうことだったのか…
0607nobodyさん04/09/21 02:08:45ID:???
>>606
use strict;するともっともっと気付く。
0608nobodyさん04/09/21 21:16:47ID:UQFv84yK
レンタル鯖で、セション管理のモジュールがインスコされてない&インスコ禁止なので、
ナイスなライブラリがないでしょうか・・・
もう自分で書くしか?
0609nobodyさん04/09/21 22:11:41ID:???
>>608
CGI::Session::AuthはPurePerlじゃなかったか?
0610nobodyさん04/09/21 22:12:03ID:???
失礼。CGI::Session::AuthじゃなくてCGI::Sessionだ。
0611nobodyさん04/09/21 22:56:33ID:???
ディレクトリのフォルダとかファイルとか
判別したり、容量、日時を読み出しているのですが
どこかにそういう関数とか解説されたHPないですか

>>1あたりのリンクにはなかったです
0612nobodyさん04/09/21 22:58:24ID:???
>>611
>>14
0613nobodyさん04/09/21 23:24:42ID:VDADrx76
Perlでのメール送信プログラムについて、質問です。

ヘッダを作成し、その内容にそってメールを送信するようにしているのですが、
特定の環境下で文字化けが発生してしまうようです。
ヘッダに
Content-Type: text/plain; charset="ISO-2022-JP"
と追加しているのですが、コレだけではダメなのでしょうか?

もう一点、質問なのですが、Beckyなどのメーラーから送信するとヘッダに
Content-Transfer-Encoding: 7bit
が付属されていますが、この内容も文字化けに関係しているのでしょうか?

質問内容が、Perlとちょっと離れているかもしれませんが・・・
よろしくお願いします。
0614nobodyさん04/09/21 23:32:10ID:???
>>613
ちょっとどころではありませんのでRFCを舐めるようにして読んでみましょう。
061560804/09/21 23:38:12ID:UQFv84yK
>>609さん
PurePerlだと、PPMとか使ってインストールしなくても、
任意の場所にモジュールファイルを置いて、requireすればOKなんでしょうか?
0616nobodyさん04/09/21 23:44:41ID:???
requireって…
0617nobodyさん04/09/21 23:59:06ID:VDADrx76
>>614
スイマセン、RFCって何でしょうか・・・・
このような質問は、そちらですれば良いと言う事ですか?
0618nobodyさん04/09/22 00:09:08ID:???
わからない言葉があったらまずは何をすべきか
0619nobodyさん04/09/22 01:11:45ID:???
人に聞く
0620nobodyさん04/09/22 01:20:10ID:???
>>613
文字コードとか
文字コードとか
文字コード勉強した方がいいよ
0621nobodyさん04/09/22 10:52:47ID:???
スイマセン、RFC板が見つかりませんm(_ _)m
0622nobodyさん04/09/22 11:54:45ID:???
>>621
http://www.google.co.jp/search?q=RFC&hl=ja&lr=lang_ja
http://pc5.2ch.net/test/read.cgi/php/1095633323/
0623nobodyさん04/09/22 15:34:38ID:???
ググってみたんですが良く分かりません。

Perlを使用してDBアクセスを行いたいのですが、
開発環境はどのように作成したら宜しいのでしょうか?

インタプリタ等、必要ですよね・・・
0624nobodyさん04/09/22 15:56:04ID:???
PerlインストールしてDBインストールすればいいが。
0625nobodyさん04/09/22 16:07:28ID:???
>>624
環境構築は特に必要ないのでしょうか?

何も入っていないPCに
PerlインスコしてOracleインスコして

それから、FTPでCgiをUpすれば良いということでしょうか?
0626nobodyさん04/09/22 16:55:21ID:???
>>625
あとDBドライバな。
0627nobodyさん04/09/22 16:58:49ID:???
>>626
CgiってTxtで書けるんですか?
0628nobodyさん04/09/22 17:03:07ID:???
プログラムが設置されているディレクトリ名を取得することは可能でしょうか?
例えば、http://hoge.com/xxx/test.cgiのtest.cgiにアクセスした時に、
ディレクトリ名のxxxを変数として取得したいのですが。
よろしくお願いいたします。
0629nobodyさん04/09/22 17:15:23ID:???
>>627
どうやらキミには無理なようだ・・・

>>628
$0からディレクトリを切り出したら?
0630nobodyさん04/09/22 17:36:12ID:???
>>629
おぉ!$0ってのはなんだか使えそうですね。
試行錯誤してみます。
ありがとうございました。
0631nobodyさん04/09/22 17:46:12ID:???
$0ではファイル名しか取得できないようでした。
んー、難しい。
0632nobodyさん04/09/22 17:55:43ID:???
>>631
あれ!?そうだっけ、すまん。
んじゃ
$ENV{'SCRIPT_FILENAME'}, $ENV{'SCRIPT_NAME'}, $ENV{'REQUEST_URI'}
でどお?
0633nobodyさん04/09/22 17:59:01ID:???
>>632
マジサンクスです!
勉強になりました!
0634nobodyさん04/09/22 18:35:24ID:???
>>629
そんなぁ・・・
0635nobodyさん04/09/22 19:23:37ID:???
"ググったら"山ほど出てくると思うんだが
0636nobodyさん04/09/22 21:15:51ID:???
何もわからん奴は本買えよ
0637nobodyさん04/09/23 00:56:30ID:???
>>634
まず、CGIとPerlの違いを理解してから出直して来い。
0638nobodyさん04/09/23 12:05:23ID:???
exit関数の質問です。exit; exit(); exit(0); などいろんな書き方を見かけるんですが、意味は違うんでしょうか?
0639nobodyさん04/09/23 12:07:07ID:???
まぁプログラムの基本としてexit(1);は異常終了を示す物だと覚えていて欲しい
0640nobodyさん04/09/23 13:49:58ID:+nr7omoU
デコードについて質問です。

URIエンコードされてる文字列を元に戻すコードは

$buffer =~ s/%([a-zA-Z0-9][a-zA-Z0-9])/pack "H2",$1/eg;

$buffer =~ s/%([a-zA-Z0-9][a-zA-Z0-9])/pack "C",hex($1)/eg;

この二つのどちらでもデコードできますが、どちらがおすすめですか?
前者の方が処理は速いです。でもだいたいの入門サイトには後者のコードが載ってます。
そこらへんで悩んでます。みなさんあどちらを使ってますか?
0641nobodyさん04/09/23 13:51:55ID:???
>>640
どっちでもいい
0642nobodyさん04/09/23 13:52:47ID:+nr7omoU
>>641
どうしてそういうこと言うんですか!?
0643nobodyさん04/09/23 13:55:41ID:???
>>642
どっちでもいいからそういうこと言う
0644nobodyさん04/09/23 14:06:57ID:+nr7omoU
>>643
そんなっ・・・・・

Cでやるのは明らかにに非効率で、処理時間も倍かかるのに何故かCの方がスタンダードな
理由をあたしと話してみてもいいじゃないですかっ!

もういいもん。あたし帰るからねっ!
0645nobodyさん04/09/23 14:20:34ID:???
>>644
帰って吊るしたロープに首を通せばいい
0646nobodyさん04/09/23 14:30:55ID:+nr7omoU
>>645
何よあんたっ!?すっごいむかつくっ!信じらんない!
もうやめて!あなたここにこないで!絶対にこないでよ。
0647nobodyさん04/09/23 14:49:03ID:???
さっさと帰れ
0648nobodyさん04/09/23 14:50:28ID:qhT0f5z2
my で複数の変数を一気に初期化したい場合はどうすればいいのでしょうか?
my ($a=1,$b=2); だとエラーになります
定義したあとに一つ一つ代入していくしかないのでしょうか?
0649nobodyさん04/09/23 14:52:57ID:+nr7omoU
>>648
my ($a,$b) = (1,2);
0650nobodyさん04/09/23 14:56:18ID:???
my $a = 1,$b = 2;
0651nobodyさん04/09/23 15:01:42ID:???
すみません。

my @a = qw/ a b c/;
my @b = qw/ a b c d/;

二つの配列があって、@bには@aの持ってない値を持つことを禁じたいのです。
なので@aにない値なら削除したいのですが、どうかけばよろしいですか?

for ( 0..$#b)
とかやるとブロック内で@bの要素を減らすと問題がありますよね・・・おねがいします。

あ、あと追加で済みませんが、
my $a = [qw/1 2 3 4/];
のような場合のラストインデクスの求め方は
@$#a
でうまくいかないのですが、どうかくのですか?
0652nobodyさん04/09/23 15:04:18ID:???
>>640
$buffer =~ s/%([a-f0-9][a-f0-9])/chr(hex($1))/ieg;
0653nobodyさん04/09/23 15:09:17ID:???
>>651
ttp://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique
065465104/09/23 15:13:10ID:???
>>653
・・・どう応用すればいいんでしょうか?
0655nobodyさん04/09/23 15:28:26ID:+nr7omoU
>>651
my @c;
foreach my $value (@b){
if ( map /$value/, @a ) { push @c,$value }
}

これで@cの中には@aにあるものしか入らないよ。>>653はむかつくやつだから
無視した方がいいよっ!だって私回答したんだから、それくらい言う権利あるわよね!
0656nobodyさん04/09/23 15:30:20ID:???
>>651
前半:
my %a;
map $a{$_}++, @a;
@b = grep !$a{$_}, @b;

後半:
$#$a
0657nobodyさん04/09/23 15:33:08ID:+nr7omoU
>>656
何あんたっ!もう私が答えてるのよ!失礼なことしないでよっ!バカじゃないの!
065865104/09/23 15:41:12ID:???
>>656
そういうことでしたか;勉強不足ですみません。ありがとうございました。
0659nobodyさん04/09/23 15:56:18ID:???
釣り師としては3流
066065104/09/23 16:04:15ID:+nr7omoU
思いっきりつれてるけどなw
0661nobodyさん04/09/23 16:56:25ID:???
$varに$num=123、$cha="abc"をくっつけて$var123="abc"を作りたいんですが、どうすればいいですか?
0662nobodyさん04/09/23 17:00:48ID:???
>>661
ハッシュ使えばいいじゃん
0663nobodyさん04/09/23 17:06:44ID:EIIt3BOR
GD::Graphについて質問です。
簡易的なサンプルのグラフが出力でき、目的の棒グラフを作ろうと
思って、棒グラフと、点ぐらふで、左軸と右軸にそれぞれ違った
数値を持たせようと思い、オプションのセットの部分で、

$graph->set(
(略)
two_axes => true,
y1_max_value =>100,
y1_min_value =>0,
y2_max_value =>50,
y2_min_value =>0
);

と表してみたのですが、左の軸しか出力されません。
true_axesの値がtrueの時と言うことは、書いてあったので、
そこがおかしいのかと思い、two_axes => "true",としてみたり
two_axes => 1,としてみたり、色々試してみたのですが、
だめでした。どのようにしたら、左右別々の軸の値を出すことが
できるでしょうか?ご教授お願いいたします。
0664nobodyさん04/09/23 18:28:51ID:???
$a = "abcdeFGRYEHDU-sss-";

もしも$aの値の中にa-zA-Zとハイフン(-)以外を含んでたら処理発動ていうのがしたいんですが、

$a =~ /[a-zA-Z\-]/;
としてもうまくいきません。ハイフンをエスケープできてないのでしょうか?
0665nobodyさん04/09/23 18:48:23ID:???
if ($a =~ /[^a-zA-Z\-]/){
処理
}
0666nobodyさん04/09/23 19:43:29ID:???
[^A-Za-z-]
066766404/09/23 20:46:29ID:???
>>665-666
すみません。そこ書き間違えてました。
[^a-zA-Z\-]としてます。

my $a = "abcdeFGRYEHDU-sss-";
print "ok" if $a =~ /[^a-zA-Z\-]/;

これだと普通にうまくいくようなので、どうやら初めから他の部分のコーディングにミスがあったんだと思います。
すみません。
0668nobodyさん04/09/23 21:16:21ID:???
フォームからsubmitしたCGIの中で、
CGI::Liteのparse_cookiesを呼ぶと、
なぜかフォームの内容までが取得されてきてしまったり、
逆にparse_form_dataでクッキーの内容まで取得されたり、ということが起きています。

parse_cookiesは、parse_form_dataとほとんど同じ動きをする、
というのをどこかで見ましたが、同じ内容が取得されるということなのでしょうか?
0669nobodyさん04/09/24 00:20:24ID:???
$a $b $c $d $eの中で一番大きな数字を$xに格納したいのですが
いちいちif文で$a>=$b && ...... とやる以外に方法はありますか?
0670nobodyさん04/09/24 00:36:03ID:???
>>669
map { $x = $_ if($_ > $x);} ($a,$b,$c,$d,$e);
067166904/09/24 00:49:04ID:???
>>670
ありがとうございます。
0672nobodyさん04/09/24 01:07:35ID:AJG/3HYE
あるCGIをダウンロードしたのですが
Editorでいじろうかと思ったのですが
文字が文字化けして何を書いてあるのかわからないのですが
この文字化けを解決する方法ないでしょうか?
0673nobodyさん04/09/24 01:23:51ID:???
TeraPadでも使ってろ
0674nobodyさん04/09/24 01:26:51ID:QHIu4qbQ
連番の key を持つ連想配列の中から、先頭か最後の key の data を取り出したいのですが
なにか手軽な方法はないでしょうか?
キーは不定なので直接指定することはできません

今は↓のようにいったん key を配列にしてからソートして目的の key を
指定してるんですが他に何かいい方法はないでしょうか?
my @tmp = sort keys(%abc);
my $data1 = $abc{$tmp[0]};
my $data2 = $abc{$tmp[$#tmp]};
0675nobodyさん04/09/24 02:22:53ID:???
>>674
ハッシュのキーには順番はないんだからそれでもしょうがないんじゃない?

ところで連番って、キーは数字なのか?
もしそうならそれだと最後は得られないけど。
sortだけだとキーが1〜10としたら 1 10 2 3 4 ・・・になってしまう。
@tmp = sort { $a <=> $b } keys(%abc); にしないと。
0676nobodyさん04/09/24 10:09:11ID:???
>>674
sortを1回やるのとmax,minをそれぞれ求めるのはどっちが得だろうか
■ このスレッドは過去ログ倉庫に格納されています