【Perl】初心者コーナー Part13
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/05/30 13:06ID:R2kt1mTx1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
中途半端な質問だから一般的な回答をもらったのに、脳内変換するなよ。
ユーザ個別にという前提で聞いてないじゃないだろ。
その場合はユニークなIDとセットで行うのが普通だし、判定なんて
簡単な話じゃないの。
0118nobodyさん
02/06/05 21:36ID:6v6pwQwJコマンドを教えてもらえないでしょうか?
私の調べた範囲ではわからなかったのでお願いします。
0121nobodyさん
02/06/05 22:03ID:???0122nobodyさん
02/06/05 22:16ID:6v6pwQwJ0124nobodyさん
02/06/05 22:19ID:???メール欄にsage
0125nobodyさん
02/06/05 22:57ID:???内容は当方のデータベース内にある情報の中で、各人に必要なものを検索し、
見ていただくというものです。
データはCSVファイルになっております。
そこで質問なのですが、たとえばCSVファイルが
1列目はお店の名前
2列目は「とんこつ」または「しょうゆ」または「しお」
3列目はお店の所在地(都道府県)
という具合に記述されているとします。
このとき当サイトを見た人が、チェックボックスの「東京」「とんこつ」
にチェックを入れて検索をかければ該当するお店がHTMLファイルに出力
されるようにしたいのです。
私はまず何から手を付ければよいでしょう?
ちなみに恥ずかしながらプログラミングの知識はほとんどありません。
「そういうプログラムあるよ」とか「まずこの本買って勉強しなさい」とか
何でもいいですから情報をいただけるとありがたいです。
0129nobodyさん
02/06/05 23:58ID:???レスキューの簡易データベースでも使っちょれ
http://www.rescue.ne.jp/cgi/database/
0130イニシャルN ◆kys8mAGw
02/06/06 00:01ID:???http://pc.2ch.net/test/read.cgi/prog/1023283683/
から来ました。板違いという指摘があってコチラに誘導させてもらいました。
ここのスレで勉強させてください。
よろしくお願いします。
0131nobodyさん
02/06/06 04:26ID:???HPBにMe…
キタ━━━━(゚∀゚)━━━━ !!!
で、何を御所望?
まさか、この辺鄙な板の真っ当なスレまでネタスレに!?
0133イニシャルN ◆kys8mAGw
02/06/06 06:59ID:???あれは使いまわしなので古い内容ですね。
今はタグ打ち、XPプロフェッショナル/2000/NTの3機の環境です。
あ、自宅はMeですが、、、、
ネタスレ、ネタスレと言いますがネタじゃないです。
まじめに勉強しようと思ってますよ。
今、スレ一覧とかみてよいCGIサイトとか
お気に入りにいれました。参考にさせてもらいました。
ありがとうございます。
頑張って調べてそれでもわからなかったら力添えよろしくお願いします。
失礼します。
0134nobodyさん
02/06/06 08:56ID:dEIJexyI心配なら、ScriptAliasでdocumentrootの外に置くといいでしょう。
0135nobodyさん
02/06/06 15:10ID:???↑こんな時、$b をリテラルとして扱う方法ってある?
0136nobodyさん
02/06/06 18:08ID:???ネタスレと言われるのは、単発で立てたからだろ。
まじめに勉強したいならしばらくは2ch外でお勉強した方がいいと思う。
質問するなら>>1の内容を5回くらい声に出してからしてくれな
0137nobodyさん
02/06/06 18:59ID:???ハァ?
まさか
$a =~ m'$b';
とか
$a =~ /\$b/;
とかしたいって意味じゃないよな。
そんなのどんなクソな参考書でも絶対載ってるもんな。
もっとちゃんと説明しねーとワケわかんねーよヴォケ、とだけ逝っておく。
0140138
02/06/06 21:23ID:???俺が言いたかったのは、たまたま見た >>137 の様な人間がなってないような
解答者しかいねぇなって皮肉ったって事。
0142nobodyさん
02/06/06 21:42ID:???0143nobodyさん
02/06/06 21:48ID:???以下の要点を抑えないとまともに答えてもらえないので注意ですよ。
>>1
> 1:自分はこう言う事がしたい。
> 2:それでこんな風にやってみたが・・・
> 3:それだとこんなエラーが出て上手く行かなかった。
0144nobodyさん
02/06/06 22:29ID:???if ($a == 1) { &b }
if ($a == 2) { &b }
if ($a == 4) { &b }
これを短くするにはどうすればいいですか??m(__)m
0147nobodyさん
02/06/07 02:26ID:AfwvfL8+0148nobodyさん
02/06/07 04:15ID:IzDclSQvサブルーチンを作りたいんですが今の知識では書けませんです。
ちなみに仕様上、tableで囲うとかしたくないのです。
ちなみに改行は\rでやっております(どうでもいいですか)。
投稿内容のバイト数をチェックして
その中の\rの数を出して
何文字か毎に割ればいいように思うんですが…
もし良ければ教えてくらさい
0149nobodyさん
02/06/07 05:06ID:???>適度に改行が含まれている
んなファジーに「適度」いわれてもわからんのじゃゴルア。
tableで囲いたくないつーと、1行の文字数は不定つーことかな?
1行の文字数ってか横幅を固定せずに「適度な改行」を判定するなんてこた、
おそらく不可能だと思うが。もすこし詳しく条件を述べたまへ。
0150148
02/06/07 05:35ID:IzDclSQv改行符(\r)無しで○○文字以上文字が続いていたらエラー、という
式を書きたいわけです。
ちなみにたったいま
$comment =~ s/(.*)\r/$1\r/ig;
$oneline = $1;
return $oneline;
で、$onelineが>100だったらエラー、というのを書いてみたんだけど
上手く機能しませんでした
この100って数字は適当なんでどうでもいいです。
要はこの数字がtableで言うところのwidthの役割にはなるかなと
思ったんですが駄目かなぁ
0151nobodyさん
02/06/07 05:43ID:kAPIF1KY前提:
4年に一度は閏年
でも100年毎は閏年ではない
ただし400年毎は閏年
@months = ("0", "31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31");
if (($year%4) == "0" || ($year%100) != "0" && ($year%400) == "0") { $months[2] = "20"; }
三つの式が『||』と『&&』の二つの論理演算子でifの条件文が作られているわけ
ですが、『($year%4) == "0"』と『($year%100) != "0"』と『($year%400) == "0"』の関
係と、その中での『||』と『&&』の関係が知りたいです。
上述のif条件文だとうまく処理されないのに、条件文を
(($year%4) == "0" || ($year%100) != "0" and ($year%400) == "0")
もしくは
((($year%4) == "0" || ($year%100)) != "0" && ($year%400) == "0")
にするとうまくいくんです…。
参考書に書いてある優先順位の意味も分からないし…。
宜しくお願いします。
0152nobodyさん
02/06/07 06:04ID:???100文字ごとにbr要素ぶちこんで改行するとかでどうじゃろ?
それならPerlメモ(>>3見れ)にある
日本語を特定の長さで折り返す方法が参考になった記憶あり。
>>151
おなじアンド演算でも、
&& と || だったら、&&をに計算、次に||を計算する。
and と || だたら、||が先で、次にandを計算する。
こういうふうに、どっちが先に計算されるかってのが優先順位だよ。
わからなかったらカッコ使え。
0153nobodyさん
02/06/07 06:38ID:???0154nobodyさん
02/06/07 07:17ID:???>改行符(\r)無しで○○文字以上文字が続いていたらエラー
簡単に○○バイトで。
print "Error\n" if $comment =~ /[^\r]{10,}/;
嫌なら152の人の示したリンクに飛んでみるとか。
0155nobodyさん
02/06/07 09:47ID:???もし使えるのだったらDate::Calcを使うべし。もうすでに誰かが
書いてあるものならば素直にそれを使うべし。
使えないのだったらもう少しキレイに書けば問題も自然となくなります。
## 多分 $month, $yearをもってきてその月の日数を出したいのだろう
## と仮定・・・
our @MONTHS = qw/ 0 31 28 31 30 31 30 31 31 30 31 30 31 /;
sub get_max_days
{
my( $year, $month ) = @_;
if( $month == 2 && is_leap_year($year, $month) ) {
return 29;
} else {
return $MONTHS[ $month ];
}
}
sub is_leap_year
{
my( $year, $month ) = @_;
if( $month == 2 && $year % 4 == 0 ) {
if( $year % 100 == 0 ) {
return $year % 400 == 0;
}
return 1;
}
return 0;
}
0156nobodyさん
02/06/07 09:54ID:5iJQJUx6まあ凝るならchasenを使って文節のきりのいいところで
改行するということで。
0157nobodyさん
02/06/07 10:06ID:???あと文字列と==を混ぜるのはやめとき。
print "equal!\n" if "a" == "0";
==は数値、eqは文字列。まぁ151のコードだととりあえず関係ないけど。
0158nobodyさん
02/06/07 10:55ID:???些細なことだが、"閏年かどうか"は
引数の月が二月であるかどうかとは無関係だろ?
ついでだからもっと単純に実装してみる
これは
"yearが4で割り切れる、かつ、$yearが100で割り切れない
または、$yearが400で割り切れる場合、真を返す"
と読む
sub leap_year
{
my $year = shift;
return $year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0;
}
0160nobodyさん
02/06/07 13:15ID:???コマンドプロンプトからは動作するのに、ブラウザからは
動作しません。
#### ソース ####
sub ImageProcessing {
local($infilename,$outfilename,$width,$height) = @_;
$image = Image::Magick->new;
$image->Read($infilename);
$image->Scale(width=>$width,height=>$height);
$image->Write($outfilename);
}
ソースに問題はないと思いますが、
$image->Read($infilename);
でファイルが読めてないようです。このcgiファイルと同じディレクトリに
読み込む画像があるのですが、エラーでは画像がないと返ってきます。
この問題が分かる方、是非ご教授お願いいたします。
//// 環境 ////
Windows2k
Apache1.3.24
ActivePerl
PerlMagick
0161nobodyさん
02/06/07 13:16ID:JHi9xs8Bフォームの内容を、フォームとsubmit ボタンを2つづつ使って、
別々のcgiに選んで渡すことはできるんでしょうか?
form1
form2
内容
submit 1
submit 2
みたいな感じで、できるとうれしいのですが。
0162nobodyさん
02/06/07 13:19ID:O+HWTyLIできるでしょう
0163nobodyさん
02/06/07 13:23ID:JHi9xs8Bname 属性をそれぞれそろえても駄目ですよね?
具体的な方法を教えてもらえると、とてもうれしいです
0164nobodyさん
02/06/07 13:26ID:O+HWTyLI0165nobodyさん
02/06/07 13:33ID:???JavaScript使え。
0168161
02/06/07 13:46ID:JHi9xs8Bいちお言っておきますが。166は私ではありません。念のため・・・。
0169nobodyさん
02/06/07 13:54ID:???>163では>162に対するレスとしてその方法を聞いてるように見えたから>165では>161へのレスとしてああ書いた。
そして>167の言うように板違いだから詳細には触れなかった。
0170nobodyさん
02/06/07 13:57ID:???0171nobodyさん
02/06/07 14:06ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0172nobodyさん
02/06/07 14:07ID:???確かに板違いだが、今後同じ疑問をもつ人もいるだろうし
ぐちぐちいうぐらいなら、やり方教えてやったほうが早い。
<HTML LANG="ja">
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<FORM ACTION="" NAME="MyForm">
<INPUT TYPE="BUTTON" VALUE="送信1" onClick="MyForm.action='hoge.cgi';MyForm.submit();">
<INPUT TYPE="BUTTON" VALUE="送信2" onClick="MyForm.action='fuga.cgi';MyForm.submit();">
</FORM>
</BODY>
</HTML>
0174nobodyさん
02/06/07 14:39ID:???0175nobodyさん
02/06/07 15:14ID:???「Perlでできますか?」と聞いてるから問題はない。
「JavaScriptならできるから、そっちで聞け」と答えているなら、それも間違いではない。
「Perlではできない」とだけ答えるよりむしろ親切。
0177nobodyさん
02/06/07 20:59ID:???$EUC_JP_ = '[\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE]';
@chars = ($str =~ /($EUC_JP_)/g);
よくわからんがこういうことかな?
0178nobodyさん
02/06/07 21:02ID:???質問が意味不明です。
だが、とりあえずここ逝け
http://www.din.or.jp/~ohzaki/perl.htm
0179nobodyさん
02/06/07 23:13ID:VaB1XovqDelphiのような総合開発環境がないので、どこが悪いのか探すのだけで直ぐ数時間ふっとびます・・・
効率のいい手法などあるのでしょうか?
0180nobodyさん
02/06/07 23:28ID:zKprkcjg古典的だがprintデバグ(wara
dieとか使えばデバグが楽になるらしいよ。
0181nobodyさん
02/06/07 23:31ID:???まずは
perldoc perldebug
当然-wスイッチとuse strictは必須
で、デバッグ機能としては…
perl -d script.pl # ビルトインCUIデバッガ
perl -d:ptkdb # GUIデバッガ Devel::ptkdbをインストールする必要あり
perl -d:Dprof script.pl ; dprofpp # Devel::Dprof プロファイラ
perl -MO=Deparse script.pl # オプティマイズの様子を見る ただしかなり不完全
ざっと見てこんなもんかな。
0183nobodyさん
02/06/08 00:24ID:???かったんで実験したら、コンマで繋ぐと上手く行くことがわかった。
例:open() or print "エラーしますた\n", return;
このコンマの意味って、Perl的にどういう意味?
0184nobodyさん
02/06/08 00:35ID:???コンマ演算子は式を左から順に評価し、最も右の式の値を返す。
voidコンテキストだと単に左から順に式を評価するだけ。
print("a"), print("b")
これはprint("a")を実行した後、print("b")を実行せよ、ということ。
ただし>>183は少し違う。
この場合はprintを"エラーしますた\n"とreturnの返り値の二つの引数で呼び出している。
ただしreturnは値を返さず呼び出し元に戻るから、"上手く行く"はずはないんだが…
0185age
02/06/08 00:49ID:???$count++;
の時は1ずつ上がっていたのに
$count+10;
にすると10ずつ上がるどころか全くカウンターが変わりません、
何かやりかたあるのでしょうか?
0186nobodyさん
02/06/08 00:57ID:???即レスどうもです。ラクダ本のコンマ演算子は読んだんですが、
左から順に評価し、は、実行すると言う意味なのね。
ちなみに、昨日の事を記憶で書いたので、今見直したら return
じゃなくて print, redo LABEL;でした。return は実験したか
記憶に無い。鬱
0189nobodyさん
02/06/08 11:45ID:R0Gdpaab何をやってもIPアドレスの方が取得されてしまいます。
$host = $ENV{'REMOTE_HOST};
これ一行だけにすると、何も取得出来ず・・・。
サーバがそういう設定にしているのか・・・。
どうすればいいのでしょうか?
0190nobodyさん
02/06/08 11:46ID:???サーバーの設定によっては使えない。
0191nobodyさん
02/06/08 11:48ID:R0Gdpaab返答ありがとうごさいます。
今使っているところは米tripod、あそこはダメか・・・
0192nobodyさん
02/06/08 11:48ID:???if ( $ENV{'REMOTE_HOST'} ne '' ) {
$host = $ENV{'REMOTE_HOST'};
}
else {
$host = $ENV{'REMOTE_ADDR'};
}
0193nobodyさん
02/06/08 11:58ID:R0Gdpaabそのように設定して、自分のリモホを見たら
10.10.17.178とか表示されました・・・。
どこのIPだ。しかも表示させたいのはリモートホストだし。
tripod逝ってよし
0194nobodyさん
02/06/08 12:03ID:R0Gdpaabこれはサーバの設定だな。
tripodは諦めます。
0195pear ◆FRUIT8pk
02/06/08 14:31ID:???XREAなら gethostbyaddr 関数でホストが取れたと思う。
0196nobodyさん
02/06/08 14:41ID:???全角カナ−>ひらがなへの変換は出来ないのでしょうか?だれか教えて下さい。
0197nobodyさん
02/06/08 14:43ID:JsVHaVnY$addr = $ENV{'REMOTE_ADDR'};
if ($host eq "" || $host eq "$addr") {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}
if ($host eq "") { $host = $addr; }
0198nobodyさん
02/06/08 15:27ID:???jcode.plならtr関数が使えたと思う。
jcode::tr(\$str, 'ァ-ン', 'ぁ-ん');
もしかしてShift_JISには未対応だったかも。
だめだったら自分で変換用のハッシュでも定義して変換しる。
0199196
02/06/08 16:52ID:???返答ありがとうございます。
jcode.plのソースには「Code must be JIS or EUC」とあったので
&jcode'sjis2euc(*ss);
&jcode'tr(*ss, 'ァ-ン','ぁ-ん');
&jcode'euc2sjis(*ss);
こう記述したのですが無理でした。
もしかしてとんちんかんな事を書いてますか?
0201nobodyさん
02/06/08 18:11ID:???199+200の考えでいいと思いますよ。
'ァ-ン', 'ぁ-ん'をEUC-JPの文字コードで書けばいいんじゃない?
&jcode'tr(*s, "\xHH\xHH-\xHH\xHH", "\xHH\xHH-\xHH\xHH");
HHのとこは16進の文字コードで。
0202nobodyさん
02/06/08 19:18ID:Z1wnMQCd上の"1" "2" "3"を一つの()内にまとめる書き方ありますか?
0203nobodyさん
02/06/08 19:44ID:???簡単な方法は、無い。
1,2,3...が多い場合は、ハッシュを使えば若干パフォーマンスは上がるかもね。
use constant true => 1;
%tbl = (
1 => true,
2 => true,
3 => true,
);
if($tbl{$x}){ ... }
0204196
02/06/08 19:51ID:???有り難うございます。早速やってみたところ
カタカナとひらがなを相互に変換してしまいます。
カタカナはひらがなへ、ひらがなはそのままにしたいのですが…
&jcode'sjis2euc(*ss);
&jcode'tr(*ss, "\xa5\xa1-\xa5\xf3", "\xa4\xa1-\xa4\xf3");
&jcode'euc2sjis(*ss);
0205nobodyさん
02/06/08 22:37ID:???第2土曜7時、みたいな感じで・・・
0208nobodyさん
02/06/09 00:27ID:???悶えてるんですか?
ハァハァ・・・・
0210nobodyさん
02/06/09 00:57ID:???サンプルなどを見て研究していたのですが、仕組みがよくわかりません。
ファイルを指定する→送信ボタンを押す→指定したフォルダにファイルが保存される
という一番シンプルなソースコードを、どなたか示していただけませんでしょうか。
0211nobodyさん
02/06/09 01:11ID:???ttp://tohoho.wakusei.ne.jp/lng/199808/98080055.htm
これが参考になるかな?
0212Darkness Tester
02/06/09 10:17ID:???DL・解凍したのはいいのですが、どうすればいいのでしょうか?
0213nobodyさん
02/06/09 10:43ID:???"3 + 5 は?"などと返し、
続いて"8"を入力すると"正解"と返すa.exeがあるとします。
このa.exeをPerlスクリプトから
実行するにはどのようにするのでしょうか?
0215nobodyさん
02/06/09 11:28ID:???配布元サイトで聞く。
大体は配布場所に書いてあるだろう。
少なくともこのスレで聞くのは間違い。
■ このスレッドは過去ログ倉庫に格納されています