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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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をそれぞれ求めるのはどっちが得だろうか
0677nobodyさん04/09/24 11:12:13ID:???
sortはO(n log n)でmin,maxを求めるのはO(n)になるのかなあ
0678nobodyさん04/09/24 11:23:21ID:???
sortは最悪O(n^2)
0679nobodyさん04/09/24 11:32:22ID:???
nが十分大きくなればオーダーきいてくるので明らかにsort不利っぽいけど、
小さいときどうかは微妙だよな。perlのsort意外に速いし...

0680nobodyさん04/09/24 14:05:57ID:???
use strict;
use Benchmark;
use vars '%Hash';

my %rand;
$rand{ int rand 100000 }++ while keys %rand < $ARGV[0];
@Hash{ keys %rand } = values %rand;

timethese(-5, {
  each => sub {
    my $min_key = 100000;
    my $max_key;
    for (keys %Hash) {
      $max_key < $_ and $max_key = $_;
      $min_key > $_ and $min_key = $_;
    }
    my($min_value, $max_value) = @Hash{$min_key, $max_key};
  },
  sort => sub {
    my @key = sort { $a <=> $b } keys %Hash;
    my($min_value, $max_value) = @Hash{@key[0, -1]};
  },
});
0681nobodyさん04/09/24 14:25:15ID:???
>>640
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Escape

後者のコードがスタンダードなのは、CGI が流行ったころに
後者を使ったスクリプトが出回ったせいじゃないかな。
他にも chr と hex を使ったものも見たことがある。
0682nobodyさん04/09/24 16:37:42ID:???
use URI::Escape;

$buffer = uri_unescape($buffer);
0683nobodyさん04/09/24 19:34:09ID:???
おまいらifの条件文が長くなった場合ってどうやって書いてる?(見やすくするための書き方)

if ( $a == 1 && $b == 1 or $c == 1 ){...}
とか
if ( $a ==1 &&
   $b == 1 or
   $c ==1   ){..}

どっちもイマイチ見づらい。おまいらはifの条件文がやむを得ず長くなってしまったときに
どうやって視認性を確保してる?
0684nobodyさん04/09/24 19:48:42ID:???
>>683
なんで or のときは || 使わないで
and のときは && 使ってるの?
合わせたほうがよくない?
068568304/09/24 19:55:58ID:???
>>684
そうだったorzごめん。

それで何かいい書き方ないかな?一番いいのは冗長な条件文にしないことだけど、
たまにどうしようもないときってあるでしょ?
時間がないから妥協とかするときにでも、とっさにできる最低限のこととして
読みやすさだけは確保したいよね。
0686nobodyさん04/09/24 20:03:00ID:???
>>683
三項演算子
068768304/09/24 20:07:59ID:???
>>686
そういう話ではないんだ^^;
条件文を冗長でないものにする方法じゃなくて、
冗長な条件文の読みやすくするための書き方みたいな感じ;
0688nobodyさん04/09/24 20:08:48ID:???
>>683
else BLOCK が不要なら

{
  EXPR && EXPR || last;
  EXPR        || last;
  ...
}

とか。

Perl に限った話じゃないから、この辺ででも聞けば?
http://pc5.2ch.net/test/read.cgi/tech/1068752664/
0689nobodyさん04/09/24 21:16:00ID:???
GETで送信される引数でカウンタを進ませ,表示するPerlスクリプトの基本的な機能だけ作ってみましたが,
↓Perl
ttp://bcmnhp1.hp.infoseek.co.jp/content2.txt
↓DATファイル
ttp://bcmnhp1.hp.infoseek.co.jp/ctdata2.txt
DATファイルの一行目は上手く動作していますが,二行目の同一IPをチェックする方に何故か初めと終わりに:が付いてしまいます。
↓処理後DATファイル
ttp://bcmnhp1.hp.infoseek.co.jp/ctdata2_b.txt

