Perl コーディング初心者質問コーナー Part33
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/03/01 02:46ID:1GeWO7LH【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0313nobodyさん
04/03/10 19:44ID:???俺は、結構大きなもの作る(といってもたかがしれてる)。
今までで一番時間かけたのは、DBを使った成績の管理かな。
成績入力、平均算出、順位順に並び替え、などなど。
全部グローバル変数でやりましたよ。
一人でやるなら、全体が把握できてるから構わないけど、チームでプロジェクトをやるときにはmyで局所化したほうがいいってことだ、と思い、毎日グローバル変数でがんばっております。
0314nobodyさん
04/03/10 19:58ID:???殆どの人は使うべきとか使った方が良いとは言ってるが、
何が何でも使えと言ってる人は逆に少数だろう。
要は、さまざまな利点が自分にとって意味がない思うのならば使う必要はないし、
そうでなければ使った方が良いんじゃない? 程度の事を主張しているに過ぎないのだと思う。
0315nobodyさん
04/03/10 20:38ID:???でも、そのうち気づくさ。
0316nobodyさん
04/03/10 20:42ID:???0317nobodyさん
04/03/10 20:46ID:???0318nobodyさん
04/03/10 20:56ID:???俺はTransitionalで妥協。
0319未承諾広告※ ◆TWARamEjuA
04/03/10 21:35ID:???慣れれば簡単。tu-ka、文章の意味づけが理解できるようになる。
SEO 対策にも使えるんだけどねぇ(哀)@相変わらずtable厨不思議マークアップな職場
0320nobodyさん
04/03/10 21:46ID:???0321nobodyさん
04/03/10 22:00ID:???$QUERY_STRING = $ENV{'QUERY_STRING'}
のように代入してるスクリプトを良く見かけるのですが、
単に読み込むだけなら代入する必要はありませんか?
0322へたれ
04/03/10 22:03ID:huq9wT6VにCGIの中でCGIを呼び出すのはバッククォートで出来るって教えていただいたんですが
実際にbbsのCGIからアクセス解析のCGIをにやってみたらダメでした、同じディレクトリに呼ぶCGIを
おいてやってもダメでした。dopvCOMETを`dcw.cgi?md=s&&pg=indexx`;
ってやって呼んだんですがウンともスンとも…やり方が間違ってるんでしょうか?
ご存知の方居られましたらお助けください。
0323nobodyさん
04/03/10 22:40ID:QACy8cAZ0324nobodyさん
04/03/10 23:39ID:???それだとアクセス解析にならんぢゃろな。アクセス元とかrefererとか集計したいんだろうし。
>>322
えーと
>CGI引数を渡したい場合にはちょっと知恵がいるとか、
の制限に引っかかっちょるんぢゃよ。
バッククォートでやる場合は、?以降の引数をそのまま引き渡すことはできない。
環境変数を使って渡さなきゃいかんのだが、ちょっと修行がいる。
0325nobodyさん
04/03/11 00:03ID:???フォームからCGIにパスワード渡したらCGIがアクセス制限掛かってるフォルダの
ファイルと等価の内容を吐く用にするじゃ駄目?
0326nobodyさん
04/03/11 02:35ID:YAYdGisPhttp://XXX/test.cgi
とアドレスバーに入れたときに「ファイルのダウンロード」となるときがあるのですが
どうしてでしょうか?本当に分かりません。
0327へたれ
04/03/11 02:45ID:X5d27yF/その修行ってどうやればいいでしょうか?
いい参考書みたいなのってあるんでしょうか?
0330nobodyさん
04/03/11 04:22ID:???正確には%8b%43ですよね?以下がコードです。おかしなところは無いと思うのですが、
&url_encode("気");
sub url_encode{
$str = shift;
$str =~ s/(\W)/'%'.unpack("H2", $1)/eg;
$str =~ tr/ /+/;
print $str;
}
0331nobodyさん
04/03/11 04:41ID:???\W は [^0-9A-Z_a-z]
'C' (\x43) はこの正規表現にマッチしない。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlre.html
0332nobodyさん
04/03/11 11:20ID:rL/aIPwV自宅サーバ設営のため、Kent Webさまよりyybbsをダウンロードしました。参考書
(Mac OSX Unix的活用講座)の指示通りperlの居場所を指定し直し、アクセス権を
設定しましたが、「Internal Server Error」となって動きません。KentさまのFAQ
をみてチェックしましたが、いちおう問題なく設定されているようにおもえます。
いったいなにがダメなのでしょうか?Askaのほうはうごくのですが・・・
環境はサーバもクライアントもMac OS X 10.3.2です。
0333nobodyさん
04/03/11 11:26ID:???* こ こ は コ ー デ ィ ン グ の ス レ で あ り 、 設 置 云 々 は ス レ 違 い な の で 悪 し か ら ず *
0334nobodyさん
04/03/11 11:30ID:???>Kent Webさまよりyybbsをダウンロードしました
これはどーでもいい。
perlpass->perlのコンパル->httpd->実行の確認
の順番で確認しろ。
あと完全にスレ違いだから。これ。
0337nobodyさん
04/03/11 13:32ID:qdK0the5ラクダvol2のdo関数の項目でdoを使うとよいとかいて
あったけど、use strictを使うとaborted due to compilation error
と怒られました。use varsで変数を宣言しても同様です。
<main.pl>
use strict;
do './ini.pl';
print $aa;
<ini.pl>
use vars qw/$aa/;
$aa='aa';
スコープの問題だと思うけどuse strictを使って
exporterやファイルopenして処理する方法以外でよい方法は
ない?設定ファイルは簡潔にしたいので。。
0338nobodyさん
04/03/11 13:34ID:???http://pc2.2ch.net/test/read.cgi/tech/1074151549/
こちらでどうぞ
0341nobodyさん
04/03/11 15:39ID:???0342nobodyさん
04/03/11 15:47ID:???しかも、パスなんざ環境でいくらでも変わるっちゅーに。
・・・。
そんな餌でオレ様がクマー(
0343nobodyさん
04/03/11 16:57ID:GX3EcYk6などでアクセスした場合の$ENV{"PATH_INFO"}の先頭のスラッシュを取り除きたいのですが、
$file=$ENV{"PATH_INFO"};
$file =~ s/^\///;
これだけでいいのでしょうか?
0344nobodyさん
04/03/11 17:54ID:???QUERY_STRINGが必要な部分のエラー項目を-wで見ようとすると、
?mode=などがオプション扱いされて、参照できないのですが、
他にエラー項目を参照する方法ってありますか?
0345nobodyさん
04/03/11 18:33ID:Jy84bKJOそれとも各処理毎に分けたほうがいいかな?
$name = 'ほげ';
print "名前$name"; # $name = 'ほげ'; は以後不要
$name = 0;
if (〜eq〜) { $name = 1; }
みたいな感じで
0346nobodyさん
04/03/11 18:54ID:???$ENV{"PATH_INFO"}の内容が / で始まるならそれで良いと言うか
試せば直ぐ判りそうな気が。
>344
良く解らんかった……。
>345
普通、同一ブロック内なら変数名は処理毎に変える方が良いと思う。
0347nobodyさん
04/03/11 18:55ID:???http://altba.com/bakera/hatomaru.aspx/glossary/004300470049
a. 先にシェル上で環境変数 QUERY_STRING を定義してから
スクリプトを実行する。
b. QUERY_STRING と引数 (@ARGV) の両方でパラメータを
受け取れるようにスクリプトを改造する。
c. 実験用の Web サーバで実際に CGI プログラムとして動かし
デバッグする。
お好きな方法を。
>>345
{
my $name = 'ほげ';
print ...
}
{
my $name = 0;
...
}
0348nobodyさん
04/03/11 18:59ID:???今は
@temp = %hash;
push @temp, @_; #@_内は key1,value1,key2,value2 以下略
%hash = @temp;
undef(@temp); #気分的に
とやっているのですが、これを余分な変数を介さず
直接追加する方法は無いのでしょうか。
%hash .= @_;
とかやってみたのですが駄目でした。
0351nobodyさん
04/03/11 21:24ID:AiFNJNW+sendmailを使って、特定のアドレスにフォームの内容を送信したい。
2: それでこんな風にやってみたが・・・
CDRにあったスクリプトを、パスを適正にかえて用いた。
3: こんなエラーが出て上手く行かなかった。
メアドによっては成功する。メアドに'ne'を含むものは、演算子とみられるせいかダメ。\n\eとしてもダメ。
変数にいれてみてもダメでした。
成功するメアドは、変数操作でもうまくいきます。この板に来たのは初めてですが、失礼なことがあったらすいません。
よろしくおねがいします。
0352nobodyさん
04/03/11 22:07ID:???人の書いたやつを意味も分からずいじっただけなら、改造スレにでも行ってくれ。
0354nobodyさん
04/03/11 22:57ID:???くだー?
0355353
04/03/11 22:57ID:AiFNJNW+意味もわからずにいじってるわけではありません。じゃヒアドキュメントのところを。
$message = <<END_OF_MAIL;
To: *****.home.ne.jp
Subject:テスト
Reply-To: $in{"mail"}
<名前>
$in{"name"}
<アドレス>
$in{"mail"}
<感想>
$in{"comment"}
END_OF_MAIL
0356nobodyさん
04/03/11 22:59ID:???とりあえず「メアドによっては成功する」のなら"ne"が演算子と見られているという可能性はない。
もし以下のようにしているのなら、"@"をエスケープしていないのが原因かもしれない。
$mailaddress = "[email protected]"; # -> "foo\@bar.com" or '[email protected]'
>>351の文面から*推測*できることはこのくらいだ。
>>353
消えろ
0358nobodyさん
04/03/11 23:05ID:???えーとですね、
「3:こんなエラーが出て上手く行かなかった」というのは、
「ダメだった」と書かれてもそれじゃどうしようもなく、
ダメだったときのエラーメッセージなりログなりを提出せよ、
と、そういうことなんです。
それがないと、何が起きているかわからない。
会社の後輩でも、毎回「まず error_log を見てから俺に相談しろ」と口を酸っぱくして言ってるのに
全然憶えないやつがいるんだけど、なんでみんなああなのかね。
0359353
04/03/11 23:08ID:AiFNJNW+おそれいります。
文字列'ne'を含まないアドレスについては、うまくいくという意味です。
@のエスケープに関しては、すべて行っています。
0361351
04/03/11 23:23ID:AiFNJNW+すいません。
言い忘れましたが、Tera Padというテキストエディタでみると、
'ne'のぶぶんがprintと同じようにボールド体で表示されるのです。
そこで、\n\eとしてみたところ、ボールド体ではなくなりましたが、それで実行すると、
文字列'ne'以下が省略されたかたちでメールが送られた、というメッセージがでました。
どう考えたらいいのでしょうか。
0362353
04/03/11 23:43ID:???0364nobodyさん
04/03/12 04:58ID:SsTHKK/b以下のようなときにもっといい方法無いでしょうか。
$str = '200402';
($year,$month) = (substr ($str,0,4),substr ($str,4,2));
0365nobodyさん
04/03/12 05:03ID:???Tera Pad云々ということはソースに直接メアド入れてるんでしょ?
その付近のソースを貼ったらわかるんじゃないの?
てかそのアドレスを代入した変数を正規表現でチェックしてる?
だとしたらそこがあやしいよーな
0367nobodyさん
04/03/12 05:26ID:???$str = '200402';
$str =~ /^(\d{4})(\d{2})$/;
print $y = $1;
print $m = $2;
0368nobodyさん
04/03/12 05:31ID:???>>364
TMTOWTDI.
# substr
my($year, $month) = (substr($str, 0, 4), substr($str, 4, 2));
# unpack
my($year, $month) = unpack 'A4A2', $str;
# パターンマッチ
my($year, $month) = $str =~ /^(\d{4})(\d{2})/;
# 置換1 (非破壊)
(my $year = $str) =~ s/(\d{2})$//;
my $month = $1;
# 置換2 (非破壊)
my $month;
(my $year = $str) =~ s/(\d{2})$/($month = $1, '')[1]/e;
# 回りくどい方法
my @tmp = split //, $str;
my $year = join '', splice @tmp, 0, 4;
my $month = join '', @tmp;
0370369
04/03/12 05:33ID:???0371364
04/03/12 05:36ID:???それだと弄る箇所がかなり多くなってしまうんで、
スマートに切り分ける方法があるのならな。と思って質問してみました。
やっぱり_で区切っておいてsplitの方がよさげなんで、そっちで行きます。
わざわざ有難うございました。
0373351
04/03/12 08:25ID:J1fEY9awmailtoに代入されたアドレスのうち、****\@jcom.home.ne.jpだけにエラーが生じます。
時間がないので失礼します。
#$mailto = "****\@taurus.livedoor.com";
#$mailto = "****\@jcom.home.ne.jp";
#$mailto = "****\@****.org";
$mailto = "****\@yahoo.co.jp";
jcode::convert(\$name, "jis");
jcode::convert(\$comment, "jis");
open(MAIL, "|$sendmail $mailto");
print MAIL "Subject:comments and questions\n";
print MAIL "Reply-To: $in{'mail'}";
print MAIL "\n$in{'comment'}";
close(MAIL);
0374nobodyさん
04/03/12 09:21ID:???#$mailto = "****\@$jcom"; とかでも無理?
0375nobodyさん
04/03/12 11:25ID:S7woz7f4出したいのですが情報操作目的の、普通ではあり得ない価格報告を
平均価格を計算する時に使ってしまうと平均価格が狂ってしまうのでそれを避けたい
のですが良い計算方法が浮かびません。
10 + 20 + 20 + 30 / 4 = 20 #正常
10 + 20 + 20 + 3000 / 4 = 762.5 #異常
こういう事態を避けたいのです。
perlコーディングというより数学計算式の問題のような気もするのですが
該当スレが見つからなかったのでここに書かせて頂きました。
どなたかよいアドバイス頂けないでしょうか?
0376nobodyさん
04/03/12 11:46ID:???perlのコーディングの話ではないですね。
標準偏差使えばいいんじゃないかと思うけど、この板で話続けるなら
△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1078568723/
0379nobodyさん
04/03/12 12:14ID:???小数点第一位で四捨五入を行なうときには、
$hoge = int($hoge + 0.5);
とすれば整数部分のみが取得できますが、
小数点第二位で四捨五入を行なうときには、
($hoge + 0.05);
の他に、どのような記述を追加すればいいのでしょうか。
0380nobodyさん
04/03/12 12:47ID:???# パーセンテージを算出する
$percent = ($count / $total * 100);
print <<"EOF";
<IMG src="グラフ.gif" width="グラフの長さ" height="10"> $percent</TD>
EOF
こうある場合で、小数点第二位で四捨五入した値を$percentに表示したいのです。
0381nobodyさん
04/03/12 13:12ID:???0382nobodyさん
04/03/12 14:27ID:???再帰とかいろいろ調べてるのですが、いまいちでして。。
0383遙皇 ◆HEHARUKAoo
04/03/12 14:55ID:???皆さんが普段使っているものやおすすめのものを教えてください。
socketから書くの('A`)ノ マンドクセ
0385nobodyさん
04/03/12 15:19ID:???http://pc2.2ch.net/test/read.cgi/php/997829243/ あたりが妥当だろう
0387nobodyさん
04/03/12 16:38ID:???0388nobodyさん
04/03/12 16:54ID:???【PHP】質問スレッド Part15
http://pc2.2ch.net/test/read.cgi/php/1078592587/ あたりが妥当だろう
0389nobodyさん
04/03/12 17:13ID:???$pkg2->get_hash_ref($hashref);
package pkg2;
..
sub get_hash_ref{
my $self = shift;
$self->{'hashref'} = shift;
..
}
のように渡した時、get_hash_ref()内で
while(my($key, $value) = each %{$self->{'hashref'}}){
${$self->{'hashref'}}{$key} = 0 unless $value;
}
とかやっても0が代入されないようなのです。
何が悪いのでしょうか。
0390nobodyさん
04/03/12 17:24ID:???0392nobodyさん
04/03/12 19:48ID:???こんなでも動くけど。
my %hash = (a=>1, b=>undef, c=>3, d=>4, e=>undef);
my $pkg2 = pkg2->new();
$pkg2->get_hash_ref(\%hash);
while(my($key, $value) = each %hash){
print $key, ' => ', $value, "\n";
}
exit;
package pkg2;
sub new
{
return bless {}, shift;
}
sub get_hash_ref
{
my $self = shift;
$self->{'hashref'} = shift;
while(my($key, $value) = each %{$self->{'hashref'}}){
${$self->{'hashref'}}{$key} = 0 unless $value;
}
}
> ${$self->{'hashref'}}{$key} = 0 unless $value;
これが通るのが謎。
$self->{'hashref'}->{$key} = 0 unless $value;
こうするのがいいっしょ。
0393nobodyさん
04/03/12 20:12ID:hneCqJMtWindows XPの場合cookieファイルはどこにあるんでしょうか?
98SEのときと保存の仕方が違うようなのです。
0394330
04/03/12 20:50ID:???いろいろ検索してみたのですが、'C'にも対応したコードがわかりません。
上記のコードはperlメモの写しなのですが、世間じゃ大概urlエンコードには
この方式を利用していますよね?手持ちの本も見てみたのですが、
これも'C'にはマッチしないものでした。
ということは大半のperlスクリプトに'気'を渡したら誤動作を起こすということでしょうか?
0395nobodyさん
04/03/12 21:03ID:???もうperlコーディングの話題じゃないわけだ。
お前は2chにアクセスするとき
http://%32%63%68%2e%6e%65%74/%32%63%68%2e%68%74%6d%6c
でアクセスする気か?
0397nobodyさん
04/03/12 21:32ID:???この書き方って、あんまり印象良くないね。
周知の事実なんだが、自分が、さも今発見したっていうか。
そんなもん、知らない方がおかしいっての。
98SEからPC触ってるんだったら、この何年、何やってたんだって話だよ。
少しは自分で調べることを覚えないとな。
いつまでたっても、初心者じゃカコワルイ。
0398nobodyさん
04/03/12 21:52ID:???-------------------------------------------------------
こ こ ま で 釣 り 堀
0399nobodyさん
04/03/12 22:00ID:???Perlコーディングと関係ない質問はスレ違いということで。
△▲ WebProg 初心者の質問 Part8 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1078568723/l50
へどうぞ。
0400393
04/03/12 22:01ID:???そのクッキーファイルの保存状況を確認しようとしたら見つからなかったんです。
とりあえずcookieでCドライブに検索かけて
cookieがあるフォルダまでは到達して探してたんだけど
目的のファイルが見つからなくてもしかしたら別のフォルダもしくは
特殊な方法で保存してあるのかと思ったけどようやく発見しました。
0401nobodyさん
04/03/13 01:09ID:i+mpAF5R$logno = 1
$num = 2
$ext = ".txt"
だとして、$temp = "$logno_$num$ext" とすると 2.txt と帰ってきてしまいます。
手持ちの入門書(CGI&Perlポケットリファレンス)で見る限りはアンダーハイフンを
エスケープする必要があるという記述は見つけられないのですが、
$temp = "$logno\_$num$ext" としたらきちんと 1_2.txt と帰ってきました。
これはどういう理屈なのでしょうか。
0402nobodyさん
04/03/13 01:23ID:???0403nobodyさん
04/03/13 01:26ID:???${logno}_$num$ext
0405393
04/03/13 12:47ID:???0406nobodyさん
04/03/13 17:17ID:0t1k16srmy %NEW;
my $maxno
だと正常動作するのですが、
my %NEW,$maxno;
だと正常動作しません。
こういうもんなんでしょうか?
どっかで、こういう例を見たような気がするのですが・・・。
0409nobodyさん
04/03/13 20:27ID:3lH9+FV2単位はすべて円です
Windows日本語製品版です。Macもあります。
Office 2003 Pro 10000
Windows XP Pro 4000
Windows 2000 Pro 4000
Windows 2003 Server Enterprise 15000
FrontPage 2003 4000
Acrobat6.0 Pro 7000
Illustrator 10.0 10000
Illustrator CS 10000
PageMaker 7.0 7000
Photoshop 7.0 10000
Photoshop CS 10000
Premiere Pro 10000
Flash MX 2004 5000
期間限定で販売します。希望品,郵便番号,送り先住所,氏名,合計金額を記してお申し込みください。すべてユーザー登録できません。ほかにも商品(Win,Mac)ございます。
リスト希望の方は「リスト希望」のタイトルでメールください。
ご注文はここ→ [email protected]
広告希望はコチラ [email protected]
メール専門広告代理店 本気と書いて大マジっス!広告
0410nobodyさん
04/03/14 10:20ID:YQY2sb9a書いてみたのですが疑問があります。
use strict;
print "content-type: text/html\n\n";
print $a;
exit;
$aは宣言されていないのになぜかエラーがでません。
$abに変えるとエラーがでました。これはなぜなのでしょうか?
0411nobodyさん
04/03/14 10:23ID:???0412nobodyさん
04/03/14 10:30ID:YQY2sb9a0413nobodyさん
04/03/14 12:54ID:YQY2sb9a今作ってるBBSのタイトルや文字色などの設定はsetting.cgi
というものに書かれています。
$title = 'BBS';
$color = '#555555';
のように
それを呼び出して変数をセットしていたのですが、use strictを
使った場合はmainパッケージを指定して
$main::title
のようにしないとだめなのでしょうか?
使うたびにいちいち$main::
と記述するのが面倒なのですが・・・
■ このスレッドは過去ログ倉庫に格納されています