1 :
nobodyさん :
02/05/30 13:06 ID:R2kt1mTx
5 :
:02/05/30 19:51 ID:???
いまさらながら、乙
>>1 しかしホント人いねーな。前スレ996でとまってるよ・・・1000ゲッターすらおらんのか
>5 悩める初心者がいないのは喜ばしい事と思おうじゃないか。 >1 おつ。
7 :
nobodyさん :02/05/31 02:41 ID:RZM1Qpf7
>>6 悩める初心者はいるが、それがperl(CGI/SSI)の分野とすら
判っていないという罠
9 :
nobodyさん :02/05/31 11:17 ID:/ptz9nSf
すみません duの出力をハッシュに格納する例で、 親ディレクトリ名キーに、子ディレクトリ名の配列のリファレンスを入れようとしています。 本中の例を見ていますが、どうしても一行解りません。 du hoge 1425 hoge/hoo 19 hoge/hoo/bee 58 hoge/raa ------プログラム途中より------- ($size, $name) = split; $dirsize{$name} = $size; ($parent = $name) =~ s#/[^/]+$##; ←これ push @{ $kids{$parent} }, $name; 矢印行は、どのような処理を行っているのでしょうか。 ヒントでも構いませんのでご指南いただけないでしょうか。 よろしくお願いいたします。
>>9 ヒント:
($parent = $name) =~ s#/[^/]+$##;
これは以下のコードとほぼ同じ
$parent = $name;
$patent =~ s/[^\/]+$//;
11 :
nobodyさん :02/05/31 12:23 ID:JMT5UavW
ActivePerlで、再帰的にすべてのフォルダにあるファイルを取り出す ということをするために use File::Find; $dir = "C:\\windows"; find(\&print_dir, $dir); sub print_dir { print $File::Find::name, "\n"; } というrecurse.jplを実行すると、 syntax error at C:\Perl\lib/File/Find.pm line 2, near "use 5.005_64" BEGIN failed--compilation aborted at recurse.jpl line 1. というエラーが出ます。これはどういうことなんでしょうか。 ↓はFind.pmの1行めから4行めまでです。 package File::Find; use 5.005_64; require Exporter; require Cwd; モジュールを使うのは初めてです。 どうぞよろしくお願いします。
Perlのバージョンが古いってことだす。 新鮮なPerlをインストールしてけろ。
13 :
11 :02/05/31 13:40 ID:JMT5UavW
>>12 どうもありがとうございます!
JperlじゃなくてPerlでやったら動きました。(Jperlが古いってことですよね。)
ホント助かりました。
14 :
nobodyさん :02/05/31 13:55 ID:9bWUYmPc
Accessで作成したデータベースファイルをLinuxサーバーに置いてWebからperlを使って操作ってことは可能でしょうか。 いろいろそういうモジュールがないかと探したんですけど見つけることができませんでした。何か方法があるんでしたら教えて下さい。
15 :
9 :02/05/31 15:20 ID:/ptz9nSf
>>10 うをー
速やかなレスありがとうございました。感涙;;
16 :
nobodyさん :02/05/31 15:50 ID:n686HjoS
最近Perlでプログラムを始めてみました。 引数に文字列を入れたら、それぞれの文字のASCIIコードを足して、 10で割ったあまりを返すサブルーチンを作ったんですが、 #呼び出し $moji = "ABC"; $number = &getid($moji); print $number; #ルーチン sub getid{ local($tmp) = @_; $id = 0; @data = split //,$tmp; $num = grep //,@data; for($i=0;$i<$num;$i++){ $tmp = ord($data[$i]); $id += $tmp; } return $id %= 10 ; } ってやると、返り値が0の時のみ正常に動いて それ以外の値になる時はこのルーチンの中でプログラムが終わってるようです。 何かヘンなところあるでしょうか?
17 :
16 :02/05/31 16:09 ID:???
すいません、他のルーチンに問題があったようです… これで得た数値を、jcode.plを用いてSJISに変換しようとしたところで止まってたようです。 板を汚してしまい、申し訳ないです。
@list 内の $i 番目の要素を抜いて、一番最初にいれたいです。 どうすればいいか教えてください。 例: $i = 2 ●,◆,★,■,▲,▼ ↓ ★,●,◆,■,▲,▼
>>18 $i = 2;
unshift(@list,splice(@list,$i,1));
PerlのTipsがたくさんおいてある、有名なHP教えてください。 よろしく
23 :
山 :02/06/01 23:23 ID:A+zARsIN
foreach $line (@qq) { ($a,$b,$c) = split(/<>/, $line); if($a eq "abc") { ???????????? } } foreachで配列を処理します。$aが、abcだった場合、現在処理中の 配列のセット($a,$b,$c)ごと削除したいんです。 説明わかりにくくてすみませんが、どうすればいいですか?
>>25 赤らくだ本によると、それだと連想配列が対象になるんじゃ?
splice とかは?
連想配列…久しい名だ。 そもそも、23ってwhileの方が… それか foreach(@qq){ ($a,$b,$c) = split(/<>/, $line{$_}); ~~~
29 :
もじら :02/06/02 10:42 ID:???
w2k + httpd + cgi_perl + DBI + posgre7.2 の質問です DBIをどのように設定したらいいかわかりません
>>29 こんな投げ遣りな質問久しぶりだ。
君を第一級教えて君に認定しよう!
31 :
:02/06/02 11:48 ID:???
33 :
もじら :02/06/02 14:24 ID:???
自分でも把握してないので、やはり厨房ですケテー 接続ID = pg_connect("","","DB名"); これはPHPの中の記述です この書き方は何に依存しているかは不明ですが それでこの関数でエラーがでました httpd とポスグレの状態は起動しています どのように起動していればいいかは不明です テーブルも作りました ほんとに質問の仕方もわかりません
34 :
もじら :02/06/02 14:30 ID:???
仕組みがわからないのは、CGIとデータベースの間でのやりとりです おそらくPERLからDB関数でカーソルを得てるとおもうのですが DB関数はナニに依存しているのか、どこに組み込めばよいのか不明です VBはOCXとODBCドライバを記述すればよかったのですが VBでADOをさわったことはあるのですがカーソルは使えます PERLがカーソル機能をもっているなら、関数を書けばいいだけなのか 不明です。
>>35 PHPだと
>>33 のようにすればできたけどPerlでDBとのやりとりを行うにはどうすればいいの
他の言語だと
>>34 のようにできたけど。
やるための準備はできているからPerlでの記述の仕方を教えて。
きっとこんな感じだろ。
37 :
もじら :02/06/02 15:16 ID:???
use DBI; # DBIモジュールを読込む この書き方でDBIの関数を使える これは正しいですか? もし正しいなら、DBIモジュールはどこに組み込めばいいのかわかりません DBIの概要は読みましたが、どこから入手してどこに組み込むのかわかりません 決してソースのキボンヌではないです でもINSERT文のひとつが実行できたらミッション完了です よろしくおねがいします
C compilerとmakeツールを用意してCPANへGO! つーか「モジュールとはなにか」すら理解せずにDBIを使おうとするのは間違ってます。
39 :
nobodyさん :02/06/02 17:14 ID:QCpBS98O
全角文字を半角文字に変換したいのですが、過去ログを参考に require 'jcode.pl'; jcode::convert(\$value, 'euc'); jcode::tr(\$value, '0-9A-Za-z', '0-9A-Za-z'); としてみたんですがsjisにしないと文字化けするため、上記のあとの行に &jcode'convert(*value,'sjis'); をいれてみました。ですが全然変換されない状態です。 アドバイスあればお願いします。
40 :
nobodyさん :02/06/02 17:23 ID:QdZB4aXd
trとsはどこが違うんでしょうか?
41 :
39 :02/06/02 17:31 ID:QCpBS98O
ファイル文字コードをEUCで保存したらうまく変換されました。。 EUC以外の方法はないんでしょうか?
42 :
nobodyさん :02/06/02 18:04 ID:DhpOMnbM
43 :
もじら :02/06/02 19:07 ID:???
>>39 だからウィンユーザにmakeは不要なのです
私はウィンソック担当だからCGIのインタフェースを理解して
テスト環境を構築してるのです
手順だけわかればOKですので誰かつついてくれませんか?
>>39 シフトJISだとこうかなあ。
$_ = 'TBC個人情報3万件流出';
my @zenkaku = qw(
0 1 2 3 4 5 6 7 8 9
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m
n o p q r s t u v w x y z);
my @hankaku = ("\x30".."\x39","\x41".."\x5A","\x61".."\x7A");
my %table;
@table{@zenkaku} = @hankaku;
s/(\x82[\x4F-\x9A])/$table{$1}/g;
print;
>>40 trは文字単位の置き換え。
$str1 = $str2 = 'abc abz';
$str1 =~ tr/abc/ABC/d;
$str2 =~ s/abc/ABC/g;
print "str1: ",$str1,"\n"; # ABC ABz
print "str2: ",$str2,"\n"; # ABC abz
>>43 帰れ。
45 :
39 :02/06/02 19:42 ID:QCpBS98O
>>44 ありがとうございます。感謝です!
しかしすごいですねー。
もじらのコミニュケーション能力すげーな。採用担当者を尊敬するぞ。
my @hankaku = (0..9,'A'..'Z','a'..'z');
こうでよかったね。
>>44 のは関係ないのと混ぜちゃった。
48 :
39 :02/06/02 21:49 ID:QCpBS98O
わかったつもりだったんですがダメだぁコードの意味がわからないです。
>>44 のTBCがRABに変換される仕組みを作ってるのは
s/(\x82[\x4F-\x9A])/$table{$1}/g; この一行だと思うんですが
どうしてこれだけで変な変換されるのかわからないです。
まともに変換するためにはどうすれば良いのでしょうか?
また、このコードはどうやって調べてるのでしょうか?
49 :
ぎもじら :02/06/02 21:54 ID:???
>>45 社会人やったらこんな質問氏ねーよ
なんてか、質問かえます、Perlにソケット関数備えてますか?
ヨロシコ
もしかしてスレ違い・・・申し訳ありません。間違えますた。
53 :
nobodyさん :02/06/02 22:11 ID:vJY+ySFU
フォームから数値を入れたPOST送信しました。 そのときのcgiが受け取った数値は文字列として受け取るの?
54 :
! :02/06/02 22:23 ID:0rr9HH/y
>>48 うちだと上のままで動くから原因がわからん。
BCがABにずれるんなら、一文字ずれてるのかな。
コードは16進に変えてるだけ。検索すれ。
>>49 なんでさっきから一つズレてるの?
56 :
nobodyさん :02/06/02 22:30 ID:xW341CtX
58 :
ぎもじら :02/06/02 22:37 ID:???
ごめんね、マルチで でもわかりやすいHP情報助かりました
59 :
39 :02/06/02 22:46 ID:QCpBS98O
>>55 何度もありがとうございます。ようやくできました(TДT)
>>44 のをコピペしたときに my @zenkaku = qw(のあとにつづく部分の
改行をとったんですが、そのときに半角スペースを削ってしまってました。
その影響でTBCがRABに変換されていたようで、うちの地元のTVニュース番組で
RABてのがあって、これはいったいどういうことだろう?と思い。。。
関係なくてすみません。とにかくありがとうございました。
なんにしろ解決したならいいさ。
61 :
nobodyさん :02/06/03 00:08 ID:450OcSEV
perl5.6で、perlmodを参考にモジュール(Mymod)を作ってテストしてます。 それで、10000行の入力でdprofppを使ってプロファイルを取ってみると、 Mymod::BEGINが10000-20000回の間で呼び出されていて、 定義していないはずのmain::BEGINも10000回前後呼ばれています。 perlmodには「BEGINは1回だけ呼ばれる」と書いてあったと思うんですが。
63 :
nobodyさん :02/06/03 04:44 ID:zPDyt+6k
>>61 ソースみんとわからんけど。
BEGINブロックが複数あると、その数だけDProfはカウントするぞ。
あと「use Hoge;」は「BEGIN {require Hoge; import Hoge;}」に等しいから
useを使うごとにBEGINブロックが一個追加されることになる。
しかしカウント数が1万回にもなる理由はわからぬ。
64 :
nobodyさん :02/06/03 10:16 ID:9MQeJRCJ
log.datには5行データが書かれています。 cgiでデータを更新し、一番上(1行目)にデータを追加するのですが問題があります。 5行目のデータ(文字数)が長い場合、更新して新しいデータを追加したとき 古い五行目の余分なデータが新しい5行目のデータの最後に付いてしまっています。 open(FILE,"+<$filepath"); #処理は省略 pop @data;#6個目は削除 seek(FILE,0,0); print FILE @data; こんな感じでやってるのですが、最後のデータが大きいとデータが残ってしまいます。 どうやればいいのでしょうか。
>>64 seekする前にtruncate(FILE, 0);すれ。
66 :
64 :02/06/03 11:27 ID:???
ありがと! できました。 そんな関数truncateがあったとは。
67 :
nobodyさん :02/06/03 15:53 ID:UUcyKeQx
$ほが=~ s/x/x\/g; この方法で文字化けを回避しようするとエラーがでます。 エラーをださないようにするにはどうすれば?
>67 最初からeucを使う。
Perlで質問なんですが、 @letters 内の、重複した要素を削除する方法を教えてください。 よろしくお願いします。
>>71 perldoc -q "remove duplicate"
で定石が出てくる
>72 すいません、よく意味が分かりません・・ もう少し詳しく教えていただけませんか?
>>71 %mita = ();
foreach $youso (@letters) {
push(@newletters, $youso) unless $mita{$youso}++;
}
perlはsjisで書けよ。これ鉄則。
>>73 perlに必ず付いてくるperldocコマンドつーのがあってな。
シェルとかDOS窓のコマンドラインから
>>72 みたいのを入力するわけ。
すると-qの後に指定したキーワードに関するFAQが出てくる。
ただしキーワードは英語のみ。だから「重複した要素を削除」の
方法を知りたいなら「remove duplicate elements」で検索する。
>>75 鉄則というより、なにかの罰則ですねソレ。
78 :
nobodyさん :02/06/03 21:58 ID:wD1usRut
>>75 よく本を見ると、perlはeucで書けと書いてありますが、これはどういうことなのでしょうか。
私は秀丸で書いてるんですが、eucで保存すると、後で開いたときにすべて文字化けしてます。
「eucで書く」という行為自体がどうすることなのかよくわかりません。
みなさんeucで書かれてるんですか?
>>78 その他→動作環境→編集→文字コードの自動認識をする
サクラエディタでも使ってればぁ?(゚Д゚)
>>65 ,66
seek前にtruncateすると、printする前に異常終了した場合データが
吹っ飛ぶんで、print後にtruncateした方が良いと思う。
Cookbookのサンプルもそうなってるし。
seek(FILE,0,0);
print FILE @data;
truncate (FILE, tell(FILE));
close(FILE);
81 :
ぎもじら :02/06/03 23:47 ID:???
質問です ポスグレのDBIいれようとしたら c:\>ppm install DBI でインストできちゃった なんで? どんな仕組みになってるのかわかりません ヨロシコ
83 :
ぎもじら :02/06/04 01:04 ID:???
>>82 すばらしい
ようやくPerlからポスグレ操作できるようになりました
あとはC言語から操作汁予定です
truncateってPerl4で使えないのかよっ!
奇怪な動作が起こってしまい、困っています。 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}の部分が表示されません。 ソースは同じなので、原因がわからずに困っています。 どうか助けてください。
86 :
66 :02/06/04 09:27 ID:b8OuO/Ji
>>80 自分も調べてみたけど、そっちの方が安全性が高いみたいですね。
なんか、処理速度も速いみたいです。どうもです。
87 :
nobodyさん :02/06/04 11:32 ID:V54BnlXw
変数$Aの中に、$NO1.$NO2,$NO3・・・ という風に順番に数字を入れて処理を 繰り返したいのですがうまくいきません。どうか助けてください。変数の中に 変数というのは無理なんでしょうか? for($m=1 ;$m <= 9 ; ++$m){ &print($m); } ==================== sub print { my ($i) = @_ ; $A = "$NO$i"; #←この部分がやりたいことです print = $A; } 若輩者ですが、宜しくお願いします。
>>87 $A = "\$NO$i"; でいいのでは。って、こういうことじゃないのか?
ちなみにforの部分は、漏れはforeach(1..9)と書くのが好き。
>>87 ソフトリファレンスで $A = ${"NO$i"};
つーかハッシュ使えよ…
90 :
61 :02/06/04 13:01 ID:???
>>63 レスどうもでした。それと遅レスすいませんです。
tmon.outにはBEGINが数万回記録されていたのに、
BEGINにprint文を入れてみたら1回しか出力されなかったので、
DProfのバグということで落ちついてみます。
本当のところは知らないですが。
91 :
87 :02/06/04 13:09 ID:V54BnlXw
>>88 さん
>>89 さん
どうも有難うございました。まだまだ勉強不足ですので頑張ります!
>88 過去スレで出たんだけど、foreachよりもforの方がいいらしい。 foreach(1..9)だと、@_ = (1,2.3,4,5,6,7,8,9);みたいな一時配列を作ってから処理をするからメモリを食うんだと。 まぁ、この程度の数値なら差はないだろうけど、 for($i=0;$i<10000;$i++) foreach(0 .. 10000) くらいになると差が出るんじゃないかな?
93 :
61 :02/06/04 13:14 ID:???
ちょっと追加。。。 #!/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
>>92 過去のバージョンでは確かにそうだったが、
5.005の時点で最適化されたため、今や foreach(n .. m) の方が早い。
あやふやな知識は試してみてから外に出そうな。
>>92 それはPerl4とかの話でしょ。
今はもう一時配列作っていないから心配ないよ。
ちなみに0 .. 10000のほうが速い。ってperlsynに書いてある。
10分も経っているのにかぶった。スマソ。
>>93 すまんがわからん。さっぱりわからん。
俺も幾つか試してみたけど、まるで納得いかない結果になったよ。
多分どこかにバグがあるのは間違いないと思う。
>>93 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)と書いてあるから古いの使ってるんじゃないのか?
99 :
97 :02/06/04 14:22 ID:???
>>98 俺のは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++){}
>>97-98 レスどうもです。
ええと、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回呼ばれるだけだったです。
>94-95 それは知らなかった、サンクス。 もっとも、漏れのプロバのスペースはいまだにPerl4なんだけどな。(涙ッシュ
102 :
98 :02/06/04 14:50 ID:???
>>99 ActivePerl 5.6.1でやってみた。結果は異常。
>>98 はFreeBSD上の5.6.0。こいつのdprofppにActivePerlで作ったtmon.outを
食わせてみると、ActivePerlと結果同じ。 Devel::DProfのバグっぽい。
文字コードがs-jisになっている掲示板はCGIもs-jisで書かれてるんですか? 出力だけs-jisに変換してるんですか?
>>101 そんなISPやめてしまえ。きっとsuidperlの穴放置で特権取れる。
>>92 しかも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
おまけ。両方ともレキシカル$xを持つようにしてみました: 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% --
108 :
85 :02/06/05 09:40 ID:???
自己解決しました。 myで宣言してたのがいけなかったようです。 use strictをコメントアウトしたらうまくいきました。
>>108 おい、どこが"ソースは同じ"だよ…
それじゃ誰もアドバイスできなくて当然だろ!
perlで、パスワードを入力してログイン、ログアウトする機能は作れますか?クッキー使うんですか?
>>110 当然作れる。クッキーは使用してもしなくても作れる。
>>111 ん、じゃあどうやって、その人がログインしているのかどうかを判定するんだろ。。。。
んーーーーーーーー。
>>112 HTTPベースの技術でログオン、ログアウトの概念って非常に難しいと思われ。
114 :
nobodyさん :02/06/05 14:12 ID:O06am5wh
======2==C==H====================================================== 2ちゃんねるのお勧めな話題と ネットでの面白い出来事を配送したいと思ってます。。。 ===============================読者数:105420人 発行日:2002/05/030 どもども、風薫る5月ワキガも香るひろゆきですー。 今日はどうしても報告したいことがあるですよー。 東京地裁の顔になりつつある今日この頃ですが、最近裁判官がおいらを露骨に馬鹿にするですよー。 裁判を傍聴している人は既にご存知でしょうが、ついこの前は、おいらのことを 「あなたは売春クラブの経営者みたいな言い訳をしますね」 なんて言いやがったですよー。 どうやら売春クラブの経営者は警察に捕まると必ず 「出会いの場を提供しただけだ」 と、見苦しい言い訳をするらしいですよー。。。 そんなセコイ奴等とおいらを並べて語るとは悔しいけど、ストライクですー。。。えぇえぇ、、、 確かにおいらは企業や公人の誹謗中傷を禁止していませんし、削除もしません。 その上、「発信元は判らない」を看板とし、悪質な書き込みをし易い環境を提供し、いやむしろそれを売りにしようと目論んでいますが、そんなことはおいらのクチビルの厚さとは関係ないですよー。。。 ところで、中央大卒のおいらの同級生達がおいらのことを「宅八郎みたいな奴」と罵っているって本当ですか?。。。うぅうぅ、、、 んじゃ!
jcode.plのコードをコピペして組み込んでもいいですか?
>>115 ダウンロードする奴の80%に失笑を買われると思うけどね。
117 :
:02/06/05 19:54 ID:???
>>112 中途半端な質問だから一般的な回答をもらったのに、脳内変換するなよ。
ユーザ個別にという前提で聞いてないじゃないだろ。
その場合はユニークなIDとセットで行うのが普通だし、判定なんて
簡単な話じゃないの。
118 :
nobodyさん :02/06/05 21:36 ID:6v6pwQwJ
あほな質問かもしれませんが、任意の名前でファイルを作成する コマンドを教えてもらえないでしょうか? 私の調べた範囲ではわからなかったのでお願いします。
119 :
:02/06/05 22:02 ID:???
open
ahya.
122 :
nobodyさん :02/06/05 22:16 ID:6v6pwQwJ
ついでといってはなんですがidを???にする方法教えてください。
>122 メール欄にsage
cgiのソ−スを見られないようにする方法は?
>>125 見られたの?どうやって?
あまり無駄な心配しないほうがいいですよ。
128 :
:02/06/05 23:27 ID:???
このたび身の程もわきまえずNTサーバを立ち上げました。 内容は当方のデータベース内にある情報の中で、各人に必要なものを検索し、 見ていただくというものです。 データはCSVファイルになっております。 そこで質問なのですが、たとえばCSVファイルが 1列目はお店の名前 2列目は「とんこつ」または「しょうゆ」または「しお」 3列目はお店の所在地(都道府県) という具合に記述されているとします。 このとき当サイトを見た人が、チェックボックスの「東京」「とんこつ」 にチェックを入れて検索をかければ該当するお店がHTMLファイルに出力 されるようにしたいのです。 私はまず何から手を付ければよいでしょう? ちなみに恥ずかしながらプログラミングの知識はほとんどありません。 「そういうプログラムあるよ」とか「まずこの本買って勉強しなさい」とか 何でもいいですから情報をいただけるとありがたいです。
>>130 HPBにMe…
キタ━━━━(゚∀゚)━━━━ !!!
で、何を御所望?
まさか、この辺鄙な板の真っ当なスレまでネタスレに!?
>>131 ビルダーもMeでもないです。
あれは使いまわしなので古い内容ですね。
今はタグ打ち、XPプロフェッショナル/2000/NTの3機の環境です。
あ、自宅はMeですが、、、、
ネタスレ、ネタスレと言いますがネタじゃないです。
まじめに勉強しようと思ってますよ。
今、スレ一覧とかみてよいCGIサイトとか
お気に入りにいれました。参考にさせてもらいました。
ありがとうございます。
頑張って調べてそれでもわからなかったら力添えよろしくお願いします。
失礼します。
134 :
nobodyさん :02/06/06 08:56 ID:dEIJexyI
>>125 心配なら、ScriptAliasでdocumentrootの外に置くといいでしょう。
$a =~ /$b/ ↑こんな時、$b をリテラルとして扱う方法ってある?
>>133 ネタスレと言われるのは、単発で立てたからだろ。
まじめに勉強したいならしばらくは2ch外でお勉強した方がいいと思う。
質問するなら
>>1 の内容を5回くらい声に出してからしてくれな
>>135 ハァ?
まさか
$a =~ m'$b';
とか
$a =~ /\$b/;
とかしたいって意味じゃないよな。
そんなのどんなクソな参考書でも絶対載ってるもんな。
もっとちゃんと説明しねーとワケわかんねーよヴォケ、とだけ逝っておく。
>>136 ハッキリ言って、
>>137 みたいな質の低い解答者の答えしか載っていない過去ログなんて価値ねぇよ
140 :
138 :02/06/06 21:23 ID:???
>>139 俺は
>>135 じゃないけど?
俺が言いたかったのは、たまたま見た
>>137 の様な人間がなってないような
解答者しかいねぇなって皮肉ったって事。
まぁ、あれだ。井の中の蛙、五十歩百歩
と、収まったところで次の方どうぞ〜
以下の要点を抑えないとまともに答えてもらえないので注意ですよ。
>>1 > 1:自分はこう言う事がしたい。
> 2:それでこんな風にやってみたが・・・
> 3:それだとこんなエラーが出て上手く行かなかった。
めちゃめちゃアホくさい質問ですいませーん。 if ($a == 1) { &b } if ($a == 2) { &b } if ($a == 4) { &b } これを短くするにはどうすればいいですか??m(__)m
>>144 悪いことは言わない、良書買って勉強しろ。
&b if ($a == 1 or $a == 2 or $a == 4);
146 :
144 :02/06/06 22:42 ID:???
>>145 さんありがとう!
がんばって勉強しまーす。m(__)m
147 :
nobodyさん :02/06/07 02:26 ID:AfwvfL8+
あが
148 :
nobodyさん :02/06/07 04:15 ID:IzDclSQv
投稿内容に適度に改行が含まれているかどうか判定する サブルーチンを作りたいんですが今の知識では書けませんです。 ちなみに仕様上、tableで囲うとかしたくないのです。 ちなみに改行は\rでやっております(どうでもいいですか)。 投稿内容のバイト数をチェックして その中の\rの数を出して 何文字か毎に割ればいいように思うんですが… もし良ければ教えてくらさい
>>148 >適度に改行が含まれている
んなファジーに「適度」いわれてもわからんのじゃゴルア。
tableで囲いたくないつーと、1行の文字数は不定つーことかな?
1行の文字数ってか横幅を固定せずに「適度な改行」を判定するなんてこた、
おそらく不可能だと思うが。もすこし詳しく条件を述べたまへ。
150 :
148 :02/06/07 05:35 ID:IzDclSQv
えと、想定してるイメージなんだけど 改行符(\r)無しで○○文字以上文字が続いていたらエラー、という 式を書きたいわけです。 ちなみにたったいま $comment =~ s/(.*)\r/$1\r/ig; $oneline = $1; return $oneline; で、$onelineが>100だったらエラー、というのを書いてみたんだけど 上手く機能しませんでした この100って数字は適当なんでどうでもいいです。 要はこの数字がtableで言うところのwidthの役割にはなるかなと 思ったんですが駄目かなぁ
151 :
nobodyさん :02/06/07 05:43 ID: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") にするとうまくいくんです…。 参考書に書いてある優先順位の意味も分からないし…。 宜しくお願いします。
>>150 100文字ごとにbr要素ぶちこんで改行するとかでどうじゃろ?
それならPerlメモ(
>>3 見れ)にある
日本語を特定の長さで折り返す方法が参考になった記憶あり。
>>151 おなじアンド演算でも、
&& と || だったら、&&をに計算、次に||を計算する。
and と || だたら、||が先で、次にandを計算する。
こういうふうに、どっちが先に計算されるかってのが優先順位だよ。
わからなかったらカッコ使え。
言葉の使い方解らない質問者&解答者多過ぎ。なんで、part13 建ったのか不思議だな。
>>150 >改行符(\r)無しで○○文字以上文字が続いていたらエラー
簡単に○○バイトで。
print "Error\n" if $comment =~ /[^\r]{10,}/;
嫌なら152の人の示したリンクに飛んでみるとか。
>>151 もし使えるのだったら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;
}
156 :
nobodyさん :02/06/07 09:54 ID:5iJQJUx6
>>154 まあ凝るならchasenを使って文節のきりのいいところで
改行するということで。
>>151 あと文字列と==を混ぜるのはやめとき。
print "equal!\n" if "a" == "0";
==は数値、eqは文字列。まぁ151のコードだととりあえず関係ないけど。
>>155 些細なことだが、"閏年かどうか"は
引数の月が二月であるかどうかとは無関係だろ?
ついでだからもっと単純に実装してみる
これは
"yearが4で割り切れる、かつ、$yearが100で割り切れない
または、$yearが400で割り切れる場合、真を返す"
と読む
sub leap_year
{
my $year = shift;
return $year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0;
}
PerlMagickを使ってGIF画像のリサイズをしたいのですが、 コマンドプロンプトからは動作するのに、ブラウザからは 動作しません。 #### ソース #### 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
161 :
nobodyさん :02/06/07 13:16 ID:JHi9xs8B
質問なんですが。 フォームの内容を、フォームとsubmit ボタンを2つづつ使って、 別々のcgiに選んで渡すことはできるんでしょうか? form1 form2 内容 submit 1 submit 2 みたいな感じで、できるとうれしいのですが。
162 :
nobodyさん :02/06/07 13:19 ID:O+HWTyLI
163 :
nobodyさん :02/06/07 13:23 ID:JHi9xs8B
>>162 name 属性をそれぞれそろえても駄目ですよね?
具体的な方法を教えてもらえると、とてもうれしいです
164 :
nobodyさん :02/06/07 13:26 ID:O+HWTyLI
あ、ネストしてるんですね。ごめんなさい、できないっす。
>161 JavaScript使え。
>>166 何だ、その態度は。
JavaScript なら板違いだ。
168 :
161 :02/06/07 13:46 ID:JHi9xs8B
>>167 いちお言っておきますが。166は私ではありません。念のため・・・。
>166 >163では>162に対するレスとしてその方法を聞いてるように見えたから>165では>161へのレスとしてああ書いた。 そして>167の言うように板違いだから詳細には触れなかった。
解答者は人間やり直せ。
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。 1:自分はこう言う事がしたい。 2:それでこんな風にやってみたが・・・ 3:それだとこんなエラーが出て上手く行かなかった。 1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。
>>161 こんな感じ。
確かに板違いだが、今後同じ疑問をもつ人もいるだろうし
ぐちぐちいうぐらいなら、やり方教えてやったほうが早い。
<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>
173 :
166 :02/06/07 14:36 ID:???
>>167 板の事忘れてたスマソ
でも、それなら質問自体がイタチ害でわ?
すべての1バイト文字と2バイト文字を配列にしたいんだけどどうすればいいの?
>173 「Perlでできますか?」と聞いてるから問題はない。 「JavaScriptならできるから、そっちで聞け」と答えているなら、それも間違いではない。 「Perlではできない」とだけ答えるよりむしろ親切。
>>172 無駄。どうせ、質問者は過去ログなんて見ない。
>>174 $EUC_JP_ = '[\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE]';
@chars = ($str =~ /($EUC_JP_)/g);
よくわからんがこういうことかな?
179 :
nobodyさん :02/06/07 23:13 ID:VaB1Xovq
perlのデバッグはどうすればいいんでしょうか・・・ Delphiのような総合開発環境がないので、どこが悪いのか探すのだけで直ぐ数時間ふっとびます・・・ 効率のいい手法などあるのでしょうか?
180 :
nobodyさん :02/06/07 23:28 ID:zKprkcjg
>>179 古典的だがprintデバグ(wara
dieとか使えばデバグが楽になるらしいよ。
>>179 まずは
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 # オプティマイズの様子を見る ただしかなり不完全
ざっと見てこんなもんかな。
open() or die の定番処理で、dieのところで複数の処理を入れた かったんで実験したら、コンマで繋ぐと上手く行くことがわかった。 例:open() or print "エラーしますた\n", return; このコンマの意味って、Perl的にどういう意味?
>>183 コンマ演算子は式を左から順に評価し、最も右の式の値を返す。
voidコンテキストだと単に左から順に式を評価するだけ。
print("a"), print("b")
これはprint("a")を実行した後、print("b")を実行せよ、ということ。
ただし
>>183 は少し違う。
この場合はprintを"エラーしますた\n"とreturnの返り値の二つの引数で呼び出している。
ただしreturnは値を返さず呼び出し元に戻るから、"上手く行く"はずはないんだが…
185 :
age :02/06/08 00:49 ID:???
10ずつ上げるカウンターを作ってるんですが $count++; の時は1ずつ上がっていたのに $count+10; にすると10ずつ上がるどころか全くカウンターが変わりません、 何かやりかたあるのでしょうか?
>>184 即レスどうもです。ラクダ本のコンマ演算子は読んだんですが、
左から順に評価し、は、実行すると言う意味なのね。
ちなみに、昨日の事を記憶で書いたので、今見直したら return
じゃなくて print, redo LABEL;でした。return は実験したか
記憶に無い。鬱
188 :
age :02/06/08 02:15 ID:???
189 :
nobodyさん :02/06/08 11:45 ID:R0Gdpaab
掲示板スクリプトでリモートホストを取得したいのですが 何をやってもIPアドレスの方が取得されてしまいます。 $host = $ENV{'REMOTE_HOST}; これ一行だけにすると、何も取得出来ず・・・。 サーバがそういう設定にしているのか・・・。 どうすればいいのでしょうか?
>189 サーバーの設定によっては使えない。
191 :
nobodyさん :02/06/08 11:48 ID:R0Gdpaab
>>190 返答ありがとうごさいます。
今使っているところは米tripod、あそこはダメか・・・
>>189 if ( $ENV{'REMOTE_HOST'} ne '' ) {
$host = $ENV{'REMOTE_HOST'};
}
else {
$host = $ENV{'REMOTE_ADDR'};
}
193 :
nobodyさん :02/06/08 11:58 ID:R0Gdpaab
>>192 そのように設定して、自分のリモホを見たら
10.10.17.178とか表示されました・・・。
どこのIPだ。しかも表示させたいのはリモートホストだし。
tripod逝ってよし
194 :
nobodyさん :02/06/08 12:03 ID:R0Gdpaab
KENTさんの掲示板で試してみても同じ結果だ。 これはサーバの設定だな。 tripodは諦めます。
iswebとかトクトクでもダメだった記憶が。。 XREAなら gethostbyaddr 関数でホストが取れたと思う。
掲示板の検索部分を改造しようと思い半角カナ−>全角カナはjcode.plで出来たのですが 全角カナ−>ひらがなへの変換は出来ないのでしょうか?だれか教えて下さい。
197 :
nobodyさん :02/06/08 14:43 ID:JsVHaVnY
$host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq "" || $host eq "$addr") { $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); } if ($host eq "") { $host = $addr; }
>>196 jcode.plならtr関数が使えたと思う。
jcode::tr(\$str, 'ァ-ン', 'ぁ-ん');
もしかしてShift_JISには未対応だったかも。
だめだったら自分で変換用のハッシュでも定義して変換しる。
199 :
196 :02/06/08 16:52 ID:???
>>198 返答ありがとうございます。
jcode.plのソースには「Code must be JIS or EUC」とあったので
&jcode'sjis2euc(*ss);
&jcode'tr(*ss, 'ァ-ン','ぁ-ん');
&jcode'euc2sjis(*ss);
こう記述したのですが無理でした。
もしかしてとんちんかんな事を書いてますか?
>>199 'ァ-ン', ぁ-ん'の部分もEUC-JPであるとしたら、正直お手上げです。
>>196 199+200の考えでいいと思いますよ。
'ァ-ン', 'ぁ-ん'をEUC-JPの文字コードで書けばいいんじゃない?
&jcode'tr(*s, "\xHH\xHH-\xHH\xHH", "\xHH\xHH-\xHH\xHH");
HHのとこは16進の文字コードで。
202 :
nobodyさん :02/06/08 19:18 ID:Z1wnMQCd
if (($sec eq "1")or($sec eq "2")or($sec eq "3")){ 上の"1" "2" "3"を一つの()内にまとめる書き方ありますか?
>>202 簡単な方法は、無い。
1,2,3...が多い場合は、ハッシュを使えば若干パフォーマンスは上がるかもね。
use constant true => 1;
%tbl = (
1 => true,
2 => true,
3 => true,
);
if($tbl{$x}){ ... }
204 :
196 :02/06/08 19:51 ID:???
>>201 有り難うございます。早速やってみたところ
カタカナとひらがなを相互に変換してしまいます。
カタカナはひらがなへ、ひらがなはそのままにしたいのですが…
&jcode'sjis2euc(*ss);
&jcode'tr(*ss, "\xa5\xa1-\xa5\xf3", "\xa4\xa1-\xa4\xf3");
&jcode'euc2sjis(*ss);
月に2回定刻に起こる条件をifで表したいのですが 第2土曜7時、みたいな感じで・・・
206 :
:02/06/08 23:21 ID:???
$sec =~ m/^[123]$/
なんであーんあーん逝ってるんですか? 悶えてるんですか? ハァハァ・・・・
209 :
151 :02/06/09 00:47 ID:???
モジュールなどは使用しないで、ファイルをアップロード出来るフォームを作りたくて、 サンプルなどを見て研究していたのですが、仕組みがよくわかりません。 ファイルを指定する→送信ボタンを押す→指定したフォルダにファイルが保存される という一番シンプルなソースコードを、どなたか示していただけませんでしょうか。
質問なんですが、CGIの置き方自体が判らないのです DL・解凍したのはいいのですが、どうすればいいのでしょうか?
コマンド上から"a.exe start"と入力すると "3 + 5 は?"などと返し、 続いて"8"を入力すると"正解"と返すa.exeがあるとします。 このa.exeをPerlスクリプトから 実行するにはどのようにするのでしょうか?
>212 配布元サイトで聞く。 大体は配布場所に書いてあるだろう。 少なくともこのスレで聞くのは間違い。
216 :
nobodyさん :02/06/09 21:05 ID:TDG2uPpc
始めの一歩と思いカウンターを作って見たんですが、おかしな所が2箇所程あります。 1.ロック処理 カウントファイルを参照できない場合ロックしたまま解除しない。 2."$count_file"を、うまく参照しない。 例)$count_file = "./count.dat"; OK $count_file = "dat/count.dat"; NG ################################################### sub count { #-日時 &form_decord; #-ホスト &get_HostAgent; #-バックアップ用のファイルを開く open(IN,"$count_file") || &error("カウントファイルエラー"); $ac_data = <IN>; close(IN); ($ac_count,$ac_ip,$ac_today,$ac_yes,$ac_day) = split(/\t/, $ac_data); #今日/昨日のアクセス数の設定 if ($mday ne $ac_day) { $ac_yes = $ac_today; $ac_today = 0; } #-ロック開始 &lock1;
続き #-2重カウント許可 if ($bak_ip){ $ac_count = $ac_count + 1; $ac_today = $ac_today + 1; } #-不許可(IPアドレスで判断) elsif ($ac_ip ne $Addr) { $ac_count = $ac_count + 1; $ac_today = $ac_today + 1; } #-ファイルに書き込む open(IN,">$count_file") || &error("カウントファイルに書き込むことができません。"); print IN "$ac_count\t$Addr\t$ac_today\t$ac_yes\t$mday"; close(IN); #-ロック解除 &lock2; } どこがおかしいでしょうか??
>217-218 ロックに問題があるのに、その部分のサブルーチンは出さないわけ?
まず、これがオカシイな… 【リテラル】で指定しよう $count_file = './count.dat'; OK $count_file = 'dat/count.dat'; OK
>219-220 $count_file = './count.dat'; これが原因でした。参照できない場合でもerror後ロック解除できました。 アリガトウございます
今までファイルロックなんてしなくてもファイル壊れたことないんですけど、 壊れることってどれくらいあるんですか?
>224 運次第。 あと、人気次第。 要するに「同時アクセスが発生するか否か」の問題だから、運が悪ければ たった二人の来客でもファイルが壊れるし、運がよければ数兆のアクセスが あっても壊れない。 しかし、アクセスが多ければ確率的にその事故は起こりやすくなる。 ついでに言うと、コーディングの話じゃないからスレ違い。
226 :
151 :02/06/11 03:57 ID:zdO5gL3p
>>155 さんや
>>158 さんが新しい問題をくださいまして、またどうしても分からな
くなったので質問です。
今回は『return』についてです。
$year = "2000";
$month = "2";
@MONTHS = qw/0 31 28 31 30 31 30 31 31 30 31 30 31/;
$MONTHS[$month] = &feb($year, $month);
print "$MONTHS[$month]\n";
sub feb {
my ($year, $month) = @_;
if ($month == "2" and &rule($year, $month)) { return 29; }
else { $MONTHS[$month]; }
}
sub rule {
my $year = shift;
return (($year%4) == "0" || ($year%100) != "0" and ($year%400) == "0");
}
サブルーチンからのreturn返り値はどこに戻るのでしょうか。
とりあえず出力するために$MONTHS[$month]に代入することにしましたが、もっ
とシンプルな方法はあるんですか?つまり3行目に示したように代入する先を
$MONTHS[$month]と指定しなくてもよい$_のような特殊変数があるとか…。
また、
>>155 さんは以下のようにreturnを三つも使っておられますが、この文だ
と結局閏年であってもそうではなくても返り値は0、すなわちこの処理の場合は
常に『偽』が返ると思うのですが、間違ってますか?
sub leap_year {
my( $year, $month ) = @_;
if( $month == 2 && $year % 4 == 0 ) {
if( $year % 100 == 0 ) { return $year % 400 == 0;}
return 1;
}
return 0;
}
>>226 > 常に『偽』が返ると思うのですが、間違ってますか?
return $year % 400 == 0; は、まぁ置いといても、
return 1; を無視するのはなぜ?
なんで、文字列比較に == 比較演算子使ってるの?
>>226 >return返り値はどこに
&feb($year, $month); と &rule($year, $month)のトコ
>シンプルな方法
print feb($year, $month);
>returnを三つも
returnで返した時点でサブルーチンはオシマイ
>225 丁寧にどうもありがとうございます。。 スレ違い。。確かにそうですね、今後気をつけます。。
>>151 間違ってます。
前に書かれたけど、月の値は意味がないからそれさえ省けば
ちゃんと閏年を返すよ。
## まず月を抜かして・・・
sub leap_year
{
if( $year % 4 == 0 ) {
if( $year % 100 == 0 ) {
return $year % 400 == 0;
}
return 1;
}
return 0;
}
foreach my $year ( qw/ 1900 1940 1980 1995 2000 2002 2004 / ) {
print "$year = ";
print leap_year($year) ? "leap year\n" : "NOT leap year\n";
}
$ENV{'REMOTE_ADDR'} = $env{'remote_addr'} としても使えますか?
236 :
:02/06/12 11:39 ID:R7g7sR2X
jperl5+IIS5.0+SSLな環境でファイルを アップロードさせたいのですが、 6KBぐらいの小さいファイルだとアップ できるのですがそれ以上大きいのだと アップロードできず、IEだと「ファイルが 見つかりません」のエラーになります。 # ちなみにSSLでなくても120KBまでしか # だめなようです。 同じような問題にあたった方いらっしゃいますか?
237 :
nobodyさん :02/06/12 16:38 ID:NJerhR65
perlについて質問です。 月の最後の日が簡単に分かる関数がありますでしょうか? ありましたら教えて頂きないでしょうか? また、ない場合は、一番サーバーに負荷を掛けずに(軽い)同じ動作を させるにはどうすればよいか教えて頂けないでしょうか? 自分なりにも考えてみました。 for ( $i = $mday ; ; $i++ ) { ( $k_sec , $k_min , $k_hour , $k_mday , $k_mon , $k_year , $k_day ) = localtime( time + $i * 24 * 3600 ); if ( $k_mon != $mon ){ last; } }
238 :
237 :02/06/12 16:40 ID:NJerhR65
追加です。 うるう年は、考えることとします。 そうでなければ、31日の月と30日の月、28日の月と3つに分けてしまえば 簡単にできてしまいます。 よろしくお願いします。
>237 まず、うるう年をどうするか。 はっきり言って、配列にでも月ごとの日数を入れるのが一番軽い。 @monthday = (0,31,28,31,30,31,30,31,31,30,31,30,31); これにうるう年の処理を加えるだけ。 わざわざスクリプトに計算させる必要性はあるのか? 宿題とか?
>238 じゃあ、うるう年をどう考えるのか。 今年の2月の日数で求めるのか。 去年の2月の日数を求めるのか。 指定した年の2月の日数を見るのか。
241 :
237 :02/06/12 16:43 ID:NJerhR65
>>239 どうもです。
その月の最後の日(日数)を知ることができる関数が知りたかったです。
それがあれば、一番簡単ですから・・・。
でも、ないようですので、
>>239 の方法が一番よいようですね。
242 :
237 :02/06/12 16:45 ID:NJerhR65
>>240 「今」の月の日数を知りたいです。
あと、用途は、プログラムを組んでいて、月の最後の日の23時〜24時だけは
違う画面を表示させるというものです。
@monthday = (0,31,28,31,30,31,30,31,31,30,31,30,31); $day = $monthday[$mon]; if($mon == 2 && $year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0)){ $day = 29; } print qq($year $mon/$day<br>\n); 関数はないからこれが一番簡単かな? しかし、>242のいうのならもっと簡単。 ( $k_sec , $k_min , $k_hour , $k_mday , $k_mon , $k_year , $k_day ) = localtime(time); @localtime = localtime(time+3600); if($localtime[4] != $k_mon){ print qq(違う画面); } 月の最後の1時間を判定するだけなら、これで十分じゃない?
244 :
237 :02/06/12 17:09 ID:NJerhR65
245 :
:02/06/13 00:15 ID:N23nK9SF
あるメールマガジン発行CGIをダウンロードして設置してみました。 ところが、デフォルトの登録ユーザーファイルが、usr.datという名前になっていて、そのファイルを決め打ちでアクセスすると、登録している人のemailアドレスが見れてしまうのです。 外部から見れないようにしたいのですが、そのCGIの説明書では、パーミッションは666にしろ、と書いてあります。 660ではだめなのでしょうか。 それか、ファイル名をaoeriuyba8.datとか、暗号のような名前にすればいいかもしれませんが、探検君とかで見つかりそうな気がします。
>245 拡張子を.cgiにしとけ。
いや、そもそも Perl の話題じゃないんだYO! とりあえず設置鯖の仕様(.htaccess可?)を確認しろや 続きは適切なスレでやれ
248 :
151 :02/06/13 04:13 ID:???
151です。
ヒントを下さった
>>227 『exit』と同じようなものと教えてくれた
>>229 例を示してくださった
>>231 returnの機能のついでに、評価式の作りかた、それによる分岐のさせかたまで勉
強できました。
後は閏年の数字の関係です…。
400が絡むということは必ず100で割り切れるということだから…
うーん。
この辺は自分で解決します。
ありがとうございました。
質問です。 一時ファイル(./tmp/*.tmp)を全削除するのに、 opendir(DIR, "./tmp/"); while ($filename = readdir(DIR)) { if ($filename =~ /\.tmp$/) { unlink("./tmp/$filename"); } } としてみたが、同じ事を Taintモード下で実現する方法ってありますか?
詳しくしらないのだが$filenameを正規表現でキャプチャすれば いいんじゃないの? if( $filename =~ /^([^.]+\.tmp)$/ ) { unlink( "./tmp/$1" ); }
251 :
249 :02/06/13 11:36 ID:???
>>250 ありがとうございます!勉強になりました。
252 :
nobodyさん :02/06/13 23:27 ID:gf2d6vJq
$s =~ s/[^\.-z]/\./go; と $s =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/; って、どういうことをしているんですか? 教えてください。
253 :
◆hRKFl5jU :02/06/13 23:32 ID:gf2d6vJq
あ
254 :
レス :02/06/14 00:21 ID:nWmgmUzW
すみません。cgiMLの方で質問していたのですが。 よく分からないのでここでも質問させてください。 掲示板のレス機能のアルゴリズムについて考えていました。 レスをスレに追加して、そのスレをトップに持っていく処理です。 最適な方法やスマートな方法がありましたら教えてください。 ・以下、現在考えているアルゴリズムです。 #ターゲット親記事番号 $targetnum = 1; #テスト用書き込みレス記事 [記事通し番号,レス件数] $value = "9,0\n"; my @lines = <DATA>; #レスを書き込み後スレッドをトップに持っていく $linecnt = 0; foreach(@lines) { ($num,$resnum) = split( /\,/, $_ ); if ( $targetnum == $num ){ @sure = splice( @lines, $cnt+1, $resnum ); $resnum++; unshift( @sure, "$num,$resnum\n" ); push( @sure, $value ); unshift( @newlog, @sure ); $linecnt = $linecnt+@sure; }else{ push(@newlog,$_); $linecnt++; } } print @newlog; __DATA__ 3,2 6,0 8,0 1,2 4,0 7,0 2,1 5,0
255 :
レス :02/06/14 00:22 ID:nWmgmUzW
ごめんなさい、長すぎました。
>>254 すべてのレスを1次元配列@linesに入れてガリガリ処理すると
面倒だし、スクリプトも読みにくいと思う。
レスの配列=スレッド、スレッドの配列=掲示板全体
というデータ構造に直すといいんじゃないか。ちょっと書いてみた。
use strict;
my $targetnum = 1;
my $value = "9,0\n";
# ログを読む
my @threadarray;
my %index_of;
while (my $line = <DATA>) {
my ($num, $resnum) = split(/,/, $line);
$index_of{$num} = scalar(@threadarray);
my $thread = [$line];
push(@$thread, scalar(<DATA>)) while (--$resnum >= 0);
push(@threadarray, $thread);
}
#目的のスレッドを切り出し、レスを追加し、配列の先頭に移動
my $thread = splice(@threadarray, $index_of{$targetnum}, 1);
push(@$thread, $value);
my $resnum = (split(/,/, $thread->[0]))[1] + 1;
$thread->[0] = "$targetnum,$resnum\n";
unshift(@threadarray, $thread);
# 出力
foreach my $thread (@threadarray) {
print "-----\n";
foreach my $res (@$thread) {
print $res;
}
}
257 :
254 :02/06/14 07:35 ID:nWmgmUzW
>>256 さっそくありがとうございます。
ソースまで示してくれて感謝。
早速、トレースして理解してみます。
ところで、ログを変更してもいいとしてもこの方法がいいと思いますか?
掲示板には全然手をつけていないので、今ならログ変更はいくらでもOKです。
>>257 そのログ形式(
>>255 )だと、「レスのない親記事」と「レス」は
どっちも$resnumが0になるような気がするが
どうやって区別すんの?
259 :
レス :02/06/14 09:31 ID:AMkrWmqx
>>258 おっ指摘してくれてありがとう。
確かに、区別できないですね。
じゃあ resnamは、親記事自体の番号も含めてってことでおねがいします。
>>257 とりあえずその方法で突き進んで、問題あったら変更すればいいんでないの。
そのためにはログフォーマットに依存するコードは極力書かないようにしる。
行をsplitする生のコードをそこら中にちりばめたりすると、後で泣くこと必至。
261 :
nobodyさん :02/06/15 01:14 ID:4GLBjH4I
>261 設置場所のディレクトリ構造は?
263 :
261 :02/06/15 01:39 ID:4GLBjH4I
>263 なるほど、、、。 まず、cgi-bin 以下には CGI および データファイルを置くようにしてみてください。 それ以外は、public_html にすべていれるという形態になるのが普通です。
265 :
261 :02/06/15 01:58 ID:4GLBjH4I
>>264 cgi-binフォルダの中にはimgboard.cgi,file.dat,fileback.dat,icon.dat、
public_htmlフォルダの中にはjcode_sj.pl,imgsize.pl,index.htmlおよび画像保存用ディレクトリimg-boxフォルダを
置くというかたちになるんですか?
266 :
264 :02/06/15 02:02 ID:???
たった今、落として確認してみたら、この index.html ってのは ディレクトリインデックスの隠し用だったようなので すべて cgi-bin の中で問題ないようです。
267 :
261 :02/06/15 02:11 ID:4GLBjH4I
どうやらTripodがくせもので、
>>264 「なお、画像は、セキュリティー上の理由から、cgi-bin以下におくと表示されませんので、
必ずTripod内のcgi-bin以外におくようにしてください。」
ということで、画像保存用ディレクトリimg-boxをcgiと同じ場所に置かず、
投稿画像の格納ディレクトリ($img_dir = './img-box'; # デフォルト位置)を変更しなきゃならないようなんで、
($img_dir = '/public_html/img-box'; # デフォルト位置)に変更したんですがうまくいきません。
cgiは機能してるんですが、画像がアップロードできません。
img-boxフォルダの中をのぞいても何も入ってませんでした。
268 :
264 :02/06/15 02:20 ID:???
ざっとスクリプトに目を通してみましたが、たったこれだけの掲示板で 6300 ステップもあったのでゲンナリしました。 まず、画像の表示は単純に imgタグに直接画像パスを書く方法を採っている ので HTML と CGI の置き場所が別になっているタイプのサーバではこのまま では動きません。
269 :
261 :02/06/15 02:25 ID:4GLBjH4I
270 :
264 :02/06/15 02:26 ID:???
おそらく 167行目を以下に書き替えればいけると思います。 $img_dir = '/ユーザ名/public_html/img-box';
271 :
261 :02/06/15 02:43 ID:4GLBjH4I
>>264 だめでした(爆)。サーバー側の問題?
配布されたcgiに「場所の指定方法は通常は相対パスで指定して下さい」とあったので、
ユーザー名は必要ないのかな?
272 :
261 :02/06/15 02:45 ID:4GLBjH4I
>>264 絶対パスで正解でした。スマソ。
<以下配布されたcgiより>
あなたのプロバイダが、cgiとデータファイルを同じ場所に置くことが出来ない
特殊なプロバイダ(hi-ho等)で、cgiと同じディレクトリやcgi直下に保存
用ディレクトリを作れない場合、絶対パスによる指定が必要となる場合があります。
この場合、5行ほど前にある$img_dirを絶対パス*指定に書換えて下さい。
273 :
nobodyさん :02/06/15 02:48 ID:mydlqxE+
GD.pmなどのモジュールをインストールするっていうのは、そのサーバの管理者じゃなきゃできないんでしょうか? それともディレクトリにアップロードするだけでいいの?
274 :
264 :02/06/15 02:55 ID:???
そしたらダメもとで以下を試してみては? おそらく imgタグで .. がNGになる可能性あり。 $img_dir = '../public_html/img-box'; または ソース内で img-box の存在チェックをしているのでWWWサーバのマウントポイント からの相対パスを使えないのでダメもとでサーバのディレクトリ構造を推測して以下 のように書けばOKかも。 $img_dir = '/home/ユーザ名/public_html/img-box';
275 :
264 :02/06/15 03:02 ID:???
>273 モジュールって使ったことないけど以下を書いてもダメ? BEGIN{ unshift(@INC, '.'); };
276 :
261 :02/06/15 03:07 ID:4GLBjH4I
>>264 ダメでした…。
HTMLとCGIの置き場所が同じサーバー探します。
夜遅くまでご親切に、こんな初心者にお付き合いいただきありがとうございました。
すごく勉強になりました。
>>273 *.pmだけで完結してるモジュールは、275の方法でいけるんすけどね。
GD.pmの場合はバイナリコードを作らなきゃあかんかったり、
サーバにないかもしれないライブラリ(libjpeg.soとかlibpng.soとか)を
いろいろ必要とするから、モジュールだけアップロードしても99%駄目。
278 :
レス :02/06/15 07:31 ID:/CDsyhKP
>>260 うんありがとう。
そうですね、splitを多発すると変更がめんどくさいので出来るだけ少なく作ります。
ログの変更を簡単に出来るように考えてつくろう。
また、質問することがあるかもしれません、その時はよろしくおねがいします。
279 :
nobodyさん :02/06/16 08:10 ID:z5KHLw2y
掲示板ぽいものを作ってるんですが、 にちゃんねるみたいに「Shift_jis使ってちょ」ってやりたいんです で、何も考えずにjcode.plのgetcodeを使ったら、 「(´・ω・`)ショボーン」をeucと認識してしまいました・・・(´・ω・`)ショボーン 半角カナが混じってても、きちんとShift_jisと認識してやるにはどうすればいいでしょうか? Shift_jisかどうかが分かればいいです。 EUCで書かれた「汐涙維」をShift_jisと誤認識してもいいです。 # '汐涙維'(EUC) eq 'ショボーン'(SJIS) よろしくおながいします
>>279 おれはjcode.plのgetcode関数をちょっと書き換えて
Shift_JISの文字数カウントに半角カナも含めてるよ。
$sjis += length($1) while /(($re_sjis_c)+)/go; #オリジナルのjcode.pl
↓
$sjis += length($1) while /(($re_sjis_c|$re_sjis_kana)+)/go; #修正版
EUC-JPをはねずに通す確率がめたくそ増えるけど気にしない。
あえてShift_JISを使う代償だと思ってあきらめてる。
281 :
nobodyさん :02/06/16 10:16 ID:z5KHLw2y
>>280 なるほど、これはいいですね。
助かりました。
どうもアリガトウ
282 :
nobodyさん :02/06/16 22:36 ID:Us0jeEkd
#!/usr/local/bin/perl print "Content-type:text/html\n\n"; $xx = "abc"; $yy = "def"; if ( あ eq あ ) { print $xx } else { print &yy } このようにしても$xxは表示されないのですが、 あ と あ を比べる方法ってありますか?
284 :
nobodyさん :02/06/16 22:43 ID:Us0jeEkd
いや、マジやねん
>>284 #!/usr/local/bin/perl
print "Content-type:text/html\n\n";
$xx = "abc";
$yy = "def";
if ( 'あ' eq 'あ' ) {
print $xx;
} else {
print $yy;
}
abc って出ましたが。
286 :
nobodyさん :02/06/16 23:01 ID:Us0jeEkd
>>285 あぁ〜文字列はシングルクォーテーションで囲ったらイイんですね??
ありがとうございます!
でも あ を a に変えると囲まなくてもいけるみたいですがなぜでしょう??
aも文字列のはず、、、、
287 :
nobodyさん :02/06/16 23:31 ID:z5KHLw2y
>>284 ''か""で囲まないと文字列じゃないぞ・・・
288 :
nobodyさん :02/06/17 00:35 ID:9jM4ZJCT
289 :
nobodyさん :02/06/17 01:01 ID:rACyARGq
290 :
hoge :02/06/17 04:03 ID:aKd0pgn8
sub MOE { "sakura" } print MOE, "\n";
>>286 ぐーぐるさんに聞いて見れば?キーワードはbarewordとperl。
ていうかおれもPerlのbarewordの扱いについてはよくわからn。
Perlは「自分の知らない識別子」をクォートされていると解釈するんだよ。 $foo = bar; $baz = bar::bax; print $foo, $bar; だが"sub bar;"やsubsなどで前方宣言されているとこれらはサブルーチンと見なされる。 use strict 'subs'を使うとこのような裸のワードに対して致命的エラーを発生させられるよ。
>>292 にもう少し足すとuse strictしててもハッシュキーと=>は特別:
use strict;
my %hash = ( foo => 'bar', baz => 'gad' );
print $hash{ foo }, "\n";
$hash{ baz } = 'boo';
ハッシュキーは基本的に[a-z0-9_]を使ってる限りクオートする
必要はない。また => を使うと、左側のbarewordは自動的に
文字列に変換される。
Perl6で撤廃か。まぁ妥当だね。
296 :
nobodyさん :02/06/17 21:33 ID:8ZfnaOKh
簡単なスクリプトでテストしてみても読み書き両用でファイルが開けません。なぜでしょう? Windows上では使えないのでしょうか? ↓ open(FILE, "+>$file"); 環境はWin2000+Apache1.3.24です。
>296 なにが上手くいかないの? 同じ環境できちんと動くけど。 まさか保存されてるファイルが読み出せないとかじゃないよね? だって最初に初期化してから書き読みモードで開いているんだから。 読み書きモードじゃなくて。 開けないって言ってるから、openが失敗してるんだよね? ファイルの作成もできないんだよね? そうだよね?
299 :
296 :02/06/17 21:49 ID:8ZfnaOKh
たとえばこんな感じにしてもファイルは作成されるのに空のファイルなんです・・。 A A 予想ではAが縦にならぶはずだと思うんですけど・・ A open(IN, "+>$file"); @data = <IN>; $data = "A\n"; unshift(@data, "$data"); print IN @data; close(IN);
300 :
a :02/06/17 22:28 ID:???
ある某ゲーム(バトルロワイアル)を自分のホムペに乗せたいのですが... 初心者なので何をしてよいのかまったくわかりません。 教えてください。お願いします
ゲーム厨房消えろお願いするな乗せるな氏ね。
>299 書き読みモードと読み書きモードの違いってわかる? 書き読みモードの手順 空ファイル作成>ファイル読み書き 読み書きモードの手順 ファイル読み書き それと、ファイルポインタの変更しないと色々問題出るぞ。 わからないなら無理に読み書きモードは使わない方がいいかも。
303 :
296 :02/06/17 23:12 ID:???
>>302 >書き読みモードと読み書きモードの違いってわかる?
ありがとうございます。分かってなかったですね。。
それでいろいろやってみて
open(IN, "+<$file");
@data = <IN>;
$data = "A\n";
unshift(@data, "$data");
seek(IN, 0, 0);
print IN @data;
close(IN);
これで動くようになりました。「+<」←これ手持ちの本に載ってなかった・・(´Д`;)
304 :
nobodyさん :02/06/17 23:41 ID:/p2D1YQW
Perlとちょっと関係ないですが、 全ての環境変数を表示した際、他人に見られるとマズイ情報ってありますか?
305 :
お頼み申す :02/06/18 02:03 ID:giO2VPVu
掲示板に関して一つアドバイスを願いたいんです。 普段は掲示板のタイトルが見られる。 でも書き込み(新規スレ立て、レス共に)はログイン/認証しないと できないというような物はありますか? 探し続けて見あたらず無理なのかなと諦め気味。 いかがでしょうか?
306 :
nobodyさん :02/06/18 02:23 ID:zmbvlCMy
探すより作った方が遥かに早い罠 というか100%すれ違いです。
307 :
nobodyさん :02/06/18 03:40 ID:7mI4OrKx
>>307 一日中掲示板に張り付いて誰かが返信する度にキミが書き換える。
お前ら、【Perl】と関係ない質問は放置してください。
あほな質問で済みませんが Jcode.pmってActiveperlにはインストールできないんでしょうか?
314 :
nobodyさん :02/06/18 16:38 ID:OAKwZ56o
Win+Apache環境で ScriptInterpreterSource registry でスクリプトを実行する場合、 #!/usr/bin/perl -w のオプションは機能しませんよね?(実際機能してないようなので。)
315 :
314 :02/06/18 16:44 ID:???
#!/usr/bin/perl ←これ自体なくても動くようなのでコメントアウトされてるみたいですね。
質問です。 use strict; my ($a, $b); local $c; $a = 2; $b = 3; $c = $a + $b; print "Content-type: text/html; charset=EUC-JP\n\n"; print $c; こうすると Global symbol "$c" requires explicit package name at (eval 1) line 6. Global symbol "$c" requires explicit package name at (eval 1) line 10. Global symbol "$c" requires explicit package name at (eval 1) line 13. こういうエラーが出るのですが、すべてレキシカル変数にすると動きます。 なぜローカル変数だとuse strictでエラーが出るのでしょうか? 実際のスクリプトは複雑でどうしても$cをローカル変数で使いたいのです。 どうすればグローバル変数を使わずに正常に動かすことができるでしょうか?
>>316 なぜエラーになるかは、perldoc strict を読むべし。
「variable suicide問題を避けるため」らしい。よくわからんけど。
どうしてもlocal変数を使わなくてはいけない場合は、
use vars ('$c', '@array', '%hash'); # perl5.0
または
our ($c, @array, %hash); # perl5.6
みたいに、最初に変数名を宣言(というかシンボルテーブルに登録)しておく。
以上、経験則のみで答えますた。詳しくは識者の登場を待て。
>>317 ありがとうございます。
>use vars ('$c', '@array', '%hash'); # perl5.0
>または
>our ($c, @array, %hash); # perl5.6
これでいけました。恥ずかしながら今まで知らなかったので(汗)、これを機に勉強してみます。
319 :
nobodyさん :02/06/19 01:44 ID:nhdfxt0t
モジュールのインストールをしようとして、
make testをすると、『Test/More.pmが見つかりません』というようなことを言
われます。More.pmは何かのファイルに同梱されてるのでしょうか?
一応以下のURLを探してみたのですが、見つかりません…。
http://www.cpan.org/modules/by-module/ どなたかMore.pmがある場所を教えて下さい。
>>320 解決しました。
Test-Moreはもう古く、入れるならTest-Simpleでやってくれと
言われて、Test-Simple-0.44.tar.gzを入れました。
うまくいきました。
ありがとうございました。
322 :
nobodyさん :02/06/19 19:05 ID:oqQh34R0
<img src ="test.cgi">でCGIを呼び出して
画像を表示させたいのですが上手くいきません
print "Content-type: image/gif\n\n";
open(IMG,"test.gif");
binmode(IMG);
binmode(STDOUT);
print <IMG>;
close(IMG);
KENTカウンタからそれらしい部分を
抜き出してみましたが動きません
画像はとほほカウンタのを使ってテストしてるので
変なヘッダーが入ってるということはないと思います。
http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.htmlの 600も試してみましたが動きません…。
誰か助けてください…。(;´д`)
#画像表示すらできない自分が情けない(´Д⊂
323 :
s :02/06/19 19:28 ID:???
直接その test.cgi をURLリクエストして確認してみては? みたところおかしな部分はないようです。他の部分ってことない?
>>322 > print <IMG>
↑この部分を↓こう変えてみそ
while ( $cb = read( IMG, $data, 2048 ) ) {
print $data;
}
325 :
LWPを使ってみたいのですが :02/06/19 21:29 ID:FGMnMj5W
>>273-277 を読みました。
LWPをダウンロードしてきたけど、なんかひとつのpmファイルになってないようで
そのまま使えそうにありません。
使用してるのはwakwakのCGIなので使用条件が載っているページを見てみたのですが
perl5.6で標準ライブラリ?は利用できるようです。
で、標準ライブラリにあるか
試しにuse LWP::Simple;でCGIを動かしてみたのですが、内部エラーになりました。
LWPは、この環境では使うことはできないのでしょうか?
・インストールする方法(できないと思うが)
・インストールせずにデレクトリに配置して動かす方法
・他のCGI可無料HPですでにLWPがインストールされてるのでそこを使うといい
等々、なにか良い方法はないのでしょうか?
使うのは多分LWP::SimpleでHTMLドキュメントを引っ張ってくるだけです。
326 :
322 :02/06/19 21:51 ID:???
>>323-324 ありがとうございます。
原因はわかりませんが、両方の方法を試してみて
ダメだったので元に戻したら表示されました (´∀`;)意味わかんねス
>>325 LWPはperlコードだけで構成されてるから、自分で入れることも可能だと思う。
ただしLWPが入ってないサーバつーのは、そもそもソケットの使用を禁止してる場合も多い。
そんときはLWPを入れても無意味。
328 :
LWPを使ってみたいのですが :02/06/20 00:34 ID:XCYMLnG6
>>327 use Socket; 自体は動作しますが、Socketで通信を許しているのは localhostへのsmtp/tcpのみとなります。
だそうです。
これって望み薄ですか?
ちなみにやり方間違ってるっていうチョンボはしてませんよね?(僕)
ただuse LWP::Simple;としているだけなのですが・・・
329 :
LWPを使ってみたいのですが :02/06/20 01:43 ID:+cy8aoAH
イチかバチか入れてみました。 自作CGIのでバック設定というのができるみたいで それを使ってやってみました。 最初は、HTTP/Statusのパスがうまく行っていなかったようなので @INC追加したら、そこはクリアできました。 ただ unless(defined($content = get $url)){ のところで Can't call method "get" on an undefined value が出てしまいました。これは無理と言うことでしょうか?
>>328-329 >Socketで通信を許しているのは localhostへのsmtp/tcp
駄目ジャン。
smtp/tcpってメール送信用のポートだし。localhostのみだし。
331 :
LWPを使ってみたいのですが :02/06/20 15:27 ID:zhAJDQeR
そうですか(トホホ どっか、CGI可無料HPでできそうなところないですかね。
自鯖たてろ
ActivePerl 5.6.1 build 633
334 :
nobodyさん :02/06/21 03:40 ID:ovOj5UMI
PERLでBEEPの制御ってできますか?できないっすよね。。
もっと自信を持って発言しろよ。 できないYO!!
っていうかBEEPって知らないYO!!!
>>334 print "\a";
こういうことじゃなくて?
>>333 ActivePerlの(マイナーチェンジの)変更履歴ってどこにあるんだろ…。
英語ワカラソ
339 :
nobodyさん :02/06/21 11:37 ID:Qqq2SOCG
単語をどうやって発音したらよいかがわかるサイトってどっかありませんか? Array→アレイ とか $→スカラー とかいうふうに。 require ってどう発音していいかわからないんですよ(汗)。
辞書で発音記号見ましょう $→スカラーって読むわけじゃないし
その発音記号が読めないんです。あうう。
>341 発音記号の読み方を勉強しましょう。
う。マジメに発音記号の読み方を勉強しはじめてしまいました。 普通、発音記号の読み方って授業でやるもんですか? うちんとこやらなかったんですよ。 商業科だったんで。 parentsとかも、その<p>で始まるやつ!親っていう意味だ! と、いう覚え方してるもんなあ……簡単なのは読めるんですが。
どうやってよむんだ? っていう続きで、 chdirとか。 Change Directoryの略でええんかい? とか。 まあ、いろいろと疑問があったんで、そういうの解説してるようなサイトとかないかなーって前から思ってたんですよ。
>345 =~ s/商業化/商業科/; 小学校からやり直してきまつ。
>>345 chdir、
意味は知ってるんですけど。
音の発音が。
直でよむとチヂラ(藁<ソレハイカンダロウト
>>345 引っかかりはするんですが、大量に引っかかりすぎてみつけられなかったのですわ(苦藁
>347 発音記号は英和辞典に載ってる。 読め。 >348 一番上にひっかかるサイトにかなり載ってる。 読め。 じゃなければ検索用語に他のコマンドも入れてみろ。 頭使え。
chdirなんかを口に出して言う機会はほとんどないが、 脳内では「しーえっちでぃあ」って言ってる・・・(w
何故か脳内では"チディル"だな。 口に出すときは"チェンジディレクトリ"だけど。
352 :
nobodyさん :02/06/21 20:59 ID:YFodOum0
英語圏ではちだーですね
英語圏だけど「しーえいちでぃあ(←うーん、微妙に違うな)」だな。
自分で書いたモジュールで Makefile.plっていうのは自分で書かなきゃきけないんですか? 自動で生成するツールはないでしょうか?
>>354 一応h2xsっつーユーティリティがPerlについてくるが、
Makefile.PLなんてそんな面倒なモンでもないだろ。
356 :
354 :02/06/21 22:35 ID:???
ActivePerl-5.6.1.633-MSWin32-x86.msi 挿れようとしたらインストールが完走しない…鬱
360 :
:02/06/22 01:03 ID:???
わけわからんっ音符
>>360 激しく感謝!!
よく見たらHDD残量が150MBしかなかったので、足りない悪寒でした。
(−_−)ウツダシノウ
嗚呼、10MBもあるドキュメン入れたくねぇ…
ちょい質問。 ActivePerlって下の環境残したまま上書きインストール出来るっけ? 最新版にしたくてもそれがほそろしくて試せない…
364 :
nobodyさん :02/06/22 10:40 ID:KPuvG/sZ
「Web クライアント プログラム」(オライリー・ジャパン)の 例題 hcat.pl
use LWP::UserAgent;
use
HTTP::Request; use
HTTP::Response; my $ua = new LWP::UserAgent;
my $request = new
HTTP::Request ('GET', $ARGV[0]);
my $response = $ua->request($request);
if ($response->is_success) {
print $response->content;
} else {
print $response->error_as_HTML;
}
で、
hcat.pl
http://www.hyuki.com/dp/dp.jpg > dp.jpg
とすして、dp.jpgを見ると、ちゃんとした画像になりません。
どうしてでしょうか。教えてください。
環境は、ActivePerl v5.6.1 built for MSWin32-x86-multi-thread、
windows2000 professional です。
365 :
xx :02/06/22 10:49 ID:???
ちゃんとした画像にならないということは、ぐだぐだな画像になってしまうのか、 開けないけど容量はあるってことだろうから、ファイルハンドルを binmode すれば?
366 :
:02/06/22 12:03 ID:???
368 :
べっくあむ :02/06/22 12:16 ID:9y/Dp6Qo
PerlのDBIを使って、MySQLを操作しようとしています。 書籍やインターネットでやり方を調べていく中で、次のような 注意事項が記載しているものを見つけました。 1:$dbh = DBI->connect(****); 2:$sth = $dbh->prepare(*****); 3:$sth->execute(); 4:$sth->finish(); 5:$sth = $dbh->prepare(*****); 6:$sth->execute(); 7:$sth->finish(); 8:$dbh->disconnect(); の様に一回のDBコネクション中で2回のコマンド発行を するときは、一回目(上記2〜4)と二回目(上記5〜7)で ハンドル変数名を変えなければならない(例えば5〜7は $sthではなく、$sth2にする)というものです。 自分の環境下の簡単なプログラム中では問題なく 動いているのですが、本当に注意すべき内容なのでしょうか?
369 :
nobodyさん :02/06/22 14:04 ID:fNvTUaUi
__ ..⌒ヽ ' ⌒ヽ /.|:::::::::::| 乂乂|| |乂乂|| | |:::::::::::| 乂乂|| |乂乂|| | |:::::::::::| 乂乂|| |乂乂|| ___|_|:::::::::::|____ 乂乂|| |乂乂|| /|::::::::::::::::::::::::::::::::::::::::::::::::::::::::|  ̄ ̄  ̄ ̄ i |::::::::::::::::::::::::::::::::::::::::::::::::::::::::| _____ .|/ ̄ ̄ ̄../|:::::::::::| ̄ ̄ ̄/ ||L L | L L ||  ̄ ̄ ̄ ̄| |:::::::::::| ̄ ̄ ̄ ||L L | L L || | |:::::::::::| ||L L | L L ||_________ .| |:::::::::::| ===========l| L L l================= i |:::::::::::| 二二二二二二ヽ iヽ二二二二二二二二i |:::::::::::| :::::::::::::::::::::::::::::::::::i ヽ| _____.i |:::::::::::|  ̄ ̄ ̄ ̄ ̄ ̄ ̄\ ((( )))_______| |:::::::::::|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|......( ´Д`)._____| |:::::::::::|__ ::::::::::::::::::::::::::::::::::::::::: | / (S)::::::i\ ....| |:::::::::::| \  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| .\ ....\|:::::::::::| \ ____/|____ .| .\  ̄ ̄ / | Perlスクリプトから、2ちゃんに書き込める方法を教えてください。 \_______________
370 :
永久会員パスが書き込みするだけで当たる :02/06/22 14:12 ID:E0ppwG7L
>>368 別に変えなければ動かないということはないけど違う用途の
(ハンドル|オブジェクト|数|文字列|・・・)を同じ変数に代入して
変数を使いまわすのは間違いをおかしやすかったりとあまり良い
スタイルとは言えないかも。
(同様に$sth1、$sth2という名前もお勧めできない)
372 :
nobodyさん :02/06/22 19:01 ID:PwKD5Bpr
$dir = ディレクトリ 、 $file = 数字 open(DATAOUT, "+< $dir . $file . '.dat'") || die &Error; えっとこういう処理があるんですが、読み書きモードでファイルを開けないんです。 というかファイル名を認識してくれないみたいです。 open(DATAOUT, $dir . $thismonth . '.data') || die &Error; ↑このように読み込みモードだとちゃんと認識してくれるんですが、読み書きモードでちゃんと 認識するようにするにはどうすればよいでしょうか? いろいろ "" を '' にしたり、. を \. にしてみたりしたんですがうまくいきません・・。 お願いします。
>372 もうちょっとダブルクォーテーションについて考えてみた方がいいぞ。 open(DATAOUT, "+<$dir$file\.dat") || die &Error;
374 :
372 :02/06/22 19:42 ID:???
>>373 おぉ〜〜〜できましたっ!! ありがとうございます!
>もうちょっとダブルクォーテーションについて考えてみた方がいいぞ。
はい考えてみます (´Д`;;)
ありがとう。
375 :
アルバムモナ :02/06/22 19:57 ID:sE7wyej0
376 :
べっくあむ :02/06/22 21:20 ID:9y/Dp6Qo
>>371 ありがとうございます。
動作上は問題ないと言うことですね。
>変数を使いまわすのは間違いをおかしやすかったりとあまり良い
>スタイルとは言えないかも。
確かにこんな変数名では、ちょっとしたタイプミスで、
見つけ難いバグを自らの手で作ってしまいますよね。
気をつけてみます。
掲示板で、半角カナが文字化けしてしまうことがあるんですが、対策とかないですか? 半角カナを全角に変換とかはしたくないんですけど。。
379 :
xx :02/06/22 23:26 ID:???
>378 サーバの環境および現在のフォーム出力文字コードぐらいは書いてもらわないと、、、、
380 :
nobodyさん :02/06/23 18:26 ID:izD8oNpG
win2kのCドライブにapache1.3.26、ActivePerl-5.6.1ビルド631をインストールしました。 Dドライブにある下記のようなCGIスクリプトをapache経由で実行したら、 . のみでした。 そこで、コマンドプロント上で「perl inc.cgi」と実行したら、 ちゃっんと C:/usr/local/lib C:/usr/local/site/lib . とでます。 apache経由でも C:/usr/local/lib C:/usr/local/site/lib . になるようにできますか? ----- #!/usr/bin/perl print "Content-type:text/html\n\n<xmp>"; for(@INC){ print $_,"\n"; } exit; ------
381 :
nobodyさん :02/06/23 18:30 ID:jOy7H3G4
>>380 原因はよくしらないがperl -Iでどうかね。
それか@INCに対しpushするか。
>>380 まったく同じ環境でちゃんと表示されますが。
383 :
380 :02/06/23 19:00 ID:???
原因がわかりました。 perlをc:/usr/local にインストールしたのですが、 /usr/bin/perl のスクリプトでも使えるように、 C:/usr/local/binをc:/usr にコピーしてたのが原因だったようです。 #前まではできてたのになぁ。。。
while(<>){ $n=pack "h*", "$_"; print $n; } で読み込んだテキストを元にもどす方法ってどうやるんですか? while(<>){ $n=unpack "h*", "$_"; print $n; } じゃだめなんですけど
>>384 それpackとunpackの使い方が逆でない?
while (<>) { print unpack("h*", $_); } # テキスト→16進
while (<>) { print pack("h*", $_); } # 16進→テキスト
386 :
nobodyさん :02/06/24 18:03 ID:pso5a6KF
perlのファイル書き込み時にわたしはいつも open(DATA, ">$cdata")|| &write_error; flock(DATA, 2); print DATA @newdata; flock(DATA, 8); close(KDATA); などとしています。 このflockは排他処理には役に立たないような事がよく 書かれていますが全く役立たないのでしょうか? なにも処理しないよりはマシという程度ですか?
>flock ってのは「このファイルは俺が使うから誰も触るなよ」 >って宣言するだけです。礼儀正しい人は「もう触ってもいいよ」って言われるまでは触りません。礼儀正しくない人は構わず触っちゃいます。ただそれだけです。つまり、単なる紳士協定。OK? ># これ以上簡単な説明は出来ないよ。 過去スレのJAPUさんのセリフより。
388 :
nobodyさん :02/06/24 18:41 ID:kznFdEhQ
>>386 flock(DATA,8);は別にいらん
>>386 全体を見ないと確かなことは言えないけど、
書き込みのときだけロックしてもだめ。
データの読み出しから書き込みまで、
ずっとロックし続けないと排他処理にならない。
391 :
386 :02/06/24 21:52 ID:pso5a6KF
>>387-389 皆さんのご意見とてもためになりました。
ありがとうございます。
>>388 さん そうなんですか、知りませんでした。
>>389 さん これも驚きました。読み込みの時はflock使ってませんでした。
本に書いてあるものをそのまま参考にしていました。
わたしの使い方は問題あるんですね。もう少し調べてみようと思います。
おいおいマジでレベルが下がったな。
>>386 のロックが役に立たないってのは
open HANDLE, ">file"; # まずfileの中身を空にして開く、と…
flock HANDLE, 2; # ロックするかな
このopen & truncateが問題だろ。
正しくは
open HANDLE "+<file"; # 読み書きモードで開く、と…
>>386 の方法でも何もしないよりはマシかもしれんが、
確実に効果がある、とは程遠かろう。
flockはやっぱダミーのファイル用意して、 それをopen(&flock)してる間に処理、っていうのがいいんじゃないかな。
>>394 なるほど。どうもありがとうございます。
>>394 grepで元の配列を壊すのはいかがなものかと。
@URI = grep { /^Location_URL=(.*)/ } @list;
397 :
396 :02/06/25 16:00 ID:???
スマソ、396は忘れて。 ところで元の配列を壊さずに一部を取り出す一番効率の良い方法ってどんなんだっけ…。 @URI = map { substr $_, 13 } grep { /^Location_URL=(.*)/ } @list; # じゃないよな…
398 :
394 :02/06/25 16:24 ID:PBYsCZmL
う。ソウダネ>破壊マズー
元を壊さずにそれ(
>>397 )より効率のいい方法ってあるんかいな。
>397 59点ってとこだな。
実はmapはgrepとしても使える罠 @URI = map{ /^Location_URL=(.*)/ ? $1 : () } @list;
>>400 それ知らなかったよー。兄ちゃんありがと。
このままだとtruncate()が絶対に失敗するんですが。 失敗しなくするにはどうすればいいですか? #!/usr/bin/perl -w use strict; sub t($); open(F, "+<in.txt"); # aが30個くらい並んだだけのファイル t(*F{IO}); close(F); sub t($) { my $f = shift; truncate($f, 10) || warn("error"); }
>>402 *F{IO}は型グロブではなく、リファレンスだから、
デリファレンスする必要がある。
truncate(*$f, 10)
>>403 402じゃないけど質問させてください。
open F, ">file.txt" or die;
my $fh = *F{IO};
print {$fh} "test\n" or die;
truncate *$fh, 10 or die;
close $fh or die;
このコードで、printやcloseは$fhでも*$fhでもオーケーなのに
truncateだけは*$fhしか指定できないんですが、どういうこと?
>>404 Perlのバグっぽい気が。
尤も、生のIOオブジェクトを使うと、Tieによるオーバーロードが効かなくなるんで素人には(略
406 :
404 :02/06/25 23:35 ID:???
うわ。すばやいレスありがとうございます。 実は402を見てからperlrefとか読んでいろいろ実験してたので、 まだIOオブジェクトがよくわかってないのですが、 これがバグとわかれば安心して眠れます。
>>402 >>404 なんでそんなわかりにくいもん使うの?オブジェクト使いたかったら
素直にIO::Fileとか使えばいいのに・・・
>>404 printに*$fhって渡せました?
おれの環境では下のコードはsyntax errorになるんです。
#!/usr/bin/perl -w
use strict;
my $stdout = *STDOUT{IO};
print *$stdout "test\n"; # print $stdout "test\n";なら大丈夫
>>407 モジュールの使い方を調べたり覚えたりするのが面倒だっただけです。
*FOO{THING}自体はそんなに分かりにくいものでもないし。
関係ないけど、sort { $a <=> $b } @f;の方が分かりにくいです。
use strict;なのに$aと$bは宣言しなくていいのは何、みたいな。
>>408 use IO::File;
my $fh = IO::File->new( $filename ); ## open()と基本的に同じ
print $fh "foobar\n";
のどこが面倒くさいのだろうか。少なくともグロブがなんちゃらとか
考えるよりかはるかにシンプルだと思うんだけどな。大体perldoc perlref
を読んでる暇があるのにperldoc IO::Fileが面倒くさいのもわからんし。
まぁ使いたくなかったらそれはそれでいいんだけど。素直に使ったほうが
楽だし、そのほうがPerl コミュニティのカルチャーにそってると思う。
410 :
404 :02/06/26 09:37 ID:???
>>408 print関数の第1引数は、シンボルでもスカラ変数でもない場合は
ブロックに入れないと構文エラーになるよ。(昨日覚えた)
print {*$stdout} "test\n";
>>409 ほっといてくれー。こういう瑣末なことを調べるのが趣味なんだよー。
たぶん408の人も、おれと同じタイプ。
あ、もちろん実際にスクリプト書くときは素直にIO::File使います。
>>410 ああまぁ趣味のスクリプトとかならいいんですけどね。
プロダクションコードでそういうのを見たくないのでとりあえず
牽制した、ということで。
412 :
nobodyさん :02/06/26 15:38 ID:1ADBKX33
自分でちまちま作ったCGIを公開しようと思ってるんですが (公開といっても使うのはネットの仲間だけ)これだけはしちゃイカン!って 処理とかあるんでしょうか?cgiのバグでunixコマンドを打てるとかっていうのが 気になるんですけど。
413 :
:02/06/26 15:49 ID:???
>>412 >cgiのバグでunixコマンドを打てる
とんでもないのがあるじゃねーか!
>>412 -Tスイッチをつけないで実行しちゃいかん。
何をすべきでないのかわからないなら、これは必須。
#!/usr/bin/perl -UX
416 :
nobodyさん :02/06/26 17:29 ID:ZfGn23SZ
>>414 >>412 じゃないんですが -T スイッチってどんなものなんでしょう?
-wスイッチはつけるようにしてるんですけど -T スイッチは見たことがありませんでした・・。
417 :
416 :02/06/26 17:36 ID:ZfGn23SZ
罵倒覚悟で聞きます Perlで2chのDAT直読みは無理なんでしょうか? User-Agent: Monazilla/1.00 (toolname/ver) ←こうゆう風にしても 無理なんですけど、、。
Accept-Encoding: gzip は?
別に罵倒するつもりはありませんが、普通に取得できましたが・・・
URLが間違ってるとかそこら変チェックした方がいいかと思います。
#!/usr/bin/perl
use LWP::UserAgent;
my $ua = new LWP::UserAgent;
my $request = new
HTTP::Request ('GET', '
http://pc.2ch.net/php/dat/1022731565.dat ');
$ua->agent('Monazilla/1.00 (libwww-perl/5.65)');
$response = $ua->request($request);
print $response->as_string;
421 :
418 :02/06/26 18:37 ID:???
>>420 謝謝、
URLが間違ってたみたいです。
Perlでは規制がかかってると思ってあきらめてたんですが、、よかった。
422 :
412 :02/06/26 18:50 ID:1ADBKX33
>>414 1行目を#!/usr/bin/perl -T にするって事でしょうか?
unixコマンドを打てる、というバグを発生させないためにはどうすれば
どんな点に注意すればいいんでしょう?
バグというか、何も対策してないcgiだとアドレスのcgi-bin/xx.cgi?の後ろに
いろいろへんなのを入力するとunixコマンドを打てるとかいうバグがある話を
聞いたんですが。
>>422 いっぱい情報あるから検索すれ。キーワードは「脆弱性」「CGI」等。
>422 要は、ブラウザ側で入力された値をチェックしないでそのまま以下のような 関数に渡さなければいいだけ。 open exec system qx// eval ``
426 :
nobodyさん :02/06/26 19:47 ID:CyvQGqzW
grepもマズーじゃねーの?
バグじゃないだろ…
>Unixコマンド実行 それがバグだったら世界中のPerlUserが嘆くことになるな。
430 :
nobodyさん :02/06/27 01:16 ID:riwIozkn
質問です。
$a = '&xyzあいうえお<A href="
http://www.xxx.com ">リンク</A>';
$a =~ s/&[^lt;|^gt;]/&/g;
こんな感じで文字列の < と > 以外の & を & に置換したいのですが、
上のようにすると & の次の文字(ここでは x)が消えてしまいます。
どうすれば &xyz とすることができるでしょうか?
431 :
429 :02/06/27 01:19 ID:riwIozkn
あぁ・・失敗したのでもう一度かかせてください・・
$a = '&xyzあいうえお&<A href="
http://www.xxx.com "&>リンク&</A&>';
こんな感じで文字列の &< と &> 以外の & を & に置換したいのですが、
上のようにすると & の次の文字(ここでは x)が消えてしまいます。
どうすれば &xyz とすることができるでしょうか?
$a =~ s/&([^lt;|^gt;])/&$1/g;
ちなみに、どっちにしろこれじゃあ思う通りの効果はえられないと思う。
>>432 うわ〜〜〜もうお答えいただきました(´∀` )ノワーイ!
ありがとうございます。ちゃんとできました。
>>432 それって違うと思うけど・・・
$a =~ s/&(?!=lt;|gt;)/&/g;
じゃないの?[]で囲んだらcharacter classになっちゃうじゃん。
432の正規表現では&のあとの文字がg,l,t,;,|,^だったら&
に変換されないぞ(例:&lz; &gxcv; &;;; )
あ、すげー間違った。すまぬ。 s/&(?!lt;|gt;)/&/g;
ありゃ?あ、そうか。&amp;ってかかなきゃいけないのか・・・
>>436 それで完璧にできました。ありがとうございます。
正規表現勉強しないと(°_°;A)アセ
すみません。消費者を騙し、クレームをつけると強烈な脅しで黙らせる位の ひどいサイトがあります。思いきってサイト(HDD)をクラッシュさせたいのですが、 何かいい方法はあるのでしょうか? こちらのIPとか所在がわからないようにしたいのです。 こう言う質問にお答えとなると問題がある場合、こういった専門サイトとかがあれば お教え頂けないでしょうか。
す ひ 何 こ こ お ??? 縦読みじゃないのか
特殊変数 $# はどのように利用するのでしょうか? 「出力時の数値形式」ということまでは分かったのですが...。
>>442 -wスイッチの元で警告されるように、$#の使用はお勧めできない。
Cレベルでの内部操作だから簡単にDLLエラー(Unixだとコア吐くのかな?)を出せるしな。
それでも使いたければ:
$# = '%.3g';
print 8/9;
444 :
trrh :02/06/27 23:55 ID:mvLF/G5v
while (<file1>){ $file1++; } close(file1); while (<file2>){ $file2++; } close(file2); while (<file3>){ $file3++; } close(file3); while (<file4>){ $file4++; } close(file4); 上記のソースを短く出来ませんか?
$mes = '787+8787'; $paturn = '787+8787'; quotemeta $paturn; if ($mes =~ /$paturn/){ print "Match!\n"; } else { print "Oops!\n"; } これだとマッチしないのですが、どうすればエスケープ出来るでしょうか quotemetaの使い方を間違えてんのかなあ・・
でけますた \Q\E だた・・ perlは忘れ易いよ
>>447 quotemeta()の使い方間違えてるよ。
$quoted = quotemeta $string;
chop(), chomp()等と違って元の文字列は置き換えないからね。
>>447 わざとなのかもしれないけど、paturn はちょっと恥ずかしいね。
451 :
nobodyさん :02/06/28 22:43 ID:ZifxuKsx
foreach $mon(@logs) { @mon = split(/,/,$mon); $mon{$mon[1]}++; } 3行目では何が起こっているのでしょうか?
452 :
&r :02/06/28 22:51 ID:???
ハッシュ%mon を利用して、配列 @logs の第2フィールド値の出現回数を 取得しているといったところでしょうか。
453 :
451 :02/06/28 23:30 ID:???
>>452 さん
出現回数ですか。
どうもありがとうございます。
454 :
nobodyさん :02/06/29 00:03 ID:kfva2Nvg
質問です。 ppmでsearchを実行しても全く反応がないのです・・・ PPM> search PPM> のように、なってしまうのです・・・DBIをインストールしたいがために四苦八苦しているのですが、 どうしても上手いこと行きません・・・もちろんdbi.zipを直接DLして ppm install dbi.ppd 等も試してみましたが Could not locate a PPM binary of 'dbi.ppd' for this platform とエラーが出てしまいます(涙 どうにか対処法を教えて貰えないでしょうか・・? 環境はwin2k perl-v5.6.0 for MSWin32-x86-multi-thred ppm(2.1.2)です
>>454 install DBI
でいけないか?
456 :
こここ :02/06/29 02:20 ID:8vz7q6tH
kentwebのCOSMO GATE-EXをエクスリアで設置したけど、 説明の通りに設置して、チェックモードでもOKとでたんだけど Authorization Required This server could not verify that you are authorized to access the document you requested. Either you supplied the wrong creden tials (e.g., bad password), or your browser doesn't understand how to supply the credentials required. ってでる。 何が悪いのかわかります?
457 :
nobodyさん :02/06/29 02:24 ID:kfva2Nvg
>>455 ダメです・・・
Installing package 'DBI'...
Error installing package 'DBI':Could not locate a PPD file for package DBI
となります・・・
ネットは常時接続なので、当然繋がったまま実行しているのですが・・・
(。´Д⊂)゜。・ こまった
459 :
こここ :02/06/29 02:28 ID:8vz7q6tH
>>457 えーなんでだろう。じゃあppm使わずに
perl -MCPAN -e shell
って打ってから
install DBI
>>457 わかった。常時接続ならプロバイダかどっかのPROXY通してるでしょ。
それ一時的に外してみて。
463 :
補足 :02/06/29 02:52 ID:???
http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/ > PPM doesn't work through a proxy/firewall.
> This can be remedied by setting the environment variable 'HTTP_proxy' to the name and port of your Internet proxy, e.g.:
> C:\> set HTTP_proxy=
http://proxy:8080 > If your proxy or firewall requires a username and password, you will also need to set the environment variables 'HTTP_proxy_user' and 'HTTP_proxy_pass'.
多分これね
464 :
こここ :02/06/29 02:52 ID:8vz7q6tH
げげげっ!? 本当だ。 今まであると思ってたIDとパスがなかった・・・ とにかく今やったら出来た。 nobodyさんありがとう!!!
nobody さん?(w
ここかが引き篭もりの巣ニダか!! ∧∧ |\ <ヽ`∀´> /| ヾ  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ /  ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | / ̄ ̄ ̄ ̄\/ ̄ ̄ ̄ ̄ ̄\ __/ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ .\__ ドドン!! ___<__)__________ (__>___
467 :
nobodyさん :02/06/29 12:54 ID:xVhrnBTO
CGIでメインの掲示板やゲームのサブルーチンが入ってるサブのCGIファイルで こいつらの属性を変えてやれば処理を軽くすることはできますか? 初心者なもんで質問が意味不明かもしれません…(汗)
468 :
&r :02/06/29 12:57 ID:???
>467 ほんとに意味不明だからびっくりしたYO!
469 :
あSD :02/06/29 13:16 ID:IbvPgwu5
Perlの事で質問です。 初歩的な事で申し訳ございません。 name1<>host1<>ip1<>111<> name2<>host2<>ip2<>222<> name3<>host3<>ip3<>220<> name2<>host2<>ip2<>200<> name2<>host2<>ip2<>222<> name3<>host3<>ip3<>220<> とログファイルに保存をしてありまして、 それぞれの一番右の数の合計を出すにはどうすれば宜しいのでしょうか?
ホストごとにまとめたい、ということ?
473 :
471 :02/06/29 17:03 ID:???
>>472 はい。そうです。
出来ますでしょうか?
>473 >451が参考になるよ。 あれをちょっといじればいい。
475 :
&r :02/06/29 17:07 ID:???
>471 こんな感じでしょうか? $sum+= (split(/<>/))[$[+3] for <DATA>; __DATA__ name1<>host1<>ip1<>111<> name2<>host2<>ip2<>222<> name3<>host3<>ip3<>220<> name2<>host2<>ip2<>200<> name2<>host2<>ip2<>222<> name3<>host3<>ip3<>220<>
476 :
471 :02/06/29 17:25 ID:???
>>474 それは、その感じでまる2日ぐらい悩んだんですが出来ませんでした。
>>475 今、試してみましたが一番右の数の全部の合計した数が出てきました。
>476 > 1:自分はこう言う事がしたい。 > 2:それでこんな風にやってみたが・・・ > 3:それだとこんなエラーが出て上手く行かなかった。 > > 1と3が無いと誰も答えられないよ。 > 良い回答は良い質問から。一緒に勉強しましょう。 1はあるけど2と3がないな。
結論出すと、 while(<IN>) { @host = split(/<>/,$_); $host{$host[0]} += $host[3]; } かな?
>>477 おいおい。まる2日分のなんや事を書けっていうのかちみは?
480 :
&r :02/06/29 17:52 ID:???
>478 そうだね。うっかりホスト毎ってのを見逃してた。修行してくる。
481 :
471 :02/06/29 17:55 ID:???
>>479 んーと別に大丈夫ですよ。質問の仕方が悪いのは僕の方です。
>>477 今まで答えて頂けたことは全て一通りやってます。
エラーは出ませんでした。出たとしても;を:と間違えた等その位です。
482 :
471 :02/06/29 17:59 ID:???
483 :
471 :02/06/29 18:02 ID:???
484 :
&r :02/06/29 18:04 ID:???
>482 ハッシュの参照のしかたわかる? ファイルハンドルが478ではINになっているから統一しているか確認して、 とりあえず以下のようにして出力して確認されない? for ( keys %host ){ print $_,': ',$host{$_},"\n"; }
485 :
471 :02/06/29 18:04 ID:???
野郎℃も出来たぜ!! Thanks!!!!!!!!!!!!!!!!!!!!!!!! 黄金帽と呼んでくれ!!!
@host1 = grep { /^name1<>.*<>.*<>.*<>/ } @_; @host2 = grep { /^name1<>.*<>.*<>.*<>/ } @_; @host3 = grep { /^name1<>.*<>.*<>.*<>/ } @_; foreach(@host1){ m/^name1<>.*<>.*<>(.*)<>/; $count1 += $1; } これじゃ非現実的だな。スマソ
487 :
471 :02/06/29 18:07 ID:???
488 :
nobodyさん :02/06/29 20:03 ID:A6ruKh9P
489 :
nobodyさん :02/06/29 20:32 ID:YfnrInm/
perlからcの関数(*.aとかlibの)を使用する方法を教えてください。
>>489 ム板とWebProg板にマルチポストか。おめでてーな。
うるせえよ
>46 :デフォルトの名無しさん :02/06/29 19:00
>
>>1 よ
>だいたいPerl関連はWebProg板でやるきまりなんだよ
>そっちへ逝け
493 :
490 :02/06/29 21:37 ID:???
何故俺が罰を受けねばならんのだ…ウワァァァァン(`Д´)
494 :
492 :02/06/29 21:41 ID:???
open関数が失敗するときは、 ・ファイルが存在しない ・パーミッションがおかしい 以外にありえるのでしょうか、おねがいします
496 :
495 :02/06/30 06:36 ID:wtzA9nm5
あげときます
>>495 ・メモリが足りない
・opcodeの実行が禁止されている
今だ!200番ゲットォォォッ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
欝…番号間違えた(泣
>>495 あと、既にファイルが排他モードで開かれてるってのは?
排他モードで開くなんてのはあるのかな? 排他モードでロックしているというのはあるが。(その場合でも open は可能)
ここにいる人は
>>492 の質問には答えられないレヴェルなのですね。
ファイルロックなんてどうせ巷の解説サイトみればすむことなのに、、。
>504 492は質問ではなく誘導ですが…。 巷の解説サイトにあるファイルロックできみは納得して満足してるんだろうね。 そのサイト教えて。
504=506? だから、きみが納得して満足してるであろう巷の解説サイトを教えて。 どこ?
>508
そのリンクってはじめて見させてもらったけど大崎さんのスクリプトに
なんで余計なプロセス番号($$)付けてあるの?積算秒を付ける意味を
理解できてないの?
これがきみの言う「巷の解説サイトみればすむ」ってこと?
504の解説:
>ここにいる人は
>>492 の質問には答えられないレヴェルなのですね。
505に書いたとおり、「492は質問ではなく誘導です」
> 付加する数字文字列がtime関数だと秒単位なので、 > まだ完全ではないのではないかという疑問が残ります。 何が疑問なのかが疑問です。
>510 この板でこのレスの速さは508さん自身のサイトだったってことかな? ロックできるかどうかのテストと実際にロックする操作を同時に行なう ことができる atomic な関数 を使っているからロックが成功するのは 1プロセスであり、そういう意味では同じ名前にロックファイル名に リネームしてもよいということ。 ここで、なぜ積算秒を付け足したロックファイル名にリネームするかと いうと、もしデッドロックが残っても作成してから60秒よりも経過して いるかどうかを確認するからです。 つまりプロセス番号($$)を付ける意味がまったくわたしには理解できません。
>510 付け足すけどよく見たらさ。 ロック中ファイル名って、$lfh{path} . time . $$ だから /^$lfh{basename}(\d+)/でマッチさせた $1 って time . $$ の値になる 可能性が大きいよね。(Windows系だと$$は-nnnnnnみたいな形式だったりする けどさ) でもその直後に平気で積算秒から $1 の値を引いてタイムアウト値と比較してる からデッドロックをこれじゃ回避できないんでは?
>513 カウンタ程度ならむしろ使わないほうがいいだろう。うっとうしい。 まぁ、使うとしたら電子商取引システムを構築するときに使うかもな。 さっきのアドレス、きみのサイトだったらなおしとけよ。はずかしいから。 きみの検索でほんとにさっきのサイトがトップでヒットしたんなら、検索能力を 養ってから吠えるこったな。まずこれでも見ておれ。 %perldoc -m perlxs
まぁ言い争いはよそうや(*゚ω^)ノ この板に電子商取引システムを構築したりする人間がいるなら XSぐらい楽勝だろ。
ロックスレの存在意義が今わかった。隔離病棟なんだね。。。
>>515 で、なに質問してるんだっけ。ていうかあなた質問者本人?
perlxstutの説明に沿ってHello Worldとか作ってみた?
>>516 見てもいまいち分からんとです。
解説サイトみても解説のみでサンプル載ってないし
$ENV{REMOTE_HOST} が返ってこないサーバーがあって、 問い合わせたら、「そんなことはない、ソース見直せ」って 言われたんですけど、このソースで表示されなかったらおかしいですよね? #!/usr/bin/perl print "Content-type: text/html;\n\n"; print "<html><body>"; foreach (sort keys %ENV){ print "\$ENV{$_}:$ENV{$_}<br>\n" } print "</body></html>"; exit; これは何かこちらのソースに問題があるのでしょうか よろしくお願いします。
522 :
&r :02/07/01 11:41 ID:???
>520 なんでキーを出力させてないの? たしかにREMOTE_HOSTがない場合もありうる だろうけど print "$_: $ENV{$_}<br>\n"
>521 最近のapacheではホスト名は取得できないということでしょうか。。 >522 一応、キーは \$ENV{$_} で、表示されています。
特定の座標を中心とした5x5のマップを表示させたいのですが。 マップの情報が 123456789 123456789 123456789 123456789 123456789 123456789 123456789 とあってたとえば5,3だとしたら 34567 34567 34567 34567 34567 みたいな感じに表示させたいです。 でも、存在しない座標が含まれていたら表示しないようにしたいです。 参考になるようなページでもいいのでお願いします。
>>524 マップの外周に2マス分の余白を持たせるのはどうすかね。
余白は0とか-1とかの特別な値で埋めておく。
>>524 なんか宿題っぽいよなぁ・・・
まぁまずこういう構造体があったとして・・・
my @foo;
for my $idx1 ( 0..9 ) {
$foo[$idx1] = [];
for my $idx2 ( 0..9 ) {
$foo[$idx1][$idx2] = "$idx1$idx2";
}
}
で、まぁそしたらこんな感じか
sub print_matrix_range
{
my $matrix = shift;
my( $x, $y, $range ) = @_ ? @_ : (0,0,$#{$matrix});
my $xstart = $x - $range >= 0 ? $x - $range : 0;
my $ystart = $y - $range >= 0 ? $y - $range : 0;
my $xend = $x + $range <= $#{$matrix} ? $x + $range : $#{$matrix};
my $yend = $y + $range <= $#{$matrix} ? $y + $range : $#{$matrix};
for( my $curx = $xstart; $curx <= $xend; $curx++ ) {
for( my $cury = $ystart; $cury <= $yend; $cury++ ) {
print $matrix->[$curx][$cury],
$cury == $yend ? "\n" : ' ';
}
}
}
print_matrix_range( \@foo, 5, 3, 2 ); # 5=両方向に2マスだから
書き写しに失敗してないといいんだが。
527 :
質問です。 :02/07/01 21:51 ID:X3MphqPi
529 :
nobodyさん :02/07/01 21:53 ID:YKfyV+9J
同意
530 :
名無し募集中。。。 :02/07/01 21:55 ID:POquGnWB
はじめまして。質問です。 perlを使って、Submitボタンを押さずにデータをcgiに受け渡すことって 可能でしょうか?
xxx.cgi?530=dqn&1=sine これで出来るじゃん。
532 :
名無し募集中。。。 :02/07/01 21:57 ID:POquGnWB
>>531 レスどうもです。
すいません、getじゃなくて、postっていうの忘れてました。
533 :
名無し募集中。。。 :02/07/01 22:03 ID:POquGnWB
ムリなんかなぁ。。。
無理だと思われ。
535 :
名無し募集中。。。 :02/07/01 22:08 ID:POquGnWB
>>574 マジっすか。さんくすこ。
あと、折角きたんでもう少し知恵貸して頂いていいっすか?
うむ。
537 :
名無し募集中。。。 :02/07/01 22:11 ID:POquGnWB
やろうとしてるのは、シタラバで板の変更に際してスレッドを移動させたいんで 旧板のスレから名前とレス抜き出して、外部から新板にカキコ。 とりあえず、gabri dukeと外部のhtmlでsubmitおしての投稿は成功したんで なんとかperlで自動的に書き込みって可能にならないっすかね?
538 :
名無し募集中。。。 :02/07/01 22:12 ID:POquGnWB
>>536 どもです。537っす。読みにくい文章でスマソ。
539 :
名無し募集中。。。 :02/07/01 22:19 ID:POquGnWB
ムリポでしょうか?
漏れにはわからないけど、ほかの人はわかるかも。 またーり待たれることを推奨する。
541 :
名無し募集中。。。 :02/07/01 22:23 ID:POquGnWB
542 :
nobodyさん :02/07/01 22:40 ID:133+Yg1+
>>537 logファイルを移動するだけじゃダメなの。
手軽にPOSTするなら毎度おなじみLWP::UserAgentかな…。 perldoc lwpcook読んでみなはれ。
544 :
名無し募集中。。。 :02/07/01 22:43 ID:POquGnWB
>>542 管理人が板放棄したんで糞スレ乱立、勝手に板移転するんす。。。
>>543 さんくす、調べてみるっす。
545 :
名無し募集中。。。 :02/07/01 23:09 ID:POquGnWB
むずい、、、。postのcgi間のデータ受け渡しとLWP::UserAgentを 説明してるページ教えていただけると助かりまふ。おながいします。
>526 なんかうまく言ってない気がします。 マップのデータを1行づつ配列につっこんでやればできるのだろうか…
>>545 自分のBBSに移すなら直接LOG弄ってアプ出来ないの?
つーか連続投稿如きでLWP使わなくて良いと思うけど
LixyとかChannnelとかの厨房ツール拾って来てそれ弄れば良いじゃん?
>547 「なんかうまくいってません」←コレ典型的な厨の応答だよ? そんだけじゃ、読んでるこっちには何もわかんないのよ。 バカが直るまでお前は発言禁止。
550 :
nobodyさん :02/07/02 12:05 ID:uXcHDU9t
>>547 「だろうか…」 ←これもな。独り言を書くな。
>>547 それに加えて526のソースも厨だからしょうがないか。
>>544 ふつーLWPでGETしてログ再生成、んでもってうpだろうが。
>>549-550 すいません厨丸出しでした。
ちょっと質問の仕方を変えてみます。(526さんのだと特定の組み合わせしかだめっぽかったので)
マップデータが(例えばです。)
@map = (
'0000000000',
'1111111111',
'2222222222',
'3333333333',
'4444444444',
);
と入っている場合に
>>524 のようなことがしたいです。
>>553 部分マップを別配列に切り出す方向で考えてみた。
my $map_width = length($map[0]);
my $map_height = scalar(@map);
sub max { $_[$_[0] < $_[1]]; }
sub min { $_[$_[0] > $_[1]]; }
sub trim_map {
my ($x, $y) = @_;
my $x1 = max(0, $x - 2);
my $x2 = min($map_width, $x + 2);
my $y1 = max(0, $y - 2);
my $y2 = min($map_height, $y + 2);
return map { substr($_, $x1, $x2 - $x1 + 1) } @map[$y1 .. $y2];
}
my @mini_map = trim_map(5, 3);
print "$_\n" foreach @mini_map;
555 :
553 :02/07/02 17:53 ID:???
>>554 うまく動いてるみたいです。ありがとうございました。
みたい?(w
557 :
526 :02/07/02 20:12 ID:???
結局何がうごいてなかったんだ・・・だいたい一緒に見えるんだがなぁ。
初心者です。よろしくお願いします。 $host = $ENV{'REMOTE_HOST'}; で取得したホスト名$hostがaaa.bbb.ccc.dddとなっている場合に bbb.ccc.dddの部分だけを表示する方法を教えてください。
=~ s/.*\.(.*\..*\..*)/$1/;
560 :
558 :02/07/02 23:20 ID:???
>559 さん ありがとうございました。
($host)= $ENV{'REMOTE_HOST'}=~ /^[^\.]+\.(.*)$/;
1.更新履歴のページを作成しましたが、HTMLにして、更新の度に手を加えるのは面倒なので、cgiにしました。 第三者からは見れない入力ページから文章を打ち込み、公になるのはcgiが吐き出した更新履歴ページのみ。 2.で、スクールに通った時作成した、掲示板を改良したが、タグが禁止なのと、<br>が吐き出されて改行位置がおかしくなるので、 以下の処理を丸ごと削除しました。 foreach($text1,$cont){ s/&/&/g; s/"/"/g; s/</</g; s/>/>/g; s/\r\n/<br>/g; s/\n/<br>/g; s/\r/<br>/g; s/,/、/g; } 3.構文エラーはなく、動作はしますが、一行置きに改行が入ったり、更新する度に一番新しい記事が何度も表示されたり と言った具合でお手上げです。超初心者ですみません。この部分だけでは判断できないものでしょうか? 何か解決策ありましたらよろしくお願いします。
それだけじゃ、良く解らないよ。取り敢えず、<br>の置き換えだけ残せや それと、君の質問内容だと perl がほとんど解ってないように見受けられるし、 基本的な所から勉強しようという姿勢も見られないから、まともな解答を 得るのは難しいと思われ
>>562 s/**/**/g;
↑は確かに置き換えだが、置き換えられた結果がどこに行っちゃうのだろう。
$_
566 :
nobodyさん :02/07/03 12:35 ID:6OBUBtca
クエリーで送られてきた複数のvalueの値だけを切り出したいですが うまくいきません。どうすればよいですか? $buffer = $ENV{'QUERY_STRING'}; @buf = split( /&/ , $buffer ); foreach $data ( @buf ){ ( $name , $value ) = split( /=/ , $data ); };
>>566 なんで初心者に限って自分でやろうとするのかね。
素直にCGI.pmかcgi-lib.plあたり使え!
$buffer = $ENV{'QUERY_STRING'}; @buf = split( /&/ , $buffer ); foreach $data ( @buf ){ ( $name , $value ) = split( /=/ , $data ); $FORM{$name} = $value; };
@list = values %FORM
cgi-lib.plのコードって効率悪いな。 もう過去の遺物か?
>>570 じらすためにわざと効率悪くつくってあることもしらないの?
572 :
566 :02/07/03 13:20 ID:6OBUBtca
>>567 なんと便利なものが・・・知りませんでした
勉強してみます。
>>568-569 それで漏れのヴァージン作品がやっと動きました。感激
Thanx ALL
573 :
562 :02/07/03 15:37 ID:???
>>563-564 どうもすいませんでした。
perlは確かに初心者ですが、何ぶん急いでたもので、、。
御指摘もっともです、すみません。もうちょっと初歩から勉強してみます。
ちなみに改行の件はperlの方ではなくhtmlの
<textarea>タグ内のwrap="hard"をとったら、解決しました。
出直してきます。
>>570 最適化してうpキボン
できればの話だけどね
>できればの話だけどね ( ´,_ゝ`)プッ
最適化なんかしないでそれくらい自分で書けよ。 書き方わかんなきゃ検索でもしてみろ。2510件ヒットしたぞ。 まぁ、ほとんどはたいしたこと書いてないページだが比較的ましなページが 3つほどあるだろう。
578 :
nobodyさん :02/07/04 06:54 ID:wzRa2QN/
i-modeで動くCGIでリンク元へ戻るボタンを付けたいのですが JavaScriptのrefferが使えないので困っています 他にはどんな方法がありますか? 教えて下さいおながいします。
579 :
578 :02/07/04 06:58 ID:wzRa2QN/
付けたし説明です どのページに戻るかは、そのときによって違いますので <a herf="リンク元のURL">は使えません
580 :
nobodyさん :02/07/04 07:17 ID:M5QBoHcZ
WindowsXP HomeEdition に
ActivePerl-5.6.1.633-MSWin32-x86.msi
をインストールして
start ppm3 install
http://www.activestate.com/PPMPackages/5.6plus/DBI.ppd とすると
Can't call method "name" without a package or object reference at D:/ActivePerl/561/site/lib/PPM/UI.pm line 984.
と言うメッセージが出てモジュールのインストールが出来ません。
ActivePerl-5.6.1.633のppm3に何か欠陥があるのでしょうか?
何か私が大間違いをしているのでしょうか?
情報あれば教えてください。
581 :
:02/07/04 07:42 ID:???
>>578 こういうこと?ちょっと意味がわかりません
<A href="javascript:history.back()">
583 :
578 :02/07/04 08:19 ID:wzRa2QN/
>>581 レスありがとうございます
リンクフリーのcgiなので
何ページからリンクされるのか、
どこからリンクされるのかもわからないんです
>>583 REFERER取れないんだからどこから来てるかはわからんよ。仕方ない。
BACKボタンで戻ってくれとかいう説明を書いといたら?
585 :
nobodyさん :02/07/04 10:01 ID:n+YIWuSL
file.txt 000 111 <!----> 222 333 <!----> 444 555 <!---->で区切っている部分を3つに効率よく 切り分けるにはどうしたら良いですか? 元のデータは後で利用しない 分けた変数は$,@どちらでも良い 3パターンあるのですが、より効率のよい コーディングを教えてください
586 :
nobodyさん :02/07/04 10:01 ID:n+YIWuSL
open(FH,file.txt); $line = join('',<FH>); colse(FH); ($top,$middle,$buttom) = split /<!---->/,$line; open(FH,file.txt); $/ = '<!---->'; while(<FH>){ $i++ $top = $_ if $i == 1; $middle = $_ if $i == 2; $bottom = $_ if $i == 3; } colse(FH); open(FH,file.txt); $j = \@top; while(<FH>){ if (/<!---->/) { $i++; if ($i == 1) { $j = \@middle; next; } if ($i == 2) { $j = \@bottom; next; } } push(@$j,$_); } colse(FH);
>>582 i-modeではJavaScriptが使えないんです
>>584 漏れのスキルでは妥当な線ですね
>>588 なんだか使えそうな・・・それ調べてみます
みなさん有難うございます
いやだからi-modeとかJ-SkyWebは基本的にHTTP_REFERER吐かないってば。 吐く端末もあるけど少数だし。Ezwebはやろうと思えば出来たような気が しないでもない。携帯端末で普通にREFERER吐くのはドットiだけだった と思う。
>>590 なるほど、HTTP_REFERERも無理ですか、
「バックボタンで戻ってください」と書く方向にします。
>>593 ..演算子はありますが、...はなんだろう?
>>597 >line 4 ...
意味が読めないよ。
596 :
585 :02/07/04 20:34 ID:???
>>587 すいませんがもっと詳しく書いていただけると
ありがたいです。
>>592 この中では3番目が一番効率よさそうですが
人のソースのもろコピペになってしまうので
あんまり使いたく有りません
別の方法があったらぜひ教えてください
>>596 こんなのはどうすか。586の最後のやつと同じだけど、ややすっきり。
my @arrays = (\@top, \@middle, \@bottom);
my $i = 0;
while (<FH>) {
$i++ if /<!---->/;
push @{$arrays[$i]}, $_;
}
>>596 笑った。
別の方法を教えてもらっても、ソースのもろコピペには変わりないんじゃないのか?
599 :
nobodyさん :02/07/04 21:42 ID:gX+umWUs
$name が りんごなら$imgにappleを入れたいのですが、これであってますか? if ($name eq "りんご") {$img = apple ;}
600 :
nobodyさん :02/07/04 21:46 ID:zS7n4jKK
>>599 if ($name eq "りんご") {$img = "apple" ;}
601 :
nobodyさん :02/07/04 21:58 ID:gX+umWUs
602 :
585 :02/07/04 22:05 ID:???
>>598 同じことをするプログラムで
処理まで一緒だとパクリになるので
別の方法は無いかと思って
同じカテゴリーのプログラムが
少ないので同じものを使うと
すぐ分かってしまいます
この処理のやり方が肝になっているので
603 :
585 :02/07/04 22:12 ID:???
>>597 だいぶスマートに出来ていますね
ありがとうございます
>>602 書き方変えても処理同じにするんだからきみの嫌うパクリになるんじゃないか?
パクリが嫌ならソースを教えてもらう前に自分で勉強しろ。
605 :
nobodyさん :02/07/04 22:37 ID:ru7/Ktro
データをhtml化してログに残すやり方を教えて下さい。 すみません、うまく説明できないのですが宜しくお願いします。
データを読み込んで、HTMLを付加して、ファイルに出力。
607 :
585 :02/07/04 22:49 ID:???
>>604 603は考えて下さった御礼という意味です
ちなみに私は
出てくるものは同じでも、実装方法がちがったら良いのじゃないか
と思っています。
全く同じものを作っても面白みが無いので、+αはしますが
(商業関係は別です特許が絡んでくるし)
>パクリが嫌ならソースを教えてもらう前に自分で勉強しろ。
>>604 の勝ち
609 :
nobodyさん :02/07/04 22:53 ID:gX+umWUs
秀丸などの改行を取りたいのですが、どうやって取ったらいいのでしょうか?
秀丸の改行ってなんだ?
611 :
nobodyさん :02/07/04 22:56 ID:gX+umWUs
秀丸だったら文の最後の↓です。
612 :
nobodyさん :02/07/04 22:57 ID:GRf17RXg
<A HREF="$url">$url</A> と
<A HREF="tel:$tel">$tel</A> があるんですが、
Phone to機能のない方だけに、cgiをくっつけたいんですが、
$myd = "
http://www. ○○○.co.jp/";
if ($myd =~ /<A HREF=\"/) {
$myd =~ s/(\<A HREF=\")(tel:)/moji($1.$2)/eg;
}
moji($1.$2) {
if (!$2) {
$myd =~ s/(\<A HREF=\")/$1test0701_2.cgi?$query/ g;
}
}
print $myd;
うまく切り分けられません 泣)
>秀丸だったら文の最後の↓ Ans ↓の前にカーソルを移動させ[Delete]キーで改行が外れます
614 :
nobodyさん :02/07/04 23:02 ID:gX+umWUs
>>613 そうじゃなくて、プログラムの中で実行したいのですが・・・。
>>614 質問の仕方をまず覚えれ
秀丸などの → テキストファイルの
616 :
nobodyさん :02/07/04 23:08 ID:gX+umWUs
>> 616 s/\n//
619 :
nobodyさん :02/07/04 23:18 ID:gX+umWUs
$nameが千葉か神奈川か東京ってこれでいいんですか? if ($name eq "千葉" or "神奈川" or "東京")
>>592 すみません、気付けません(鬱
教えて下さい
if (($name eq "千葉") or ($name eq "神奈川") or ($name eq "東京"))
622 :
nobodyさん :02/07/04 23:23 ID:gX+umWUs
>>621 何度もすみません。ありがとうございました。
マウスが乗ると音が鳴るタグを教えてもらえませんか
>>619 もう解決してるみたいだけど、orと||の優先順位に違いを考慮して
if ($name eq "千葉" || "神奈川" || "東京")
こうだと大丈夫だと思うよ。
>>627 =629?
Perlを理解していない典型だね。
632 :
629 :02/07/05 04:12 ID:???
633 :
長文 :02/07/05 06:14 ID:xwCvs6jw
1:自分はこう言う事がしたい。 フォルダの中に、 「番号」「単語」「単語の解説」の入ったデータファイルがいくつかあります。 そのデータファイルをまとめる親データを作りたいです。 親データには、 単語に対応する番号を単語を辞書的にソートしたものを入れたいです。 具体的には ファイル1→01 モナー 「オマエモナー」 ファイル2→02 ギコ 「逝ってよし」 ファイル3→03 ジサクジエン 「イイ!」 親データ→02 03 01 みたいな感じです。分かりづらいでしょうか、、 長文すぎたようなので分割します;
634 :
長文2 :02/07/05 06:15 ID:xwCvs6jw
2:それでこんな風にやってみたが・・・ $cufld = './'; opendir(DIR, $cufld) or die; @file1 = sort readdir(DIR); closedir(DIR); で、フォルダの中のファイルをリストアップして foreach (@files) { で、ファイルをひとつひとつ開いて open(IN,"$_"); $data = <IN>; close (IN); ($ind,$word) = split(/\t/, $data); push (@word , $word); $NO{$word} = $ind; } foreach (sort { $a cmp $b } @word){ print "$NO{$_}\t"; } という風に出力したかったんですが、 3:それだとこんなエラーが出て上手く行かなかった。 なんだかopendir〜の所で止まってしまいます。 ディレクトリのパーミッションは777にしてるんですが 他にこうやった方が、とか根本的にここが間違ってる、とか いうところがあったら指摘お願いします。
>>634 @file1を表示してみれば分かるんだけど、opendir() は実際のファイルのほかに
「. (カレントディレクトリ)」「.. (ひとつ上のディレクトリ)」も含まれる。
なのでgrepでもかけて実際のファイルだけ取り出してやらないといけない。
っていうか @file1 と @files って・・書き間違い? (@file1 = @files ?)
あと $cufld = './'; だと、このCGI自体も含まれると思うんだけど。
637 :
長文 :02/07/05 07:22 ID:xwCvs6jw
>>635 @file1は写し間違いでした。すみません
grep、調べてみました。頭に入れときます。
>>636 そうですね、自身も含まれちゃうんで
ファイル名ではじこうと思います。
でも、@filesを表示する以前に
opendir()でdieしてるみたいなんですが……
ローカルでも、アップした状態でもやってみましたが
結果は同じでした。
環境によっては使えないとか、そういうことってあるんでしょうか。
サーバはxreaを使ってます。ローカルではMacのWEB共有です。
638 :
長文 :02/07/05 07:24 ID:xwCvs6jw
なんだか連続で質問になってしまってすみません こんな時間にありがとうございますです。
639 :
nobodyさん :02/07/05 07:26 ID:q2MOJvqj
質問です $line = join('',@lines); $line = s/***/****/g; for (0 .. $#lines) { my($tmp) = $lines[$_]; $tmp = s/***/****/g; $line .= $tmp; } どちらが最適か教えて下さい。 (元のデータは残しておく)
>>639 Benchmark使ってみろ。
そうすればどっちを使うべきかは一目瞭然。
#!/usr/bin/perl -w
use Benchmark;
use IO::File;
my @lines = IO::File->new(__FILE__)->getlines;
timethese 100000 => {
1 => sub{
my $line;
$line = join('',@lines);
$line =~ s/$/:/g;
},
2 => sub{
my $line;
for (0 .. $#lines) {
my($tmp) = $lines[$_];
$tmp = s/$/:/g;
$line .= $tmp;
}
},
};
641 :
:02/07/05 12:27 ID:L0bSs9Ak
mod_perlで掲示板を動かしていますが、mod_perl用のディレクトリにある画像を利用出来なくて悩んでいます。 mod_perl用のディレクトリ以下にあるファイルは全てCGIとして使われちゃうと聞きました。 他のディレクトリに画像を移そうかとも考えましたが、スクリプトの修正個所が多くて大変なんです。 Apacheのhttpd.confの設定とかで利用できる用に出来ませんか?
質問ですが、指定したディレクトリ内にあるファイル名を全部配列に格納したいです。 できるならやり方を教えて下さい。
>643 opendirとreaddirを使う。 使い方は自分で調べてみよう。
opendir(DIR, dir); @readlist = readdir(DIR); closedir(DIR); ただ、 . と .. も入るから注意。って、他にもあったな、やりかた。
opendir(DIR,$dir); @readlist = grep ! /^\.\.?$/, readdir(DIR); closedir(DIR);
sub filescan { my @dir; opendir( DIR, $_[0] ) || return 0; @dir = grep( !/^\.\.?$/, readdir( DIR ) ); closedir( DIR ); foreach ( @dir ) { if ( -d "$_[0]$_\/" ) { push( @all, "$_[0]$_\/" ); &filescan( "$_[0]$_\/" ); } else { push( @all, "$_[0]$_" ); #print "$_[0]$_\n"; } } return 1; }
648 :
nobodyさん :02/07/05 23:25 ID:St7kmpIx
sub function { } とかくバカは死ね
opendir(DIR, $dir); @readlist = readdir(DIR); closedir(DIR); splice(@readlist, 0, 2);
効率を気にしなくていいときは @readlist = <*>; を愛用してる。こっちは逆にドットファイルが出てこないけど。
おまえ邪魔。
アナル → <*>
654 :
643 :02/07/06 13:09 ID:???
ありがとうございます。 ファイルの取得ができました。 さらに、この配列を、最終更新日時順にソートする、、なんてことはできますか? よろしくお願いします。。
>>654 少 し は 勉 強 し よ う っ て 気 は な い の か
656 :
Saru :02/07/06 13:21 ID:CFBQ9es6
Perlでテキスト処理に関して、2桁の数字だけを削除したい場合は どのようにかいたらいいんでしょうか? 今は s/[0-9]{2}//g;と書いてます。 1桁の数字は残しておきたいんですが…。 どなたかヒントでもよいので教えてください。お願いします。
s/^[0-9]([0-9])$/$1/g;
658 :
Saru :02/07/06 14:16 ID:CFBQ9es6
>657さん 困っていたのでとても助かりました。 どうもありがとうございます!
s/(\D)\d{2}(\D)/$1$2/g;
今クリック数をカウントするCGIを作ってるのですが、
クライアントから送られてくるデータが
id=1&url=
http://www.***.com/ だったばあい、
$idの中身を1に
$urlの中身を
http://www.***.com/ にしたいのですが、今は
$data = $ENV{'QUERY_STRING'};
@data = split(/\&/,$data);
$id = $data[0];
$url = $data[1];
%id = split(/\=/,$id);
%url = split(/\=/,$url);
となんとも効率が悪いやり方なのですが自分の知識ではこのようにしか
やり方が分からないのですがもっといいやり方は無いでしょうか?
それともし$dataに「&と=」が無かった場合はexitで終了させたいのですが
どのように調べればいいのでしょうか?
よろしくお願いします。
$buffer = $ENV{'QUERY_STRING'}; if (($buffer !~/&/ )&&($buffer !~/=/){exit;} local(@pairs) = split(/&/,$buffer); foreach $pair(@pairs){ local($name,$value) = split(/=/,$pair); $FORM{$name} = $value; }
) がひとつ足りなかった。
&と=が正規表現で調べることが出来ることは分かったのですが、 $FORM{$name} = $value; これは%FORMというハッシュの中にkeyが$nameでvalueが$valueというのを 代入してる処理なんでしょうか?
local(@pairs) = split(/&/,$buffer);
この処理で、
id=1&url=
http://www.***.com/ を
id=1 url=
http://www.***.com/ に分割し(@pairsに)
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
で それらをさらに分ける。
$FORM{$name} = $value;
は
$FORM{id} = 1;
$FORM{url} =
http://www.***.com/; になるから%FORMに入れられる。あとはこれらを自由に処理するだけ。
>>664 なるほど。理解できました。ありがとうございます。
ちなみにローカル変数はサブルーチン内で使うものでわなかったでしょうか?
サブルーチン化したほうがいいのでしょうか?
666 :
Saru :02/07/06 15:21 ID:CFBQ9es6
>659さん こちらは2桁ともに削除できるんですね。 勉強になります…!ありがとうございます。
ちなみに split(/=/,$pair); これは =の前に\を入れてエスケープするんですよね?
エスケープしないで使ってる人が多いな。 たいていはサブルーチン化して、GETもPOSTも対応してる。 local($pair,$buffer); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } local(@pairs) = split(/&/,$buffer); foreach $pair (@pairs) { local($name,$value) = split(/=/,$pair); $FORM{$name} = $value; }
669 :
nobodyさん :02/07/06 16:42 ID:up0NZwlm
open(FILE, "./log.log") で作成したログのパーミッションが 644 で生成されるんですが、 これを 600 で生成されるようにするにはどうすればよいでしょうか? CGIはユーザー権限で動いています。 おながいします。
まちがった・・ open(FILE, ">./log.log") でした
672 :
nobodyさん :02/07/06 16:51 ID:up0NZwlm
>>671 umask関数ですね。検索して調べてみます。
673 :
669 :02/07/06 17:06 ID:???
umask 066; でできました。
>>671 さんありがとうございました。
674 :
nobodyさん :02/07/06 17:42 ID:stglrVc7
open,umaskとするよりsysopen使うのがおすすめだぞ。 openよりはセキュアかもだしな。
675 :
669 :02/07/06 18:30 ID:???
>>674 もうできたからいいよ。っつーか書くのがおせーよ!
氏ね!
677 :
nobodyさん :02/07/06 21:50 ID:pjFxin79
perl初心者です。Activeperlのプログラムを動かしてInternetExplorerを起動したいんですが どのようにすればよいでしょうか?
exec(C:\Program Files\Internet Explorer\IEXPLORE.EXE); `C:\Program Files\Internet Explorer\IEXPLORE.EXE`
679 :
nobodyさん :02/07/06 23:30 ID:Jm7Ff5yb
レンタルサーバーでsendmailが使えない場合、ほかにメールを送る方法ってありますか?
Net::SMTP
681 :
nobodyさん :02/07/07 01:52 ID:iHDNP1fk
JavaScriptをperlに書き換えたいのですが ★の部分の書き方がわかりません。(ぺこり) 他も間違いありましたら教えて下さい。 ------------------------------------- functuon myfun{ P=document.F.E1.value+document.F.E2.value+document.F.E3.value; T=0; for(i=0;i<P.length;i++){T=T+eval(P.charAt(i))} if((T==11)||(T==22)){document.F.E4.value=hoge[T]} else{while(T>=10){T=T-9;} document.write(hoge[T]) } ----------------------------------------- foreach $data ( @buf ){ ( $name , $value ) = split( /=/ , $data ); $FORM{$name} = $value; @list = values %FORM }; $P = $list[0]+$list[1]+$list[2]; $T = 0; for($i=0; $i<★; $i++){$T=$T+★($i)}; if(($T==11) || ($T==22)){$list[4]=hoge[$T];} else{while($T>=10){$T=$T-9;}} print "hoge[$T]";
>>681 せめて変数が何あらわしてるかぐらい書け。
683 :
681 :02/07/07 02:18 ID:iHDNP1fk
>>683 整数
document.F.E1.value
document.F.E2.value
document.F.E3.value
計算をするための作業用の変数
P
T
Pのlengthを取得するためのカウンター用の変数
i
他のはformに入力された値を取得するための変数です
とりあえずこんな感じ for($i=0; $i<★; $i++){$T=$T+★($i)}; ↓ for($i=0;$i<length($P);$i++){$T=$T+substr($P,$i,1)}
685 :
681 :02/07/07 08:45 ID:???
>>684 さん
おはようございますっ♪
あ〜感謝!うれしいです。
686 :
nobodyさん :02/07/07 12:56 ID:xpVArwn6
「
http://サーバー名/CGIスクリプト名?データ 」で実行し、
データの受け渡しをするプログラムを作っているんですが、
他のURLへジャンプさせるときに、
<A HREF="
http://***/CGIスクリプト名?ジャンプ先URL ">ジャンプ</A>
としたいんですが、ジャンプ先URLをフルパスで出せるようにするには
どうしたらいいですか?以下がつくった内容です。
my($encoding) = @_;
my($method) = $ENV{'REQUEST_METHOD'};
if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; }
elsif ($method eq 'POST') { read(STDIN, $query,
$ENV{'CONTENT_LENGTH'}); }
local(@query) = split(/&/, $query);
foreach (@query) {
tr/+/ /;
($key, $val) = split(/=/);
$key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/\r\n/\n/g;
$in{$key} = $val;
}
my $req = new
HTTP::Request POST => $val;
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');
my $res = $ua->request($req);
if ($res->is_success) {
$myd = $res->content;
$myd =~ s/(\<A HREF=\")/$1test.cgi?/g;
print $myd;
} else {
print "No!";
}
今の状態ですと、
$myd =~ s/(\<A HREF=\")/$1test.cgi?/g;
をやると、
<A HREF=test.cgi?test/index.html> というような感じになって
<A HREF=test.cgi?
http://www.***.co.jp/test/index.html >
というような形になりません。
入力データをハッキリと明示しないと答えようがないだろ。 入力データをハッキリさせたら正規表現スレで質問すべき問題だろ。
688 :
nobodyさん :02/07/07 20:52 ID:ZrDEUCOM
リンクを表示させるだけなら $link= qq(<A href="CGIのURL?$ENV{'QUERY_STRING'}">XXXへのリンク</A>);
フォームから入力された文字の最大数を制限するとか、 半角数字以外が入力されたらエラーメッセージを返すとか どう呼ぶのかわからないのですが、 よく使われる処理のモジュールというかライブラリーと言うのか そんな感じのものを探すにはどうしたら良いですか? googleしてみましたがキーワードが甘いらしく見つかりませんでした
691 :
nobodyさん :02/07/08 16:38 ID:ZsVGz1/q
age忘れました
文字数を制限するなら、$ENV{'CONTENT_LENGTH'}の値を見るとか。 送られてきたデータが /[^0-9a-zA-Z}/ 以外なら die とか。
693 :
nobodyさん :02/07/08 16:45 ID:ZsVGz1/q
超即レス thank you!です。
694 :
nobodyさん :02/07/08 17:12 ID:E09xqBbE
たとえば(3,3,10,6,1)という配列があって、コレをソートすると 1 3 6 10と返ってきてしまうのを、どうにかして 1 3 3 6 10にできないものでしょうか・・・?
>>694 @data = (3,3,10,6,1);
@sort_data = sort
{
$a <=> $b;
} @data;
696 :
nobodyさん :02/07/08 22:12 ID:Hy1uHDxp
> 689 それだと、受け取ったURLそのまま出ちゃうんじゃないかい?
697 :
nobodyさん :02/07/08 23:54 ID:HDd0iUwW
ARGVって何?どうやって読むの?アーグブイ?
ARGment Value
argument だた。。。
麻酔をせずに歯を削られているような気分で、 「アァァァーグヴィ!」 じゃなかったっけ?
なるほど納得!
702 :
:02/07/09 00:21 ID:???
SOCKET使って外部のCGIにPOSTしてみたいのですがなかなかうまくいきません。
FORMを取得して
$post_mes="
[email protected] &wcomment=test";
って感じにして(多分ここが違う?)
# POST
print SOCKET "POST $check_host HTTP/1.1\r\n";
#HTTP_REFERERを送信
print SOCKET "REFERER: $referer \r\n";
#User-Agentを送信
print SOCKET "User-Agent: $agent \r\n";
print SOCKET "X_FORWARDED_FOR: $xfor \r\n";
print SOCKET "Accept: */* \r\n";
print SOCKET "Accept-Language: ja \r\n";
print SOCKET "Accept-Encoding: gzip \r\n";
print SOCKET "\r\n";
print SOCKET "Content-Type: application/x-www-form-urlencoded\r\n";
print SOCKET "Content-Length: $length\r\n";
print SOCKET "\r\n";
print SOCKET "$post_mes\r\n";
みたいな感じでやってみたんですが駄目でした。
なんの反応もないみたいです。
なお、いたずら目的ではありません。Perlも自分のPCで動かしてます。
703 :
:02/07/09 00:23 ID:???
705 :
702 :02/07/09 00:27 ID:???
ひょっとして外部からPOSTしては駄目なのでしょうか? すいません。よく知らなくて・・・
>>702 lwp 使った方が楽だと思われ。使えない環境?
707 :
702 :02/07/09 00:39 ID:???
>>706 lpwってのはよくわからないです・・・
環境はWinでPerl5です。
708 :
. :02/07/09 00:41 ID:???
掲示板荒氏用のスクリプトでも参考にしなさい。
709 :
. :02/07/09 00:42 ID:???
>>707 検索ぐらい汁。
もっとも、"lpw" ではないが。
710 :
702 :02/07/09 00:45 ID:???
>>708 dukeとか言うのですよね。探してみます
>>709 すいません。
lpwで検索してもよくわかんないと思ったらlwpだったんですね・・
何の反応も無いじゃ解らん print while(<SOCK>); ってして、どんなレスポンス帰って来てるのか読んでみ
712 :
702 :02/07/09 04:02 ID:???
教えて下さった方、ヒント下さった方、ありがとうございました。 なんとかPOSTできました。
>>698 違う
ARGV = ARGuments Variable
だろ。
Value = 値
Variable = 変数
少しは勉強しろ
>>713 ..... argument vector
715 :
121 :02/07/09 21:35 ID:7t2WvFst
716 :
nobodyさん :02/07/09 22:15 ID:jsAirJtA
@data=(1,2,3,11,34)の様な配列が、あった場合 0〜99の数字で(1,2,3,11,34)を含まない、配列を得るにはどうしたら良いのでしょうか? 例えば、(4、5、12)
717 :
nobodyさん :02/07/09 22:19 ID:lugOGira
GETかPOSTかメソッドを判別し、 & と = をsplitして文字コードを変換したんですが、 local(@query) = split(/&/, $query); foreach (@query) { tr/+/ /; ($key, $val) = split(/=/); $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/\r\n/\n/g; $in{$key} = $val; } 送られてくるデータの引数が複数ある場合は、このほかに 何かつけ加えなければならない?
local($pair,$buffer); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } local(@pairs) = split(/&/,$buffer); foreach $pair (@pairs) { local($name,$value) = split(/=/,$pair); $FORM{$name} = $value; }
=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg;
>>716 答え教えるの面白くないからヒントね
@data = (1, 2, 3, 11, 34);
for ( 0..99 )
{
foreach ( @data )
{
push
}
}
>>716 4, 5, 12を除いてみた.
%exclude = (4 => 1, 5 => 1, 12 => 1);
@data = grep { !$exclude{$_} } 0 .. 99;
722 :
721 :02/07/09 22:39 ID:???
723 :
nobodyさん :02/07/09 22:40 ID:lugOGira
> 719 それってどういうこと? よくわかんない…、スマソ
=~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; より、 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg; の方が早いって言いたいんじゃない?
725 :
716 :02/07/09 22:51 ID:???
>>720 >>721 こんなに、すぐレスくれるなんて思っていませんでした。
有り難う御座います。
これから、考えてみます。なにせ初心者な物でチンプンカンプンです。
726 :
ヽ(`Д´)ノ ウワァァン :02/07/09 23:29 ID:gcNlx8b2
Win2000pro上でwwwサーバーを起動するところまではできたのに CGIファイルをエクスプローラーで見ようとすると文字化け! ヽ(`Д´)ノ ウワァァン レンタルサーバー上にアップしたら文字化けしないのに! ヽ(`Д´)ノ ウワァァン
>>726 print "Content-type: text/html; charset=Shift_JIS\n\n"; ヽ(´∀` )ノ
728 :
:02/07/10 00:48 ID:Q4ccJnsM
パールって、 $a = 10; だと $a2 で 20 になるのですか?
729 :
:02/07/10 00:51 ID:???
730 :
. :02/07/10 01:09 ID:???
ソース見てたらなんとなくそう思ったのです。 本当なの? $a2 って変数は使えないの?
731 :
nobodyさん :02/07/10 01:13 ID:fQbDc9qZ
パスワード入力みたいのでさ 入力した文字を****と表示して さらにクッキーにも****と記録するにはどうすればいいの? …別に使う訳じゃないんだけど興味。
$a + 2 足し算 $a - 2 引き算 $a * 2 掛け算 $a / 2 割り算
734 :
nobodyさん :02/07/10 01:15 ID:fQbDc9qZ
おもったけどさ、削除パスを暗号化する前にいったん別ファイルに記録しとけばそいつがのホームページの掲示板の管理パスとかフリーメールにログインできたりするよな
>735 全てのパスワードを同じ物にするようなマヌケな奴相手ならな。 まぁ、マヌケが多いのは確かだが。
>>738 ユーザは性アフォ説で接していかないと・・・。
740 :
nobodyさん :02/07/10 10:21 ID:9iF/zPMp
数字以外が入力されたらエラーメッセージを出したいのですが うまくいきませんでした どうすれば良いですか? #入力されたのが数字かどうかチェック if($P eq /[^0-9]/){print "数字を入力してください。";} else{ if($P == /[^0-9]/){print "数字を入力してください。";} else{
正規表現使うときは、 =~ // だろ。
742 :
740 :02/07/10 14:18 ID:lBfYsgML
>>714 できましたーーー!!
ありがとうございます
744 :
740 :02/07/10 16:33 ID:???
(≧∇≦)
404とかのエラーコードを吐き出させるのってどうやるのですか?
747 :
746 :02/07/10 17:14 ID:???
あ、分かりました。
>>740 /[^0-9]/ → /^[0-9]+/
>748 それだと意味が変わるぞ。 >740の書き込みとif文の構成をよく見ろ。
>>748 それやるなら、
if ( $P !~ /^[0-9]+/ ) { }
か
unless ( $P =~ /^[0-9]+/ ) { }
じゃないと。
>>746 .htaacessでやるんじゃなかったっけ?
>>752 トリッパー使って3時間ほどadminで検索してたら偶然SE付きのがHITしますた
$fied[1]にはいってるすべての文字列【日本語含む】を@にしたいとき $fied[1]=~tr/a-zA-Z_0-9\/.\n?-!"#$%&'()\=~|\{\`\+\*}_?><,\/\\\];@\[\\^-/@/cs; ↑このように書くしかないんですかね? [a-zA-Z_0-9]以外の文字ぜんぶをあらわす特殊変数みたいなのありませんか。
755 :
nobodyさん :02/07/10 22:03 ID:01h+ntYo
[a-zA-Z_0-9]以外って、 [^0-9a-zA-z\_]じゃだめなの?
\W
>>750 !~ /^[0-9]+$/ のほうがさらに
=~ /\D/ じゃだめなの?
759 :
nobodyさん :02/07/10 23:26 ID:PCSWC5jP
CGIにデータを渡すときに、URLエンコードをしようとして $arg =~ s/(\W)/'%'.unpack("H2", $1)/ego; のunpack関数を使ってみたんですが、これだと、 最初の文字1文字しかエンコードされないですよね? 例えば、 $arg=test.html?list=リスト&name=名前 なんかだと、最初の「リ」だけじゃなく、 「リスト」と「名前」の該当する文字全部が 変換されるようにするには、どうしたらいいですか?
o が余計。
一度だけコンパイルか
762 :
:02/07/11 00:28 ID:???
(・w・)ブハッ! ワラテシマタ
(・∀・)ニヤニヤ
>>760 ,
>>761 君たちは勘違いをしている。s/foo/bar/という構文の中で正規表現は
"foo"の部分だけなので例え"o"オプションをつけたからといって"bar"
のほうにはなんら意味がない。"o"は「正規表現」を一回だけコンパイル
するオプションであって置換内容をコンパイルするものではないという
事だす。
my $target = "AAAcccAAA";
for my $replacement ( qw/ bbb ddd / ) {
my $tmp = $target;
$tmp =~ s/ccc/$string/go;
print $tmp, "\n";
}
ヘッダとボディの区切りがもう出力されたかどうかどうやって調べるの?
↑こいつは一体何を言いたいのかさっぱり解らない こっちから、また尋ねないと解らないような質問ヤメテくれ
>>768 説明がおかしかったですか。。例えば、
print "Content-type: text/html;\n\n";
こうゆうのが出力された後ならCookieに書くとかできないじゃないですか
だから、ヘッダが出力されているかどうか調べたいのですが。。
こういたことはできますか?
ソース追ってるのか >print "Content-type: text/html;\n\n"; こう言うのを探せば良いんじゃ無いの? 端末側で吐いてる事確認したいのなら オミトロンとかで吐き出せる
>>769 ヘッダとボディの区切りは改行
print "Content-type: text/html;\n";
print "Set-Cookie: name=value;\n";
〜〜〜 ↑ヘッダ 〜〜〜
print "\n";
〜〜〜 ↓ボディ 〜〜〜
print 〜〜〜
>>754 $fied[1] = '@' x length($fied[1]);
>>770 ソース追ってるってことではないです。。
>>771 それは分かっています。
区切りの改行が出力されたらもうヘッダに書き込めなくなるじゃないですか
だから、区切りの改行が出力されたかどうかPerlで調べたいです
こういったことはできないのでしょうか。
ヘッダとボディの区別は一応あるが、perl内部ではprintで吐き出された結果に過ぎない。 perlではそんなことをいちいち区別してない。
777 :
nobodyさん :02/07/11 15:13 ID:/kd92Z8G
>773 perlはHTTPDのエクステンションじゃ無い、ただ標準出力に printの内容を送るだけ、そのあとはhttpdの仕事 判断するなら771の言うように改行を調べれば良い。
>>出力を見張る
our $headers_end;
sub myprint
{
$headers_end = 1 if /^$/;
print @_;
}
とか、どう?。
printをオーバーライドしてもいいかも。
#
>>753 トリップ変えました。ありがとう
test
http://pc.2ch.net/test/read.cgi/php/1026141215/ から
> GDモジュール、どうしても使えない。。
>
> 1 :nobodyさん :02/07/09 00:13 ID:k+y90VS+
> サーバはWebARENA Suite、
> GD.pmを使おうと
> サーバにコンパイル済みのGD1.27をアップするがどうしても
> うまく動かない。
>
> perl: error in loading shared libraries: ./auto/GD/GD.so: undefined symbol: gdImageJpegPtr
>
> こんなエラーが出る。。
> どうすればいいのか。。
> WebARENAはPerlは5.0.503だから、その環境でコンパイルしたものを選んだ。
> なぜだ、、何が、、いったい。。
782 :
781 :02/07/12 02:47 ID:0osVMAyz
>>781 続き
例によって親切には説明するつもりはないのでそのつもりで。
1. とりあえず telnet.cgi をまともに動かして。
2. gd-1.8.4.tar.gz(libgdのソース)というふぁいるをGETして。
3. CPANよりGDモジュールのソースふぁいるをGETして。
4. 二つのファイルをtelnet.cgiと同じdirにUPして。
5. 二つのファイルをtarで解凍して。
6. インストール先dirをcgi-bin以下にlib,include,bin,man作成
7. gd-1.8.4/Makefileを編集(インストール場所を6で作成したdirに設定)
8. gd-1.8.4をmake; make install
9. GD-1.40/Makefile.PLの
$DEFINES .= ' -DHAVE_XPM' if $XPM;
をコメントにする。
10. GD-1.40のDIRで[ perl Makefile.PL LIB=/virtual/おまえのIP/cgi-bin/lib/perl5 INSTALLMAN3DIR=/virtual/おまえのIP/cgi-bin/man/man.3 ]実行
11. 10で出来たMakefileに8でインストールしたgdへのLIBパスとINCパスを追加して,X関連のリンク(だっけ?-lx11とか)を削除
12. make; make install
13. GD使うスクリプトの冒頭で #!/usr/local/bin/perl -I../lib/perl5/i386-linux とでもしてくれ。
15. あとはてめぇでがんばれ。
16. 意味がわからん?ってか,わからんならやらないでくれ。他に迷惑がかかるかもしれんし。
とりあえず,demo/gd_example.cgi は動いたぞ。
# /usr/libにlibgdがあるのにヘッダがない罠…。
いくらわからんからって単発スレは立てないでくれ。
あなたのスレ立てのために他のスレがdat落ちするじゃね〜かよぉ〜。
>>781 なんだか偉そうだな。
とりあえず、共有サーバでコンパイルするのはやめてほしい気分。
素朴な質問です。 if($name eq ''){print "hoge";} と print "hoge" if(!$name); は処理的には同じに思うんですが 書き方以外に何か違う意味とかってあるんですか?
>>784 それは処理的に同じではないよ。
$nameが単なる文字列なら結果としては同じことだけど、
もし$nameがオーバーロードされた文字列なら、全く違う結果になることはありえる。
まぁそんなことを聞きたいんじゃないと思うけど、
質問する場合はその辺を簡略化してよ。
で、
if(foo){ bar }
と
bar if foo;
は同じこと。ちなみに
foo and bar;
も同じ。
書き方意外に違う意味は「読みやすさ」だね。
自分が文脈に合う、読みやすい、と思う構文を使えばいいよ。
>784 $name = "0"; の時に変わるな。
>>786 あう、そういえばそうだ。
単なる文字列だとしても別の意味をもつ文だね。
788 :
784 :02/07/12 14:42 ID:???
>>785 なるほど。勉強になりました。
ありがとうございました。
>>786 そういえばそうでした。
鋭いご回答ありがとうざました。
# 排他処理をしたいです。 # ローカル環境(WindowsMe+Apache+Cygwin付属のPerl)では成功するのですが、 # サーバで実行するときには、必ず失敗します。 # コーディング上の落ち度がありましたらご教授ください。 sub create_lock { my ($lockfile, $retry) = @_; while (!mkdir($lockfile, 0755)) { if (--$retry <= 0) { return undef; } sleep(1); } return 1; } sub remove_lock { my ($lockfile) = @_; rmdir($lockfile); } #上記関数の利用例 my $lock_handle = &create_lock($dir_lock, $lock_retry); if (not $lock_handle) { &print_error($resource{writedatafailed}); } #ここで処理する &remove_lock($dir_lock);
790 :
789 :02/07/12 17:48 ID:uV0iCTit
あげわすれました。すみません。
792 :
789 :02/07/12 18:03 ID:???
>>791 さん、ありがとうございます。そっちにいきます。
793 :
nobodyさん :02/07/12 19:41 ID:mbAMx/DL
すいません、質問させてください。 タブ区切りの表から、一行ずつ取得し、grepで検索をかけ、 マッチしたものとマッチしなかったものの一覧を作成したいのですが ・条件に、検索キーワードは複数。(or形式) ・行末に、ヒットしたキーワードのみ挿入(複数のうち、該当した物だけ) というものがあります。 その時 if(grep /$kw{$key}/,@line){#配列の中にキーワードが入っているなら chomp @line; if($check_flag == 0){ push(@result,@line); push(@result,$kw{$key});#resultに追加 $check_flag = 1;#別のところでフラグに使っている $flag = $line[0];#別のところでフラグに使っている $no_count = 1;#一回目かそうで無いかのフラグ push(@result,"\n");#行末にキーワードをつける }elsif($check_flag == 1){#二回目からはキーワードのみを最後につける push(@result,$kw{$key}); $no_count = 1; とした時、配列の最後に$kw{$key}をpushで押し込むと、強制的に改行が入ってしまいます。 かといってchompをすると、全部改行が消えてしまい、全部のデータで一行扱いになってしまいます。 どうにか最後の改行のみ消す方法はありませんでしょうか? 取得した行+キーワードx個 取得した行+キーワードx個 ・ ・ というような表を、上記のスクリプトに手を加える程度で 作成することは可能でしょうか? すいませんが、わかる方がいらっしゃいましたらご教授ください。
>>793 とりあえず突っ込んでおこう。↓は何ですか?
push(@result,"\n");#行末にキーワードをつける
あと$kw{$key} に改行が含まれる可能性は?
つーかそもそも if (grep /$kw{$key}/, @line) { 〜でやりたい事が出来るのかねぇ。疑問だよ。
Perlのスクリプトの試用版を配布するときに、ソースを見られなくするには、 どうすればよいでしょうか。 バイナリ化して、プロテクトをかけると聞いて調べたところ、 バイナリエディタというものを見つけましたが、 プロテクトの仕方がどうしても解かりません。 プロテクトするほどのソースは書けませんが、 どうかよろしくお願いします。
>>795 コンパイルしてしまうか、Perl2EXEなどを使うしかないと思われ。
797 :
nobodyさん :02/07/13 22:35 ID:xEQW3A4y
名前:年齢 A :22 B :31 C :13 上記のような二次配列を連想配列をつかって作成したのですが、 これをソートするのはどのようにすればいいのでしょう・・? 知人の考えで、年齢をハッシュのキーにしてソートすると言う案があったのですが、 同じ年齢の場合には、上書きされてしまうのでその案は使えませんでした。 どのようにすればいいでしょう・・?
foreach(sort {$hash{$a} <=> $has{$b}} keys %hash){ print qq($_ : $hash{$_}\n); }
タイプミススマソ。 適宜修正して。
795
>>796 さん、お答えありがとうございます。
今、ラクダ本で、コンパイルについて見ています。
しかし、use Protect ;とファイルにはあるのですが、
この Protectの部分について書かれていません。
use Protect ; は、どうやればできるのでしょうか。
>>800 ラクダ本のどこだかわからないが、
それは「自分でプロテクトモジュールを作成してね」という意味だと思う。
とりあえずそれを実装するには、
・Perlに構文の理解
・CPANのFilterライブラリの使用法
・暗号化ライブラリの使用法
が最低限必要だと思うよ。
>>801 説明できないオナニー野郎は(・∀・)ウセロ!!
まぁ
>>800 は馬鹿だからこれでいいかと
------------encode-------------------
while(<>){
$n= unpack "h*", "$_";
$n=~y/123456789fedcba/abcdef987654321/;
$e= pack "h*" , "$n";
print $e;
}
800
>>801 さん、ありがとうございます。
googleで、検索していたのですが、use MD5; というのは、
見つけました。
私には、まだ敷居が高そうです。
e-shoppyというSHOPスクリプトの試用版にバイナリエディタを
使うようにあったので、試用版って、こんな感じで配布しているんだと
思い、気になるので調べていました。
スクリプトを売る前に、試用版として、こんな感じで配布すれば、
ソースがプロテクトできるので、有用だなと興味を持ちました。
804 :
nobodyさん :02/07/14 02:43 ID:vNhQYRiQ
質問させてください。 今、perlでBBSを書いているのですが、 大体できて知り合いの所に入れてもらったりして 動作確認しました。 色んな環境の人のところで正しく動作したのですが、 (perlのバージョンが5.5or5.6,実行権限がnobody,オーナー等) 一人だけ動作がおかしい人がいるんです。 何がおかしいのか調べてみたら、 サブルーチンでseekさせてメインのルーチンに戻ってくると seekさせたのが無かったことに?なってるんです。 サブルーチンでどんなにseekさせても メインのルーチンで続行するとなぜか次の一行は空行、 その次の一行はファイルの一行目を読み込みます。 そのおかしくなる人の環境は OS NAME = freebsd PROCESS ID = 5854 PERL EXECUTABLE = /usr/local/bin/perl PERL VERSION = 5.00503 ってな感じです。権限はオーナー権限です。 他の、perlのバージョンが5.5の人のところではちゃんと動いてます。 この人の環境になにか特別なものがあるとは思えないので、、、 ただ、他の人はみんなlinuxなんですけどそれって関係ありますか? コーディングの問題かとも思っていろいろ試行錯誤してるのですけど もう分からないんです・・・
805 :
nobodyさん :02/07/14 02:51 ID:CbCEC3kH
807 :
:02/07/14 03:23 ID:???
アーカイブじゃなくtxtだとすぐ見られるのだが・・・
ライブラリに分割してあって txt だときっついです。。。 もうしわけないです;;
809 :
nobodyさん :02/07/14 03:42 ID:CbCEC3kH
1つおもいあったったのが、たとえばサブルーチン delete_art などにおいて、 sysread関数と他の方法による読み込みの混用が存在しています。 これは、わたしの手元のラクダ本に書いてあることですが、これらの混用は、 あなたがウィザード級の腕前の持ち主でないかぎり推奨できないとあります。
804です。アドバイス有難うございます。 どっかのサイトで行数を数える一番効率の良い方法ってのが出ていまして、 sysread使ってましたので、行数を数えるのにsysread使ってます。 sysread使わないで書き直してもみます。 いまおかしくなってる環境の当人に連絡が取れないので 今すぐには無理だと思いますが。 ただ、殆どの人のとこでは正常に動いていて その人のとこでだけ動かないっていうのが気になります。 環境に依存するような問題があるのでしょうか? (ファイルを扱う関数の、実装の違いとか) らくだ本欲しいですけど 貧乏なので本屋で眺めるだけです;; perl は立ち読みと WEB と皆さんの素晴らしい作品で勉強中です。
811 :
nobodyさん :02/07/14 04:15 ID:CbCEC3kH
>>810 恐らくではありますが、FreeBSD環境では sysread関数と他の読み込みの混用の
面倒をみてくれないということでしょう。
sysread関数というのは、直接システムコールを呼び出しているので混用した
場合に処理に見合った動きが期待できなっかったりするようです。
まぁ、単純に sysread関数を read関数に書きかえるだけで恐らくうまくいくで
しょう。
それから、効率よく行数を数えるのなら以下をやってみてはどうでしょう。
while (<FILEHANDLE>){}
print "全行数は: $.\n";
close(FILEHANDLE);
while (<FILEHANDLE>){} 最初はこういう方法とっていたのですが、速度が良くないようです。 ベンチとりまくってみましたが、 バッファにsysreadで読んでtrするほうが圧倒的に早かったです。 1000レスとかになるログだともろに差が出てきたので、、、 read で書き直して、ベンチマークと相談して 当人にためさせてみますね。 あと、問題の出ている個所の本元は、&std::pick だと思います。 ここでもsysreadで行数数えているので、ご指摘の問題があるのだと思います。 でもおかしいんですよね、、、 このpickルーチンだけ抜き出した簡単なテスト用cgi作って 彼にためさせたらちゃんと動作してたんですよね。 (任意の行にseekちゃんとしてる) パッケージとか絡むとなんか違うのかなぁ〜
813 :
nobodyさん :02/07/14 04:29 ID:CbCEC3kH
>>812 速度の差なんて人間の感覚では気づかない程度のミリ秒単位だからそう
気にすることないと思います。 もしこれが遅いのならC言語などで書く
ようにすることを考えるべきです。
ミリ秒の差だと思ってベンチとって見たら 0.数秒の差だったです・・・ テストケースのログで、 (BBSのトップに○○スレのそれぞれ最新の○件を表示みたいな) そのスレが1000レスとかあると、一行目からたとえば950行目を探すのに while (<FILEHANDLE>)式とtr式で物凄い差が出ました。 それが20スレとかあるともう体感できそうなくらいの差だったので。 ベンチマーク用のルーチン作って2000行のログのうち**行目をサーチする、 というのを1000回まわすのを自宅でやってみたところ tr式の方が15倍くらい早くて、 従来の方法だと固まったんじゃないかってくらい遅かったです(もう一分位;;) BBSで使う場合1000回も回さないですけど それでも標準的表示数で0.15秒くらいの差が出てました。 私はもともと最初にプログラムを触った時 みんなマシンパワーがなくてなんでも高速化高速化があたりまえの頃だったので なんか貧乏癖がついてるのかもしれません。 perlで久しぶりにプログラミングってのを再開してます。 もうちょっとおおらかにプログラミングしてみます。 いろいろ有難うございました。
815 :
nobodyさん :02/07/14 04:48 ID:CbCEC3kH
>>814 0.1秒でも速くしたいのなら別ファイルに常に行数のみを保存しておく
などの方法もありますが、そこまでしてもPerlで速く処理させたい?
別ファイルに行数保存してますよ〜 でも任意の行数にシークするってのはできないですよね。 (関数としてはない)ユーザーが工夫しないと。 書き込みがあったとき、削除のとき、だけは再度行数を取得してます。 もし、別ファイルが不慮の事故でいかれてたら一生ずれたまんまになるので。 perlでそこまでして、とは思ってないです。 生意気そうなこと言って申し訳ありません。 でも出来るだけ早く出来るならそのほうがいいかな〜ってだけです。 c-boardのソースとかみたらなんかすごくてブルーなっちゃって 高速化しないとだれも相手にしてくれないかな、って囚われていました。 早くしなきゃ、早くしなきゃって。 でも殆どの人はそんなこと気にしてないんですよね。 それと単純にベンチで段々確実に改良ごとに早くなってくのが 楽しかった、ってのもあります(笑 まだまだ勉強中の身ですので努力して良い物作れるようにがんばります〜
817 :
高速化遊戯 :02/07/14 05:46 ID:Iun5VHk7
別ファイルに、行頭のファイルポインタの一覧を保存する というはダメですかね? 任意の行に飛ぶ時はこっちをループでまわして 得られたファイルポインタの所にseek、と。 余計なデータが無い分、ループまわすのも早そうだし。 試してないからなんとも言えないけど。
804です。 大して技術も基礎もなってないのに しかもperlで高速化とか言ってるのは よく思われないみたいなので、もう言うのやめようと思ったのですが 高速化遊戯さんがレス下さってるので、書きます。 別ファイルだと、結局そのファイルを何らかの形で取り込まないといけないです。 while (<FILEHANDLE>){}が遅いのってベンチとってないから 断言できないですけど、ファイルの大きさうんぬんより perlの持ってるファイルから一行取り出すための作業が 遅いんじゃないかと思ってます。(憶測で物言ってすみません) それだったら、もとのファイルの各行にインデックスつけた データ形式にして、 もしそれが数千行とかあるファイルだったらですけど いくらかずつseekさせて、インデックスを拾い読みして 目次見たいの作って、任意の行を拾うときは、 その目次見て近そうなとこから探すほうがいいかと思いました。 つづく、、
俺はデータファイルの頭に、100行毎にファイルポインタ記録してるよ ここみたいなBBSで、一応10000レスをリミットにしてるから 9桁(ファイルポインタ)×100 = 1KB程度がインデックスに使われてる その代わり読み込み時の落ち込みは少ない レス5850を読む、なら5800行目のfpを探してseek そこから普通に行処理するだけだから。 後はファイルのお尻〜行を読むtailみたいメソッドを書いてる位。 perlで低レベルの関数使うのは面倒だから、どうしても行読み出しで グルグルしがちだけど 工夫すれば極端なパフォーマンス低下は防げると思うよ
お、今書いてるのか ⊂(´ー`⊂⌒ヽつ >perlの持ってるファイルから一行取り出すための作業が >遅いんじゃないかと思ってます。(憶測で物言ってすみません) 俺もそう思う。テストした訳じゃ無いけど sysreadでバイト読みする方がずっと早いと思うよ。 だからと言って、Cでもperlでも低レベルの関数はそれなりに 使い辛い訳で・・・
821 :
nobodyさん :02/07/14 12:23 ID:vNhQYRiQ
最初、そういうのを考えたのですが もうログの形式を変えたくなかったのでやめました。 それにせいぜい1000行前後なので直接改行の数を数えることにしました。 それで書いたルーチンが次のようなものです。 (勉強中なのでおかしいとこあると思いますけど、、、) sub pick { my $fh = shift; my $hit = shift; my $bufsize = 4096; my ( $per, $buf, $line, $prev ); seek( $fh, 0, 0 ); binmode $fh; while ( sysread $fh, $buf, $bufsize ) { $prev = $line; $line += ( $buf =~ tr/\n// ); last if $line >= $hit; $per++; } my $over = $hit - $prev; $buf =~ /(^([^\x0D\x0A]*\x0D?\x0A?){$over})/; seek( $fh, $per * $bufsize + length($1), 0 ); } これでベンチとってみたらびっくりするくらい早かったです。 一行ずつかぞえるのの、15倍くらいの速さでした。 数千行あるようなファイルをいくつもまわす場合は明らかに 体感できるくらいの差がでました。 それで嬉しくて調子のって使っちゃったです・・・ でも良くないようなので、他の方法探してみます。 (FreeBSDだけなのかな?、ダメなのは)
>>821 最近コード書いてないんで殆ど忘れちゃったんだけど
俺も
>>809 さんの言うとおりだと思う
Cで速度を求めてfgetsからreadにした時に、そう言う問題に嵌った事有るよ
良く覚えて無いんだけど、結局は低レベルと高レベルの読み込み関数を
併用したのが間違いだったと思う
823 :
nobodyさん :02/07/14 12:38 ID:vNhQYRiQ
>俺はデータファイルの頭に、100行毎にファイルポインタ記録してるよ うわぁ、それスマートです;; とても勉強になります。 今作ってるのはもう固まってきちゃってるので 大きいバージョンUPの時にでもそういう手法でやってみます。 いぱーいレスつけられますもんね〜 >perlで低レベルの関数使うのは面倒だから、どうしても行読み出しで >グルグルしがちだけど うんうん。地が貧乏性なので、配列にごっそりとかぐるぐるとか なんか疑問に思っちゃって。 いろんなBBSのスクリプト見たりあさったりしたんですけど 意外と、みんなぐるぐるで、グルグルでいいんかよ〜って思ってたんです。 だからこういう具体的な工夫例聞けてとてもやる気でました。
と言う訳で819の方法は我ながらお勧めなんだけどなあ(w ログのコンバータ書いた方が後々苦労しない気もしないでもない。 これだとシステムよりの関数は一切使ってないから つーか1000行程度ならぶん回しても問題無いんじゃない?
優良スレ認定
826 :
nobodyさん :02/07/14 12:42 ID:vNhQYRiQ
問題の解決の糸口については、皆さんのアドバイスのおかげで つかめてきたのでこれから色々その線でしらべて見ようと思います。
わはは頑張って下さい、 〜〜する清原みたいなバカスレが再現出来ると結構嬉しいもんです(・∀・)
828 :
nobodyさん :02/07/14 14:31 ID:ZiG6NcZV
perl初心者ですが、よろしくお願いしますです。 現在、赤帽7.2の上にRPMとして乗っかっているPerlのバージョンは、5.6なのですが、 ある既製のPerlスクリプトを使いたいのです。 そのPerlスクリプトは、Linux上でJperlを必要としているのですが、 私が探した範囲では、Linux用のJperlのパッチは、5.005ベースのものしかありません。 パッチをあてようとしてもうまくあたりません。 この、Jperlを必要としているPerlスクリプトをLinux上で動かすには、 どのような解決策があるのでしょうか。どなたか、よろしくお願いしますです。
なぜjperlが必要なのか調べ、jcode,pl、Jcode.pmにその個所を置き換える。
830 :
nobodyさん :02/07/14 15:00 ID:xUfIRkak
>>828 Jperlを必要とする既製スクリプトってたいしたことなさそうだから、
一から自分でコーディングしてみては?
831 :
nobodyさん :02/07/14 15:29 ID:ZiG6NcZV
>>829 >>830 さん
レスありがとうございます。確かに、その通りなんですが、
1>そのスクリプトが200KBほどある
2>日本語の文章の構造解析のスクリプトなので、日本語処理がチョット複雑
3>あくまでもテストとして、ちょっと動かしてみたいだけなので、できるだけ手間を
かけたくない
という理由で、Perl5.005のソースをDLして、それにパッチを当てようと思っていた
のですが、Perl5.005のソースがなんか見当たらないのです。
> Perl5.005のソースがなんか見当たらないのです。 簡単に見つかる予感。
833 :
831 :02/07/14 16:00 ID:ZiG6NcZV
>>832 ググルで、"perl5.005 src"で見つけました。
すんませぬ。"perl5.005 source"とか”rpm"とかで検索していたオラが
間抜けでした。逝ってきます。
Perl暦2日なんで、許してやってくだされ。
sysopenに使うパラメータとかなんだけど、 O_RDONLY = 0 O_WRONLY = 1 O_O_RDWR = 2 とかは分かってるけど O_APPENDとかは? 検索してもヒットせず… おしえてくらはい
ああ、割り当てられてる番号か それって歴史的に環境依存だから0.1位しか信用出来ないよ?
837 :
二つ目のお気に入りとして使って :02/07/14 23:31 ID:gWk8eFjt
ファイルのコピーってどうやれば出来ますか? 元ファイル開いてメモリに読み込んで別ファイルに書き出すじゃメンドイし どの環境でも使える方法でなんか一発でする方法ないですか?
839 :
:02/07/15 00:09 ID:???
>>838 Perl5なら以下で出来る。
use File::Copy;
copy("file1", "file2");
841 :
838 :02/07/15 00:24 ID:???
>>840 有難うございます、上手く出来ました。
>>439 やってないけどそれだと多分エラーです。
842 :
:02/07/15 00:25 ID:???
843 :
838 :02/07/15 00:32 ID:???
>>842 やってみたらやっぱりエラーが出ました。
String found where operator expected at test.cgi line 1, near
(Do you need to predeclare copy?)
syntax error at test.cgi line 1, near "copy "a.txt""
String found where operator expected at test.cgi line 1, near
(Missing operator before "b.txt"?)
Execution of test.cgi aborted due to compilation errors.
844 :
:02/07/15 00:36 ID:???
846 :
838 :02/07/15 00:54 ID:???
>>844 マジですか、っても明らかにおかしいのでローカルでしかやってませんが。
今後気をつけます。
もし$dataに&もしくは=のどちらか一方でも含まれていなかった場合は終了する という場合は if(($data !~ /&/) || ($data !~ /=/)) {exit;} こうでいいんでしょうか?
848 :
nobodyさん :02/07/15 07:59 ID:Gdw1y7VE
exit unless $data =~ /[&=]/; 私も初心者だから違うかもしれないけど
849 :
nobodyさん :02/07/15 09:00 ID:AMXAGLXX
>>847 聞くより試した方が早いだろうに。
exit if(index($data,'&') == -1 || index($data,'=') == -1);
こっちのが数倍軽い。美しくは無いが。
>>847 exit unless $data =~ tr/&=//;
Active Perl 5.6.1.633 きたね。
htmlファイル上のフォームからCGIへ値を送信して、その結果を新しいウィンドウを開いて表示させたいんですが、 全くもってうまく動きません。 具体的にもうしますと、最近サイトのトップページでよく見かけるようなミニアンケートを作りたいんですが、 ラジオボタンで選択した値などが、まったく送信されてないみたいなんですが、 htmlファイル上のフォームから、別ファイルのCGIへ値を送信する場合なにか特別なことが必要なのでしょうか?
フォーム の html : これに送信するパラメータの名前や値がかいてある ↓ 送信ボタン押す ↓ ブラウザが、指定されたメソッドに従ってパラメータの名前や値をまとめる そして cgi に送信 ↓ cgi でそれを受け取る ↓ 受け取ったのはまとまらさってるので パラメータの名前や値に分解しなければなりません ↓ 分解した ↓ 色んな処理 ↓ 処理が終わったから新しい画面を表示させよう、 表示させるにはブラウザにhtmlを送ります(正確には他にも必要) ↓ cgi からおくらさってきた〜〜 ↓ ブラウザに表示 どこでコケてる?
>>853 たぶん、
ブラウザが、指定されたメソッドに従ってパラメータの名前や値をまとめる
そして cgi に送信
↓
cgi でそれを受け取る
あたりでこけてる気がするのですが、
<input type="hidden" name="mode" value="vote">
をフォーム内に記述して、
if($param{mode} eq 'vote'){
簡単な処理
}
としてみても、「簡単な処理」を一切してくれないので、値を送信しないでCGIを起動だけしてる感じです。
$param{mode}が空の時は、投票結果表示の処理をさせてるので、新規ウィンドウに投票結果が反映されていない
グラフがむなしく表示されています。
なにがいけないんだろ。。。。。。
データ受け取ってねーよ(^^; この処理がやってないぞ。定型。 local($pair,$buffer); if($ENV{'REQUEST_METHOD'} eq 'POST'){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }elsif($ENV{'REQUEST_METHOD'} eq 'GET'){ $buffer = $ENV{'QUERY_STRING'}; } local(@pairs) = split(/&/,$buffer); foreach $pair(@pairs){ local($name,$value) = split(/=/,$pair); $FORM{$name} = $value; }
その $param{mode} はどやって取得してるんです?
>>855 すいません、書き忘れてましたが、データを受け取る処理も書き記しております。
頂いたレスを見ますかぎり、CGI→同じCGIのデータの受け渡しと、特に変わらない処理でデータを受け取れる
ということなのでしょうか。
データ受け取りはPOSTかGETが主流だから特に変わりはないはずだよ。
>854 $param{'mode'}にしたら直ったりは?
>>859 俺もいつも ' とか省いてるけど性情に動く
$param{mode} $param{'mode'} $param{"mode"} どれでも変わらんよ。
>860-861 Perlのバージョンに影響されない?
>>862 Perl4ならクォートは必須だけど、今更4との互換性を考える必要は無いと思う。
>863 悪かったな! 漏れのプロバのスペースがPerl4なんだYo!(涙ッシュ
Tripodでエンドレスバトルやりたいんだけど設置した後404エラーが出てできない・・・ 設置方法が悪いのかな?それとも対応してないとか?
URL間違えているだけ。
867 :
865 :02/07/15 17:21 ID:XqyW9sRL
868 :
865 :02/07/15 17:22 ID:XqyW9sRL
404じゃなかった403だ
869 :
865 :02/07/15 17:27 ID:XqyW9sRL
URLは間違えてないと思うんだけど
403 アクセス不可
871 :
nobodyさん :02/07/15 17:30 ID:Zf9qVko0
872 :
865 :02/07/15 17:59 ID:XqyW9sRL
indexけしてからcgi-binはいってみたけどそれすら403ではいれん
PerlスクリプdをEXEに変換する、Perl2EXEっての落としたけどどうやって使うの?
874 :
すいません。。。 :02/07/15 19:01 ID:GXUWDI7H
Mac板のこんなソフト探してます、 とかのスレの方がふさわしくない?
876 :
nobodyさん :02/07/15 19:25 ID:/pkMmlTE
クエリーで送信された値が、エレメントの順番どおりに 配列に入らないのですけれど、どこが変か教えて下さい。 htmlの部分↓ ーーーーーーーーーーーーーーーーーー <form method="get" action="hoge.cgi"> <input type="text" name="E0" size="4" istyle="4" maxlength="4">年</input><br> <input type="text" name="E1" size="2" istyle="4" maxlength="2">月</input><br> <input type="text" name="E2" size="2" istyle="4" maxlength="2">日</input><br> <input type=radio name="E3" value=1 CHECKED>男<br> <input type=radio name="E3" value=2>女<br> <input type="submit" value="押す"> <hr> </form> cgiの部分↓ ーーーーーーーーーーーーーーーーーー $buffer = $ENV{"QUERY_STRING"}; @buf = split( /&/ , $buffer ); foreach $data ( @buf ){ ( $name , $value ) = split( /=/ , $data ); $FORM{$name} = $value; @list = values %FORM; }; print"list[0] $list[0]<br>\n"; print"list[1] $list[1]<br>\n"; print"list[2] $list[2]<br>\n"; print"list[3] $list[3]<br>\n"; これをやってみるとこんなふう↓になります ーーーーーーーーーーーーーーーーーーー list[0] E3の値 list[1] E0の値 list[2] E1の値 list[3] E2の値
受け取ったデータをなぜ @list = values %FORM; するのかわからん。
878 :
すいません。。。 :02/07/15 19:43 ID:GXUWDI7H
879 :
876 :02/07/15 19:46 ID:???
>>877 さん←神
分かりました〜♪ありがとうございます。
$buffer = $ENV{"QUERY_STRING"};
@buf = split( /&/ , $buffer );
foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
$FORM{$name} = $value;
};
print"FORM[0] $FORM{E0}<br>\n";
print"FORM[1] $FORM{E1}<br>\n";
print"EORM[2] $FORM{E2}<br>\n";
print"FORM[3] $FORM{E3}<br>\n";
見栄えをよくするために行頭にはタブを入れてるんですが
print <<"HTML"
<html><body>〜略〜</body></html>
HTML
とやりたいんですがこれだとエラーになります。
タブを入れたまま動くようにするにはどうしたらいいでしょうか?
あとタブを入れてないと動くのですがその中に<a href="mailto:
[email protected] ">xxx</a>
があるとエラーになります。どうしてなのでしょうか?
>print <<"HTML"
; が入ってないけど、動くの?
>href="mailto:
[email protected] ">xxx</a>
\でエスケープしたら?
href=\"mailto:aaaa\@hotmail.com\">xxx</a>
882 :
◆Smt8k/ss :02/07/15 21:29 ID:wkNqkF1j
print <<" HTML"; <html><body>〜略〜</body></html> HTML
883 :
nobodyさん :02/07/15 22:32 ID:h7+zOLje
>>882 一応動いたんですがもうちょっと見栄えがいいやり方無いでしょうか?
print qq~ <html><body>〜略〜</body></html> ~; @はエスケープしる
質問よろしいでしょうか? ダイス機能付きのチャットを作っているのですが、どうにもrand関数の値が偏ります。 3D6(6面ダイス3個の判定)の場合、1個目の数字が連続で同じ数字になります。 試しにWeb上にアップして試した所、そっちでは3個目の数字が連続で同じ数字になりました。 これはrand関数において仕方のないことなのでしょうか? もし解決策などがあるのでしたらご教授いただけると嬉しく思います。 以下はダイスロール部分のソースです。 # $in{'dice_any'}にダイスの数、$in{'dice'}に何面ダイスかの情報が入ってくる。 srand(time); $dice_roll = qq(<br><b><font color=0000FF>$in{'dice_any'}D$in{'dice'} ダイス判定</font></b> <font color=0066FF>); $dice_all = 0; # ダイスの出目の合計用の変数 $plus = ""; while($in{'dice_any'} > 0){# ダイスの数が尽きるまで $dice = int(rand($in{'dice'})) + 1; $dice_roll .= qq($plus$dice ); $dice_all += $dice; $in{'dice_any'}--; $plus = "+ "; } if($dice != $dice_all){# ダイスが2個以上なら $dice_roll .= qq( = <b>$dice_all</b>); # 合計値表示 } $dice_roll .= qq(</font> ); # この後$dice_rollをログに保存 どなたかよろしくお願いします。
srandするな
887 :
885 :02/07/16 03:07 ID:???
使うサーバーがPerl4なんです・・・。
888 :
nobodyさん :02/07/16 03:09 ID:1NQx5kwR
root--test.pl | |-folder1 |-main.cgi このようなファイル構造なんですが main.cgiからtest.plを参照することは可能なんですか・・?
889 :
887 :02/07/16 03:13 ID:1NQx5kwR
>>888 ずれてる自己レス・・・
root にtest.plが有って
folder1にmain.cgiが有る状態です
つまり下位のファイルに参照できるかどうかと言うのが疑問なのです・・・
絶対パスで指定しませう。 require '/home/mona/public_html/test.pl'; 大体こんな感じ。鯖でちがう。
PerlとかでWEBページを所得する ソケットプログラム書くときサーバからのレスポンス(OK 200とか)がうざいんですが これを消す方法ってないんですか?
892 :
887 :02/07/16 06:35 ID:1NQx5kwR
>>890 winだと相対パス行けるのですが
いざUPするとできません・・・
相対的にはこんな感じで
../member/data/point.pl
絶対的には
/home/as***/public_html/*****/cgi-bin/member/data/point.pl
こんな風なのですが・・・
>>891 HTTPを使う限り、それを消す方法は無いよ。
単に無視するだけなら可能だけどね。
その場合は最初の空行までを読み飛ばせば良い。
>>892 パーミッションがあれば、相対でも絶対でもいけると思うけど。
相対パスのときカレントより上のディレクトリは指定できない設定なんでしょ。
895 :
852 :02/07/16 09:20 ID:mWVjtM4S
未だに同じ問題で悩んでいる852です。 送信ボタンに、onMouseUPで新規ウィンドウを開き、そこにデータを受け取った後の結果を表示させるようにCGIにリンクさせてるんですが、 そのjavascriptをいれてると、データが送信されてないみたいです。 試しに投票フォームと同じウィンドウ上で結果を表示させると、うまくいきました。 submitボタンにビヘイビアを仕込むとダメなんでしょうか?
悩んでる内容も内容なら、説明も下手、キミには向いてないそれだけのこと。
897 :
chmod :02/07/16 14:34 ID:2idpGCxq
chmod 0755, $filename; でファイルがブラウザから見られるのに $de="0755"; chmod $de, $filename; でにするとファイルが見られなくなります。 chmod($de, $filename); もダメです。 どなたか変数で指定する方法を教えて下さい。
898 :
chmod :02/07/16 14:36 ID:2idpGCxq
>>897 あれ文字化け?してるけど、
コロンでなくカンマです。
そんな基本的なこと参考書に書いてあるだろ。キミも向いてないね。
900 :
chmod :02/07/16 14:46 ID:2idpGCxq
$de="0751"; chmod($de,$filename);と755を751にしたらでできました。 しかしFTPプログラムでこのファイルを見るとなぜか -wxr-xrwxになっています。どうしてでしょう。
>>900 $de = 0755;
ダブルクォーテーション不要。
リテラルについてさらっと勉強し直しましょう。
umaskは?
スカラー変数の意味がわかっていない馬鹿がいるな…
904 :
nobodyさん :02/07/16 15:37 ID:2idpGCxq
>>902 umask(0)です。
$de=0755;とかにするとその時点で正しく数字が入りません。
やはり変数を使って設定をするとパーミッションがぼろぼろになります。
Perlの仕様ということで考えます。
だからperldoc嫁ってのに、どんな仕様だよ $de_octet = oct($de); perldoc dhmod
906 :
885 :02/07/16 15:52 ID:???
らくだ本を参考にsrandの種を以下のようにしたら乱数がばらけてくれました。 ありがとうございました。 srand(time() ^ ($$ + ($$<<15)));
バカハケーン!
909 :
852 :02/07/16 16:53 ID:???
ようやく解決できました。どうもお世話になりました!はーこんな単純なことで長時間費やすとは・・・
910 :
nobodyさん :02/07/16 18:06 ID:AR5JuM+5
911 :
nobodyさん :02/07/16 18:13 ID:XozL7fM5
>>907 >>908 ■■■バカ名言■■■
バカって言うだけの奴ほど役に立たないものはない。
助けるか、無視するかをしなさい。
バカというだけというのは、助けもせず、無視もせず、
レスを余計に増やし、雰囲気を悪くする。
そういうのに限って突っ込まれれば適当にごまかしたり、逃げていく。
■■■どうせ六でもない奴だろうが■■■
>>911 陸でもない/碌でもない
バカって言っていいですよね?
■■■どうせ六でもない奴だろうが■■■
■■■どうせ六でもない奴だろうが■■■
■■■どうせ六でもない奴だろうが■■■
■■■どうせ六でもない奴だろうが■■■
■■■どうせ六でもない奴だろうが■■■
バカハケ━━━━━(゚∀゚≡゚∀゚)━━━━━━ソ!!!!
楽しいスレですね(微小
>>912 ネタに乗ったハカ
どう見ても厨房
でもあんまりおいたしていると痛い目合わすよ。
おまえら、いい馬鹿っぷりでお兄さん感激だ(w
タグを削除したいのですが、
$x = qq{<a href="
http://www.yahoo.co.jp/ ">Yahoo! Japan</a>};
$x =~ s/<.+>//g;
のようにすると、最初の < と最後の > で全部消えてしまいそうな気がします。
最短マッチとかを使えばいいんでしょうか、使い方がわからないので教えてください。
(Perlメモを読んだところEUCしかできない方法らしいので
SJISでもやりたいので質問です)
2002/07/17 07:41:20 を、time関数形式になおしたいけどどうするの?
919 :
nobodyさん :02/07/17 07:52 ID:SEvMu7le
>>917 $x =~ s/<[^>]*>//g;
>>918 年月日時秒を分解して
(年は-1900してから)全て秒に直して足せば良いんじゃないの?
>915 timelocal();
>920 =~ s/>915/>918/;
922 :
919 :02/07/17 08:08 ID:???
馬鹿だ俺…
>>917 HTML::Parserという手もある。
rename("onefile","pict/$hensuu"); ってやるとunix/perlでは成功するんですが ActivePerlじゃ成功しないんです。 rename("onefile","pict\$hensuu"); うえのようにしてもだめでした。たすけてちょんまげ
>>924 …普通に成功してるけど?
というか、失敗したら$!を見る癖をつけよう。
rename(...) or die $!;
926 :
nobodyさん :02/07/17 14:25 ID:tZJ3+xnS
>>924 エスケープしなきゃ駄目だよ
pict\$hensuu
↓
pict\\$hensuu
927 :
nobodyさん :02/07/17 14:52 ID:tZJ3+xnS
と言うか、rename("onefile","pict/$hensuu");このまま でも動く所がActiveperlさんの偉い所だったり MACだとこうは行かないそうで
>>927 MACのPerlってどんなんなんですか?
OSXで動くならまぁわかるんですが。
PerlでIriaみたいなの作ったら需要ありますかね?
Macでダウソマネージャーってありましたっけ?
MacPerl WWWcp 両方で検索してみれ。ただWWWcp最後にいつ使ったか 忘れたけど俺が使ったバージョンではマルチホーミングに 対応してなかった気がする。 つーか需要も何も難しくないからめずらしくも無い。
930 :
924 :02/07/17 17:45 ID:???
ActivePerlおかしくないですか? perl -e 'print $^O;'とかできないんですけど、、 ほかにもいろいろ違うのかな?
C:\>perl -e "print $^O;" MSWin32 C:\> ちゃんとなるよ。
webプログラマーになりたいんですが、 linuxの使い方は必須で覚えないとダメですか?
サァ?
934 :
924 :02/07/17 17:53 ID:???
>>931 さんくす。
DOSではダブルクォートがうんぬんってのはこれだったのか。
935 :
nobodyさん :02/07/17 18:02 ID:0WM/CdU+
Cだとプリプロセッサだけ動かしてその出力を得ることができるんですが、 Perlでこれは可能ですか? あるソースの保守をやっているんですが、ファイル名をパスの階層ごとに変数にしてて もうわけがわかりません。変数展開したソースがホスィのです。 こんな感じ open ("< /foo/bar/giko"); を、わざわざ $FOO_dir = '/foo'; $BAR_dir = "$FOO_dir/bar"; $GIKO_file = "$BAR_dir/giko"; open ("< $GIKO_file"); としている。こんなのが何十個もある。
937 :
nobodyさん :02/07/17 23:14 ID:0q/AG7/8
はじめまして。 超初心者的質問ですが、探しても答えが見つからなかったので質問させてください。 flockでロックしたファイルは、他のcgiからの書き込みに対しても有効ですか? あるCGIスクリプトでflock中のファイルについて、他のCGIスクリプトからの書き込みも防ぐことができるのでしょうか。 flockは、ファイルハンドルを指定して行うので、1つのCGIスクリプトでしか効果がないのかも知れないと心配になりました。 申し訳ありませんが、どなたかご存じの方、ご回答いただければ幸いです。
938 :
コギャル&中高生 :02/07/17 23:23 ID:q1y9WZog
939 :
nobodyさん :02/07/17 23:37 ID:/oUfi8FN
>>937 一つのスクリプトでしか効果ないとしたら、
全く同じ二つのスクリプトがあったらどうなると思う?
1バイトだけ違って他は同じスクリプトがあるとしたら?
そんなんじゃ困るでしょ。
当然だけど、他のあらゆるスクリプト、プロセスに対して有効だよ。
ただし、flockの仕様上「書き込みを防ぐ」ことは出来ないから注意してね。
>>937 全部のスクリプトが正しくflockしてれば排他処理はうまくいく。
flockは紳士協定だから、flockせずにいきなり書き込むような無法者がいると破綻する。
そのファイルにアクセスするのが自作CGIのみなら大丈夫だろ。
942 :
937 :02/07/17 23:48 ID:NR9AAdwq
親切な回答ありがとうございました。 また、flockは書き込みを防ぐのではなく、オープンを防ぐのですよね。 こちらもご指摘ありがとうございました。
943 :
937 :02/07/17 23:51 ID:NR9AAdwq
上の書き込みは
>>940 さんへのものでした。
>>942 さんもありがとうございました。
自作スクリプトだけなので、大丈夫そうです。
安心しました。
本当にありがとうございました。
・・・あ、もちろん、ファイルハンドルは毎回違っても大丈夫ですよね?
>>940 さんがあらゆるプロセスに対して有効って言ってくださっているので、
そういうことですよね。
では、頑張ってつくります!
ありがとうございました!!
944 :
937 :02/07/17 23:52 ID:NR9AAdwq
すみません。
>>941 さんでした。
本当にありがとうございました。
>>942 > また、flockは書き込みを防ぐのではなく、オープンを防ぐのですよね。
これは違う
ファイルアクセスを防ぐのかな?
いや、何も防ぎはしないよ。 flockの仕組みってのは信号機みたいなもんなんだよ。 "赤だったらちょいと立ち止まってくれ"という合図に過ぎない。 だから、無視しようと思えば無視できるんだよ。 無論、そんなことをしていればいつか事故が起こるのは必至だけど。 …てな説明を何処かで読んだよ。
949 :
nobodyさん :02/07/18 03:09 ID:ES5M+zj/
flockを使わない別スクリプトがあったら危険だってこと?
>>all これ完璧だと思うけど、違うの? open(OUT, "+< outfile.txt"); flock(OUT, 2); truncate(OUT, 0); seek(OUT, 0, 0); print OUT "........"; close(OUT);
>950 それのどこが完璧なのか聞きたい。 tu-ka,ファイルロックスレに逝って叩かれてこい。
>>950 openとlockの間に他プロセスからのopenが来たらどうするつもりなんだろう・・・。
>>165 別に問題ないのでは?
>openとlockの間に他プロセスからのopenが来たらどうするつもりなんだろう・・・。
とのことだけど、ファイルを破壊しているわけじゃないので無問題でしょ。
「他プロセスからのopen」がファイルを破壊したりflockを伴わなかったりしたら
そりゃ問題だけど、そんな赤信号を無視して突っ込んでくるヤツを止めることは出来ないし。
954 :
バカです :02/07/18 11:38 ID:w/uBOa7p
教えてください。 mySQLとPerl使っているのですが,ハッシュのことがよく分かりません。 while(@res = $st->fetchrow_array) { $data{$res[0]}=1; } こうすると、ハッシュdataに何も入って無いのですが、↓の様にすると ちゃんと、ハッシュに格納されます。何故ですか? $i=0; while(@res = $st->fetchrow_array) { $data[$i]=$res[0]; $i++; } foreach(@data){$data{$_}=1}
955 :
nobodyさん :02/07/18 13:17 ID:pqv4qZv6
質問です。 sub A{ $a = "aaa"; &B; } sub B{ print $a; } &A; サブルーチンAの中にサブルーチンBがある時、 Bの始めに引数の取得をしなくてもBの中で$aって使えるんでしょうか。 というか、今やったら出来たんですけど、どうしですか? 引数は必ず受け取らないとダメなんですよね?
956 :
nobodyさん :02/07/18 13:19 ID:pqv4qZv6
訂正。 >Bの始めに引数の取得をしなくてもBの中で$aって使えるんでしょうか。 Bの呼び出しの時に引数を与えなくてもBの中で$aって使えるんでしょうか。
>>955 だって、$aはmyなりlocalなりしてないのでスコープがグローバル。
もっともやってはいけないコーディング法の一つです。
>955 Perlはデフォでグローバル変数扱いになるから使える。
959 :
nobodyさん :02/07/18 13:25 ID:pqv4qZv6
やっぱり上のは違いました。質問し直します。 sub A{ &B; } sub B{ @array = @_; print $array[0]; } $a = "aaa"; &A($a); この時、Aで引数を取得しないで飛ばしてBで取得しちゃってもいいんでしょうか。
@_ってローカルでは?
>>957 おいっ! my と local の違いを勉強せいっ!
この場合、local でも使えるだろ!
962 :
nobodyさん :02/07/18 13:37 ID:Rz8eDFr/
>>962 なかなか不便だね。
とにかく、彼はもうちょっと構造化プログラミングについて勉強した方が未来のためかと。
964 :
nobodyさん :02/07/18 13:42 ID:pqv4qZv6
謎はすべて解けた! グローバル変数は引数を与えたり取得なんかしなくても どこでも関係なく使えるってことだ!!
>>957 ネタ?
グローバルが最悪というが、状況次第だろ
それにこれはローカルが要求される程
莫大な規模ではないし
>>960 ダネ
Bが@_ではなく、$aで取得すれば問題ない
>>965 >グローバルが最悪というが、状況次第だろ
こんな小規模なプログラムかつ引数で渡せるものをわざわざグローバルにすべきではない。
俺いまだに、myとlocalの違いがわからねえ。
969 :
nobodyさん :02/07/18 13:45 ID:gTYoTB/P
>>964 どこでも使える=グローバル
局所でしか使えない=ローカル
972 :
nobodyさん :02/07/18 13:46 ID:gTYoTB/P
>>968 localだとそこから呼んだサブルーチンでも有効。
>>955 だとlocalにしても使えるがmyだと引き渡されない。
なんとなく理解できたよ。
974 :
ぽよぽようんこ(本物) :02/07/18 13:49 ID:HgQ+L8cQ
>>972 じゃあさ、
sub a
{
local($x);
&c();
}
sub b
{
&c();
}
sub c
{
print $x
}
ってした場合はどうなるの?
976 :
nobodyさん :02/07/18 13:52 ID:pqv4qZv6
bはどこで呼んでいるのだ?
>>976 どこかで読んだ場合よ。
localが呼び出しサブルーチンでも有効なら
場合によっては動かない組み合わせが出てくるだろうという話。
978 :
nobodyさん :02/07/18 13:58 ID:So56onuk
>>977 だから一般的にはmyを使って、サブルーチンは引数使って呼ぶのがお勧めです。
my $a; $a = "aaa"; &a($a); sub a{ &b; } sub b{ print $a; } これで、bの中の$aがちゃんと表示されちゃうんだけどなぜ。
$main::a だから つーかaはやめれ
>>981 読んだけど聞きたいことが書いてなかったです。
>>982 それは、読んだだけでしょ?理解したの?
理解できたら解決できるよ〜
今まではサブルーチンに行く時は 必ず使う変数を渡すして受け取って使うものだと思っていたのに そんなことしなくても使えることがわかったので混乱しています。 で、myを使えば他のサブルーチンでは使えないはずなのに 使えるからさらに混乱しています。
説明が悪すぎです。ここの人。混乱しています。
>979 ラクダ本p217より このようなプライベート変数のスコープ内から呼び出されるサブルーチンからは テキスト上で、サブルーチンがその変数のスコープ内で定義されている場合を除き プライベート変数を見ることができない。 サブルーチンaおよびbがmy $aのスコープ内で定義されていますので、 表示されます。要するに仕様です。 >980 myで修飾された変数はパッケージ変数とは関係ありません。嘘は駄目です。
>>955 についてはまず基本を:
- use strict を使わないで使用した(宣言しなくても使用するだけでいい)Perlの変数は全て現在のパッケージのパッケージ変数になる。
- パッケージ変数は同パッケージ内ならどこからでも呼び出せる
以上を踏まえた上で元のコード(にちょっと手を加えたやつ)を
説明すると:
sub OUTER {
## この時点で$VARIABLEはパッケージ変数として宣言される
$VARIABLE = "aaa";
INNER();
}
sub INNER {
## OUTER()と同一パッケージ内なのでこの$VARIABLEもOUTER()で
## 宣言された$VARIABLEと同じ物を指す。よって"aaa"とプリントされる。
print $VARIABLE;
}
OUTER()
===
でも以上は悪いコードの見本みたいなもん。ちゃんとuse strictとmyを
使えば混乱しない:
use strict;
our $PACKAGE_VARIABLE = "foo";
sub INNER
{
my $inner_lexical_variable = shift;
print "PACKAGE_VARIABLE => $PACKAGE_VARIABLE\n";
print "LEXICAL_VARIABLE => $inner_lexical_variable\n";
}
sub OUTER
{
my $outer_lexical_variable = shift;
INNER( $outer_lexical_variable );
}
OUTER( "aaa" );
>>959 これは&SUBROUTINE;という表記がちょっと特殊だから起こる。
サブルーチン内で&SUBROUTINE;という表記でさらにサブルーチンを呼ぶと、
現在の@_の値をそのままそっくりSUBROUTINE()に渡す。
sub OUTER{ &INNER }
は
sub OUTER{ INNER(@_) }
と同じ事になるわけ。だから外側で呼んだサブルーチンの引数がそのまま
内側のサブルーチンで使えるわけ。これも特殊な状況でない限り使用は
お勧めしない。
>>975 これは実際に代入をしてみると差がでてわかる。
use strict;
my $GLOBAL = "ORIGINAL";
sub print_global
{
print "\$GLOBAL is $GLOBAL\n";
}
sub WITH_LOCAL
{
print "OUTSIDE of BLOCK\n";
print_global();
{
local $GLOBAL = "NEW VALUE";
print "local()ized \$GLOBAL\n";
print_global();
}
print "OUTSIDE of BLOCK (again)\n";
print_global();
}
>>954 >> while(@res = $st->fetchrow_array) {
>> $data{$res[0]}=1;
>> }
>> こうすると、ハッシュdataに何も入って無いのですが、
$st->fetchrow_arrayが、
(2ch, mona, giko)
というリストを返したとします。
2行目で
%dataの、key: 2chのvalueを1にしていますが、それ以外に何もしていません。
よって、2ch => '1' となるだけで、(それ以前に空なら)%dataには何も入りません。
>> $i=0;
>> while(@res = $st->fetchrow_array) {
>> $data[$i]=$res[0];
>> $i++;
>> }
>> foreach(@data){$data{$_}=1}
この場合は、カウントアップして繰り返しをやっていますので、配列dataの要素に順
番に格納されていきます。
2つめのブロックで、dataの要素をキーとした値をすべて1にしていますので、dataの
要素に格納された分だけ%dataに値が入ります。
しかしながら、上記のコードはまったく意味不明です。
fetchrow_arrayメソッドの仕様をお願いします。
994 :
バカです :02/07/18 18:04 ID:eilzvUxc
>>993 レスありがとうございます。
う〜ん、私にとっては、難しいいですね。基本的なこと分かってないみたいで、精進したします。
変な質問して申し訳ありませんでした。
fetchrow_arrayメソッドは、数字列が入っているだけです。
grep関数でこの数字列以外の配列を、取り出そうとしていた、だけなのですが
途中だけ経過だけ書いてしまいました。
すいませんでした。
995 :
名無し孫 :02/07/18 18:36 ID:nyw/MMTK
996
997!
998!!
999!!!
1000 :
nobodyさん :02/07/18 18:43 ID:oI8Joy39
あ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。