【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あたりを見よう。
0080nobodyさん
02/06/03 22:29ID:???seek前にtruncateすると、printする前に異常終了した場合データが
吹っ飛ぶんで、print後にtruncateした方が良いと思う。
Cookbookのサンプルもそうなってるし。
seek(FILE,0,0);
print FILE @data;
truncate (FILE, tell(FILE));
close(FILE);
0081ぎもじら
02/06/03 23:47ID:???ポスグレのDBIいれようとしたら
c:\>ppm install DBI
でインストできちゃった
なんで?
どんな仕組みになってるのかわかりません
ヨロシコ
0082nobodyさん
02/06/04 00:13ID:???分からない事があったらとりあえず検索するクセつければぁ?(゚Д゚)
0084nobodyさん
02/06/04 01:22ID:???0085nobodyさん
02/06/04 08:43ID:???Perlのバージョンは5.6.1です。
Text::Templateのバージョンは1.43です。
use Text::Template;
$NaviView = 'SHOW';
my $template = new Text::Template (
'type' => 'FILE',
'source' => 'test.html'
) or die;
print $template -> fill_in();
デスクトップでテストするとHTMLファイル内の{$NaviView}が展開されて表示されます。
しかし、cgi-bin/step8/フォルダ内だと、何故か{$NaviView}の部分が表示されません。
ソースは同じなので、原因がわからずに困っています。
どうか助けてください。
008666
02/06/04 09:27ID:b8OuO/Ji自分も調べてみたけど、そっちの方が安全性が高いみたいですね。
なんか、処理速度も速いみたいです。どうもです。
0087nobodyさん
02/06/04 11:32ID:V54BnlXw繰り返したいのですがうまくいきません。どうか助けてください。変数の中に
変数というのは無理なんでしょうか?
for($m=1 ;$m <= 9 ; ++$m){
&print($m);
}
====================
sub print {
my ($i) = @_ ;
$A = "$NO$i"; #←この部分がやりたいことです
print = $A;
}
若輩者ですが、宜しくお願いします。
0088nobodyさん
02/06/04 12:45ID:???$A = "\$NO$i"; でいいのでは。って、こういうことじゃないのか?
ちなみにforの部分は、漏れはforeach(1..9)と書くのが好き。
009061
02/06/04 13:01ID:???レスどうもでした。それと遅レスすいませんです。
tmon.outにはBEGINが数万回記録されていたのに、
BEGINにprint文を入れてみたら1回しか出力されなかったので、
DProfのバグということで落ちついてみます。
本当のところは知らないですが。
0092nobodyさん
02/06/04 13:13ID:???過去スレで出たんだけど、foreachよりもforの方がいいらしい。
foreach(1..9)だと、@_ = (1,2.3,4,5,6,7,8,9);みたいな一時配列を作ってから処理をするからメモリを食うんだと。
まぁ、この程度の数値なら差はないだろうけど、
for($i=0;$i<10000;$i++)
foreach(0 .. 10000)
くらいになると差が出るんじゃないかな?
009361
02/06/04 13:14ID:???#!/usr/bin/perl -w
use strict;
sub LIMIT { 10000 }
for (my $i = 0; $i < LIMIT; $i++) {
}
print "end\n";
このソースで下の測定結果になります。
Total Elapsed Time = 0.019991 Seconds
User+System Time = 0.019991 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
150. 0.030 0.025 10002 0.0000 0.0000 main::BEGIN
0.00 0.000 -0.000 1 0.0000 - strict::import
0.00 0.000 -0.000 1 0.0000 - strict::bits
0094nobodyさん
02/06/04 13:42ID:???過去のバージョンでは確かにそうだったが、
5.005の時点で最適化されたため、今や foreach(n .. m) の方が早い。
あやふやな知識は試してみてから外に出そうな。
0095nobodyさん
02/06/04 13:52ID:???それはPerl4とかの話でしょ。
今はもう一時配列作っていないから心配ないよ。
ちなみに0 .. 10000のほうが速い。ってperlsynに書いてある。
0096nobodyさん
02/06/04 13:53ID:???0097nobodyさん
02/06/04 13:54ID:???すまんがわからん。さっぱりわからん。
俺も幾つか試してみたけど、まるで納得いかない結果になったよ。
多分どこかにバグがあるのは間違いないと思う。
0098nobodyさん
02/06/04 14:12ID:???5.6.0では
Total Elapsed Time = -0.85246 Seconds
User+System Time = 0 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
0.00 0.575 0.105 10001 0.0001 0.0000 main::LIMIT
0.00 0.008 0.008 1 0.0077 0.0076 main::BEGIN
0.00 0.000 -0.000 1 0.0000 - strict::import
0.00 0.000 -0.000 1 0.0000 - strict::bits
Elapsed以外は正しく見えるが...
perltocにdprofpp(utility change)と書いてあるから古いの使ってるんじゃないのか?
009997
02/06/04 14:22ID:???俺のはPerl5.6.1(ActivePerl631) Devel::Dprof 20000000.00_00 だ。
このコードはどうだろう。
俺の環境では、なぜか use ...; をコメントアウトするとまともに動くのだが。
#!perl -w
use less; # strictとかでも同様。lessを選択したのは何の効果も無いプラグマだから
sub limit{ 100 }
sub LIMIT{ &limit }
for(my $i = 0; $i < LIMIT; $i++){}
0100nobodyさん
02/06/04 14:30ID:???レスどうもです。
ええと、perl -versionは5.6.1だったです。dprofppのバージョンは分かりませんでした。
SerioWare GNU/Linux 0.35A附属のものを使っています。
で、この環境では>>99と少し違って、
ちょうど>>94とかぶってたので、forとforeachを調べてみたら、
#!/usr/bin/perl -w
use strict;
for (my $i = 0; $i < 1000000; $i++) {
}
これだとBEGINは1回呼ばれるだけだったです。
0101nobodyさん
02/06/04 14:45ID:???それは知らなかった、サンクス。
もっとも、漏れのプロバのスペースはいまだにPerl4なんだけどな。(涙ッシュ
010298
02/06/04 14:50ID:???ActivePerl 5.6.1でやってみた。結果は異常。
>>98はFreeBSD上の5.6.0。こいつのdprofppにActivePerlで作ったtmon.outを
食わせてみると、ActivePerlと結果同じ。 Devel::DProfのバグっぽい。
0103nobodyさん
02/06/04 16:38ID:???出力だけs-jisに変換してるんですか?
0104nobodyさん
02/06/04 16:44ID:???0106nobodyさん
02/06/04 20:32ID:???しかもfor(my $x; $x < $limit; $x++ ) は本当はwhileだという罠
perl -MO=Deparse,-x3 -e 'for(my $x; $x < 100; $x++){ print "barf\n" }'
my $x;
while( $x < 100 ) {
print "barf\n";
}
continue {
++$x;
}
-e syntax OK
0107nobodyさん
02/06/04 20:50ID:???use Benchmark qw/ cmpthese /;
sub cstyle
{
my $a = 0;
for( my $x = 0; $x < 1000; $x++ ) {
$a++;
}
}
sub pstyle
{
my $a = 0;
for my $x ( 0..999 ) {
$a++;
}
}
cmpthese(
100000,
{
cstyle => \&cstyle,
pstyle => \&pstyle
}
);
Benchmark: timing 100000 iterations of cstyle, pstyle...
cstyle: 95 wallclock secs (94.13 usr + 0.01 sys = 94.14 CPU) @ 1062.25/s (n=100000)
pstyle: 72 wallclock secs (71.58 usr + 0.02 sys = 71.60 CPU) @ 1396.65/s (n=100000)
Rate cstyle pstyle
cstyle 1062/s -- -24%
pstyle 1397/s 31% --
010885
02/06/05 09:40ID:???myで宣言してたのがいけなかったようです。
use strictをコメントアウトしたらうまくいきました。
0110nobodyさん
02/06/05 10:03ID:???0114nobodyさん
02/06/05 14:12ID:O06am5wh2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数:105420人 発行日:2002/05/030
どもども、風薫る5月ワキガも香るひろゆきですー。
今日はどうしても報告したいことがあるですよー。
東京地裁の顔になりつつある今日この頃ですが、最近裁判官がおいらを露骨に馬鹿にするですよー。
裁判を傍聴している人は既にご存知でしょうが、ついこの前は、おいらのことを
「あなたは売春クラブの経営者みたいな言い訳をしますね」
なんて言いやがったですよー。
どうやら売春クラブの経営者は警察に捕まると必ず
「出会いの場を提供しただけだ」
と、見苦しい言い訳をするらしいですよー。。。
そんなセコイ奴等とおいらを並べて語るとは悔しいけど、ストライクですー。。。えぇえぇ、、、
確かにおいらは企業や公人の誹謗中傷を禁止していませんし、削除もしません。
その上、「発信元は判らない」を看板とし、悪質な書き込みをし易い環境を提供し、いやむしろそれを売りにしようと目論んでいますが、そんなことはおいらのクチビルの厚さとは関係ないですよー。。。
ところで、中央大卒のおいらの同級生達がおいらのことを「宅八郎みたいな奴」と罵っているって本当ですか?。。。うぅうぅ、、、
んじゃ!
0115nobodyさん
02/06/05 16:42ID:???中途半端な質問だから一般的な回答をもらったのに、脳内変換するなよ。
ユーザ個別にという前提で聞いてないじゃないだろ。
その場合はユニークな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
■ このスレッドは過去ログ倉庫に格納されています