Perl コーディング初心者質問コーナー Part33
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/03/01 02:46ID:1GeWO7LH【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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::
と記述するのが面倒なのですが・・・
0414nobodyさん
04/03/14 12:57ID:2Zg8YvJb>122 :root ★ :04/03/13 21:30 ID:???
>こっちにも貼っておこう。
>916 名前:root ★[sage] 投稿日:04/03/13 21:28 ID:???
>・同時に動くread.cgi数を制限するディレクティブorモジュール
>・負荷(LA)を見てCGI起動を制限するディレクティブモジュール
>
>があったら、誰か教えてください。
http://qb3.2ch.net/test/read.cgi/operate/1078921755/829
http://qb3.2ch.net/test/read.cgi/operate/1078921755/831
http://qb3.2ch.net/test/read.cgi/operate/1078921755/916
0418die($/);
04/03/14 14:24ID:ntUNbT3i気になって朝も起きれません
0419nobodyさん
04/03/14 14:43ID:???0420die($/)
04/03/14 14:48ID:ntUNbT3i0421nobodyさん
04/03/14 17:11ID:???0422nobodyさん
04/03/14 18:06ID:???既存のスクリプトを改造しているのですが、以下のようなことをしようと
思っています。
1)フォームより***.txtといったようなファイルを送信する
2)入力されたファイルを解析して結果を表示する
・・・というものです。
フォームにテキストそのものを書き込む方法ならその値を読み込む
方法なら簡単だと思うのですが・・・
フォーム入力から例えば***.txtというファイルを送信した場合に
これを一旦任意のディレクトリにアップロードして、スクリプト内で
ファイルをopenして処理する以外に方法はないのでしょうか?
0423413
04/03/14 19:33ID:MYhrucqause strict;
としたあとに、
my $val = 10;
print "Content-type: text/html\n\n";
print $val;
exit;
としたところ動きました。どうもありがとうございました。
0424nobodyさん
04/03/14 19:42ID:???>これを一旦任意のディレクトリにアップロードして、スクリプト内で
>ファイルをopenして処理する以外に方法はないのでしょうか?
どうもないらしい。少なくとも俺は知らん。
CGI.pmのドキュメントを読めばわかると思うが、
同じように一時ファイルに保存する分、それがセキュリティの穴になりうる可能性があるとのこと。
まあ、さっと保存してさっと処理してさっと消して、穴になる確率を極力減らす努力をしよう。
0425nobodyさん
04/03/14 19:45ID:wZU93kf10427422
04/03/14 20:14ID:???ありがとうございます。
必死にぐぐってみているのですが、どうもそれらしい資料が見当たらない
のはそういう理由なのでしょうね。
>>424さんいアドバイスいただいたようにセキュリティの穴を作らないよう
素直にテンポラリファイルを作って対処したいと思います。
何分perlの勉強を始めたばかりでわからないことばかりですがひとつひとつ
問題を乗り越えていきたいと思います。
どうもありがとうございました。
0428422
04/03/14 20:21ID:???考えていたのは送信したpostで受けたファイルをいちいち保存しないでそのまま
メモリ上に展開して解析、値を返す、、、ようなことを考えていました。
もっと精進します。
0429nobodyさん
04/03/14 22:25ID:???multipart を自力でデコードすれば原理的に不可能な話じゃないだろう
CGI.pm の man に書いてあるのは、
「CGI.pm はテンポラリファイルを作るので盗聴の恐れもあるんだよ」ということで、
本来はテンポラリファイルを作らず自力でデコードする方がセキュリティは高い。
なんだが、自力でデコードするのがめんどいので、
たいていみんな「盗聴されてもいいやー、どーせuploaderだしぃ」とか妥協して
CGI.pm に頼ってしまうわけだ。
自力でデコードするなら、
ttp://www.hk.airnet.ne.jp/~ahero/cgi/cgiex11.html
あたりを参考にしてみては。
■ このスレッドは過去ログ倉庫に格納されています