一体なにが起きているんでしょうか?
069068904/09/24 21:19:18ID:???
書き忘れましたが,処理後DATファイルは
引数「4」(http://~~~~/content2.cgi?4)
でアクセスした場合です。
0691nobodyさん04/09/24 21:55:07ID:???
>@ct = <COUNT>;

ここで改行削除されてないから。
こうするとよくわかるんじゃない?

foreach $_ ( @count ) {
print COUNT "[$_:]";
}
foreach $_ ( @ip ) {
print COUNT "[$_:]";
}
069268904/09/25 08:34:52ID:???
>691
おぉ!出来ました!ありがとうございました!
0693nobodyさん04/09/25 12:44:16ID:???
>>687
> 冗長な条件文の読みやすくするための書き方みたいな感じ;
冗長だったら最適化しろよ。
0694nobodyさん04/09/25 13:47:46ID:???
とあるハッシュのキーの中に
test
というキーがあるかないかを調べるにはどう書くのが一番ですか?

if ( map/^test$/,keys %hash ) {
print "ありました";
}
もっと簡単な方法はありますか?
0695nobodyさん04/09/25 14:00:14ID:???
>>694
if (exists $hash{test}) {
print "ありました";
}
0696nobodyさん04/09/25 14:13:17ID:???
>>693
お前・・・・
最適化する時間も、才能も、素質も、スキルも・・・・・・・ないorz

そんなとき、そんな俺でも読みやすいソースにしたいっていってんだよボケ!
出直してこいや
0697nobodyさん04/09/25 14:41:12ID:???
さぁ、香ばしくなってまいりました。
0698nobodyさん04/09/25 16:48:19ID:???
どれが一番読みやすい?
if ($a == 1 and $b == 1 or $c == 1) {print 'ok'}
if ($a == 1 && $b == 1 || $c == 1) {print 'ok'}
if (($a == 1) * ($b == 1) + ($c == 1)) {print 'ok'}
if ($a == 1 and $b == 1) {print 'ok'} elsif ($c == 1) {print 'ok'}

視認性は、全体のアルゴリズムとコメントで解決するのが一番で、
if文をどう記述するかは二の次だと思うんだけど?
0699nobodyさん04/09/25 17:03:11ID:???
>>696
見易さ(=見た目スッキリ)と読みやすさ(=処理内容のつかみやすさ)は別でしょう。
話の流れを追っても、あなたがどっちを優先したいのかがもひとつ見えないよ。

ここの人に最適化してもらうよりも、自分がわかりやすいと思うコード・記述に
しとけばいいと思うんだけどな。適度に冗長性を確保するのも大事だろうし。

>>698も書いてるけど、コメントのほうで整理しとけば条件文が長いことぐらいは
気にならないと思う。

と、>>686が一瞬「三浦理恵子」に見えた人が書いてみる。
0700683 69604/09/25 18:11:58ID:f8iWY7is
>>699
>見易さ(=見た目スッキリ)と読みやすさ(=処理内容のつかみやすさ)は別でしょう。
>話の流れを追っても、あなたがどっちを優先したいのかがもひとつ見えないよ。

別なの?同じだと思ってた。
一番いいのはスキルアップして、最適なコーディングを瞬時にできるようになることなんだけど、
実際Perlばかりに時間を割けないので、とりあえず見やすさ&&読みやすさ%%把握しやすさだけ
なんとかならないかなと思って。

もちろん最適なコーディングに勝るものは無理だけど、少しはいい書き方ってあるのかなと。
いわゆる改行の入れ方、スペースの明けかた、揃え方。

まああいまいすぎだよね。絶対的な回答ではなく、みんなの習慣的な書き方の解答とかが
ほしかったけど・・・しつれいしますた。
0701nobodyさん04/09/25 19:43:11ID:???
★= 頼むから言語論争はマ板でしてね =★
0702nobodyさん04/09/25 20:26:15ID:???
だれも言語論争などしていない。
0703nobodyさん04/09/25 21:16:28ID:???
ぶっちゃけ多めにコメントいれておけば問題ない。
少なくて意味がわからんかったときは時間かぐっとかるが、
多めなのは読み手が消せばいいだけだから問題ないし。

アルゴリズムの問題は書法の範囲の記法とは別次元だわな。
それは非常に大きな課題だし。
0704nobodyさん04/09/26 18:13:38ID:tuEyJcFU
すみません、以下の要件を満たすためにはどのように書けばよろしいでしょうか。

・テキストの中から<div align="left">という文字列が含まれる行を探す
・みつかった<div align="left"> の行から、その次の </div> までのテキストを
抜き出してprintする

-<div align="left"> はテキスト中に1つのみです。
-</div> は何度も出てきます。

現状 @stringlist に突っ込んで、行数固定で抜き出していますが、
これだと(動的に生成されるページである為)内容が変わってしまうと
対応できません(当たり前)^-^;

よい方法があればお教えくださいm(_ _;)m
0705nobodyさん04/09/26 18:18:45ID:???
>>704
正規表現を体得するのぢゃ、若きヂェダイよ
070670404/09/26 18:31:00ID:tuEyJcFU
はい。マスター。

いま、こんなかんじです^-^;

--------------------------------------------------
#!c:\perl\bin\perl.exe

open(IN, "bin.html") || die "cannnot open!\n";
@stringlist = <IN>;

#読み出す行数
$end = 10;

for ($begin=1;$begin<$end;$begin++){
print @stringlist[$begin];
}

close(IN);
--------------------------------------------------
070770404/09/26 18:31:31ID:???
sage忘れすいませんマスター
0708なちじょあ ◆yEbBEcuFOU 04/09/26 18:51:12ID:???
( ● ・3・ ● ) エェー @text = <IN>; $text = join('', @text);
               $text =~ s|.*<div align="left">(.*?)</div>.*|$1|s;
070970404/09/26 18:53:56ID:???
1.$begin = @stringlistから、<div align="left"> を探して、その行数を返す。
2.$end = 1の行数から検索を開始して</div>が見つかった行数を返す

で、実現できそうな気がするのですが、

・配列から任意の文字列を含む行を探す
・別の文字列を含む行を、特定の行(1で見つけた行)以降で探す

方法はないでしょうか。
0710nobodyさん04/09/26 18:59:41ID:???
>>704
use HTML::Parser;
■ このスレッドは過去ログ倉庫に格納されています