【Perl】初心者コーナーPart9
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
01/12/28 23:21ID:SPLRvqQi1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0159名無しさん@お腹いっぱい。
02/01/13 11:49ID:???それは、requireの仕様。
# てか、requireの使い方を激しく勘違いしているような、、、
とりあえず、perldoc -f requireしてみること!
158の知りたいことが全て解説されている。
0160158
02/01/13 11:53ID:0YPd0etQrequireの使い方は人のCGIを見て使い方を自分の中で勝手に認識したので…。
perldoc -f requireやってみます。
というかどこで(?)やればいいのかも解らないのでとりあえず調べてきます。
それでは。
> というかどこで(?)やればいいのかも解らないので
コマンドラインから
0162名無しさん@お腹いっぱい。
02/01/13 13:35ID:2oX90M6u505で動きません。
アスキーモードで転送したし、
Perlのパスは指定のものに変更したし、
パーミッションも755にしているのに動きません。
何故かしらー??
どころか、テストのために同じ状態でUPした、
Hello World!クラスのcgiも動かないのです。
鯖が悪いのか?FTPソフト(FFFTP)が悪いのか?
お分かりの方おりましたらお教えください。
0163名無しさん@お腹いっぱい。
02/01/13 13:48ID:???使いまくると見づらい?
例えば、$ENV{'QUERY_STRING'}を参照すればいいものをPOSIX::getenv("QUERY_STRING")とやるということ。
0164名無しさん@お腹いっぱい。
02/01/13 15:45ID:???Perlのエラーログ見ました?
0165名無しさん@お腹いっぱい。
02/01/13 15:53ID:iK+xIF0shttpdのログだろ?
0166名無しさん@お腹いっぱい。
02/01/13 15:57ID:???0167名無しさん@お腹いっぱい。
02/01/13 16:06ID:???横から煽るな。
0168名無しさん@お腹いっぱい。
02/01/13 16:14ID:???CGIだけど、なんか質問ある?Part 5
http://pc.2ch.net/test/read.cgi/php/1009331505/
0169156
02/01/13 19:36ID:ZxK7891Wもしよろしければ、もう少し詳しいことを教えてください。
0170名無しさん@お腹いっぱい。
02/01/13 20:05ID:???http://www.google.co.jp/search?q=%82%DD%82%BF%82%CC%82%AD%81@%8Cf%8E%A6%94%C2%81@cgi&hl=ja&lr=
0171156
02/01/13 21:05ID:ZxK7891W申し訳ない。わざわざ有難うございます。
0172名無しウィルス ◆UETvirus
02/01/13 21:26ID:hUoFkGoFております。Q2接続プログラムの解析、関係団体へのメール等、ランキングクリックに
よる宣伝業者へのアクセス数減少と人手はまだまだ必要です。
WEBプログラム板の皆さんの技術を貸していただけないでしょうか。
下記のスレをご覧の上で、ご協力戴ければ幸いです。
「■ 悪徳宣伝業者の画像や動画をばらまくスレ2 ■」
http://wow.bbspink.com/test/read.cgi/ascii/1010876229/
0173名無しさん@お腹いっぱい。
02/01/14 15:38ID:xszmZ/SM子プロセスがいくつ生成されているか、
親プロセスが知るにはどうすれば良いのでしょうか?
具体的にはHTTPのGETをしたりするスクリプトで
子プロセスの数を(例えば3個までとかに)制限したい
ということなんですけど。
0174perl初心者
02/01/14 19:00ID:n0YvEQb/HC Editorというフリーのテキストエディエターで
perlを書いているんですが、保存時の漢字コードをEUCにすると
なぜか保存して、再び読み出したときに中身が文字化けしてます・・・
OSはWINDOWSです、よろしくお願いします。
0175名無しさん@お腹いっぱい。
02/01/14 19:05ID:???なぜその製作者のサイトで聞かない?
それが一番確実なはずだけど。
全然Perlと関係ないぞ、それ
0177perl初心者
02/01/14 20:10ID:RxHccNR/そーします。
0178名無しさん@お腹いっぱい。
02/01/14 23:46ID:zLD178tUpackage foo;
*bar = \&CORE::die;
bar("hoge");
と書いてみましたが,そんな関数知らんと怒られてうまくいきません。
どうやればできますか?
0179名無しさん@お腹いっぱい。
02/01/14 23:57ID:x1aEi06n書き込ませてください。
CGIかうんた設置を試みてるのですが、どうもうまくいきません。
FFFTPを最近使い始めたのですが、転送する前・・・つまり
こちら側にあるファイルのサイズと、鯖に転送したファイルのサイズが
微妙に違うのです。
20000バイトなら、鯖のは19621バイトといったふうに。
こういうのって、CGIの誤作動に繋がりますか?
何度転送してもそのようなサイズになってしまいます。
もしかして広告とか?
でも、やっぱりここで訊くのは間違ってる
0181名無しさん@お腹いっぱい。
02/01/15 00:11ID:???それはFTP転送がASCIIモードだと改行コード変換が行われるから(多分)。
WindowsだとCR/LFで改行だけど、他のOSだとLFだけだったり。
つまり、改行一つにつき1バイト分、サイズが少なくなる勘定。
ちなみにCGI関係は
http://pc.2ch.net/test/read.cgi/php/1009331505/
0182名無しさん@お腹いっぱい。
02/01/15 00:11ID:???他の板で聞いてみます
広告とは?
>>179
> 広告とは?
ゴメソ。適当に言っただけ。忘れて下さい。
0184名無しさん@お腹いっぱい。
02/01/15 08:49ID:DyvaVHMP(sub内のmyな変数のリファレンスを返却)
sub foo {
my %ret;
$ret{"bar"} = "baz";
\%ret;
}
my $r = &foo();
print $$r{"bar"} . "\n";
0185名無しさん@お腹いっぱい。
02/01/15 10:28ID:mJdfZzdE結果はどうなの?
最後の一行を
print $r->{"bar"}."\n";
でどうよ。
0186名無しさん@お腹いっぱい。
02/01/15 11:29ID:???0187185
02/01/15 13:37ID:mJdfZzdEなんだ。そのままで動くやん。
「sub内でのmy変数のリファレンスを返す」こと自体は全然マズくないよ。
0188184
02/01/15 15:41ID:DyvaVHMP>「sub内でのmy変数のリファレンスを返す」こと自体は全然マズくないよ。
ああ、そうなんだ。ありがとう。
0189名無しさん@お腹いっぱい。
02/01/16 02:09ID:JQVH7PKSsub foo {
my ($k, $v) = @_;
my %ret;
$ret{$k} = $v;
\%ret;
}
my $r1 = &foo('key1', 'var1');
print $r1 . "\n";
print $$r1{"key1"} . "\n";
my $r2 = &foo('key2', 'var2');
print $r2 . "\n";
print $$r2{"key2"} . "\n";
print $r1 . "\n";
print $$r1{"key2"} . "\n";
$ ./x.pl
HASH(0x8105ce4)
var1
HASH(0x80f857c)
var2
HASH(0x8105ce4)
$
0190102再びです。
02/01/16 10:23ID:MJHKAqJj時間が空いたのでもう一度書き直してみましたが、動作しません。
出席簿みたいな感じのCGIです、
少しチェックして欲しいです。
require'jcode.pl';
require'cgi-lib.pl';
&ReadParse(*answer);
$name="$answer{'name'}";
open(DATA,">>./log.dat");
while(@dname=<DATA>){
foreach $key(@dname){
($namelist,$count)=split(/,/,$key);
if($namelist eq $name){
++$count;
}
}
print DATA "$name,$count";
0191102再びです。
02/01/16 10:24ID:MJHKAqJj0192名無しさん@お腹いっぱい。
02/01/16 10:52ID:???0193102再びです。
02/01/16 10:57ID:MJHKAqJjでデータを保存したいのです。
それを参照して同じ名前があったらカウント数増加、
なかったら新規で作成という感じにしたいのです。
0194名無しさん@お腹いっぱい。
02/01/16 11:04ID:???追記モードで開いてもポインタがファイルの終端を指しているから
データの読み込みは無理。
SEEKするか?
>while(@dname=<DATA>){
↑これは
>@dname = <DATA>;
こうするか
>while(<DATA>){
こうしなさい。
どちらにしても、追記モードでオープンしてるんじゃ無理。
0195102再びです。
02/01/16 11:08ID:MJHKAqJjopen(DATA,"+>./log.dat");
にして入出力用にすればいいのかな
もうちょっとのところまできてるんでしょうか?
とりあえずもうちょっと修行します。
また、報告させていただきます。
0196名無しさん@お腹いっぱい。
02/01/16 11:11ID:???( ´ ・∀・`) へー
0197名無しさん@お腹いっぱい。
02/01/16 11:16ID:???追記モードだとSEEKでも前に戻れなかったね。
スマソ。
>195
とりあえず書いてみろよ。
ローカルでテストする分には誰も文句言わないから。
0198超初心者
02/01/16 12:10ID:zfCnc17Sopen IN, "highschool.csv";
while ($line = <IN>){
if ($line eq '') { print "(空行)<hr>\n"; next;}
@splited = split (/\n/, $line);
$test = @splited;
@test = grep (/東京/, @splited);
print "@test<hr>\n";
}
close IN;
とhighschool.csvを読んで「東京」というキーワードでGrepかけ、検索結果を<HR>つきで表示させたいの
マッチしなかったところにも<HR>がついちゃいます。どのように回避するのかお教えください、
0199名無しさん@お腹いっぱい。
02/01/16 12:16ID:???これが何やってるかが分からないから
その後も何やってるかが分からない
@splited に何を入れたいんだろう・・・
0200名無しさん@お腹いっぱい。
02/01/16 12:25ID:???while (<IN>) {
if ($_ eq "") {
print "空行<hr>";
} elsif (index($_, "東京") >= 0) {
print $_, "<hr>";
}
}
close (IN);
0201超初心者
02/01/16 12:38ID:zfCnc17S一応読んだcsvを改行コードで区切って@に入れてるんですが。間違ってますか?
それと198で訂正がありましたすみません
open IN, "highschool.csv";
while ($line = <IN>){
if ($line eq '') { print "(空行)<hr>\n"; next;}
@splitted = split (/\n/, $line);
@test = grep (/東京/, @splitted);
print "@test<hr>\n";
}
close IN;
0202名無しさん@お腹いっぱい。
02/01/16 12:45ID:???一行ずつ読み込んで、改行マークでsplitしたって、全文が$test[0]に入るだけでしょ?
csvファイルの区切り文字って\nでしたっけ?
0203超初心者
02/01/16 12:52ID:zfCnc17Sいえこの時点でカンマで区切る必要はなく、改行で区切る必要があったんです。
0204名無しさん@お腹いっぱい。
02/01/16 12:58ID:???これはなにをしてる所?
俺は「ファイルから1行ずつ呼び出す」ものだと思ってるんだが。
つまり\nが二つ以上ある可能性はないのだけれどね。
0205名無しさん@お腹いっぱい。
02/01/16 13:01ID:???while ($line = <IN>){
$c++;
print qq($c行目 $line\n);
@splitted = split (/\n/, $line);
foreach $i(0 .. $#splitted){
print qq($c行目$i個目の要素 $splitted[$i]\n);
}
}
close IN;
とりあえずこれを実行してみて何が起きているか考えてみてくださいな。
0206名無しさん@お腹いっぱい。
02/01/16 13:02ID:???0207超初心者
02/01/16 13:15ID:zfCnc17S>>200さんのアドバイスでできました。
ホントお恥ずかしい・・・
という62文字を使って 1 (あるいは 0)から ZZZZZZZZ までの
62進数を順番に生成したいのですが、上手にやる方法はありますか?
0209名無しさん@お腹いっぱい。
02/01/16 20:36ID:???0210名無しさん@お腹いっぱい。
02/01/16 20:41ID:???0211名無しさん@お腹いっぱい。
02/01/16 21:30ID:???生成した数値(文字列)をどうしたいのか
配列に入れると218340105584895個要素が居るがそれでも良いのか
つーか41で分からんの?
0212名無しさん@お腹いっぱい。
02/01/16 22:55ID:iUy26tny0213名無しさん@お腹いっぱい。
02/01/17 02:36ID:???簡単過ぎ
@char= ('0'..'9','a'..'z','A'..'Z');
for $char ( @char ){
print &xxx($char),"\n";
}
sub xxx{
my( $ret, $flg );
for ( reverse split(//, $_[$[]) ){
unless ( $flg ){
if ( $_ eq 'Z' ){
$_= '0';
}
else {
if ( $_ eq '9' ){ $_= 'a'; }
elsif ( $_ eq 'z' ){ $_= 'A'; }
else { $_++ ; }
$flg= 1;
}
}
$ret= $_ . $ret;
}
$flg ? $ret : "1$ret";
}
0214名無しさん@お腹いっぱい。
02/01/17 02:41ID:EnQVX8GIと
$foo->hoge;
は、上がハッシュだとして、下のは何を表すんでしょうか?
0215名無しさん@お腹いっぱい。
02/01/17 02:50ID:???0216214
02/01/17 02:55ID:EnQVX8GI0217名無しさん@お腹いっぱい。
02/01/18 02:21ID:/Sq0HWtq0218名無しさん@お腹いっぱい。
02/01/18 02:24ID:???0219名無しさん@お腹いっぱい。
02/01/18 12:15ID:/Sq0HWtq試しに「for」と「while」のベンチマークをしてみたところ
やや「while」の方が効率がいいようですね。<読み込むスクリプトでは
まだ簡単なスクリプトでしか試してないので、分かりませんが。
0220名無しさん@お腹いっぱい。
02/01/18 13:09ID:mZLIoXNkmy $query = $ENV{'QUERY_STRING'};
Win用のアパッチでテストした時は良かったんです。
理由を教えていただけませんか
0221名無しさん@お腹いっぱい。
02/01/18 13:17ID:???myを外そう
0222220
02/01/18 13:22ID:mZLIoXNkPerlが腐ってるんですね。
感謝
0223名無しさん@お腹いっぱい。
02/01/18 15:03ID:???解説希望。うちだとエラー起きないから、何処が腐ってるのかわかんない・・・
0225名無しさん@お腹いっぱい。
02/01/18 17:07ID:???ということで>224に同意。
0226223
02/01/18 17:21ID:???0227名無しさん@お腹いっぱい。
02/01/18 18:49ID:???0228名無しさん@お腹いっぱい。
02/01/18 19:10ID:6q/Kp0dNそれで、できたplファイルとshtmlを同じ階層に入れて、
shtmlをブラウザ(IE6.0)で開いて確認しようと思ったんですが、
開けないんです。どーしたらいいんでしょーか。
スクリプトは間違ってないと思うんですが。。。
0229 ◆efPZis9A
02/01/18 19:29ID:y3hRDyTH0230228
02/01/18 19:34ID:6q/Kp0dNApache起動して、ローカルでテストしてます。
ブラウザの右下にある青いバーが
増えていってるだけで画面は何も変わりません。
0231名無しさん@お腹いっぱい。
02/01/18 20:11ID:TBZ1H2T9別の方法があるのでしょうか。
0232名無しさん@お腹いっぱい。
02/01/18 20:35ID:???アクセスカウンターが無限ループしてるとかじゃないの?
>231
\?で大丈夫のはずだよ。
念の為にローカルで試してもみたけど、普通に出来た。
その前後の文に問題があるんじゃないのかな?
0233名無しさん@お腹いっぱい。
02/01/18 21:06ID:???無限ループは無いと思います。サンプルファイルでもやってみました。
アドレスに、
127.0.0.1/*.shtmlとやってますが、白いまんま。
shtmlをhtmlにかえると表示はされるのですが、スクリプトは動かないです。
shtmlのアイコンは、IEのアイコンにならないの?
0234名無しさん@お腹いっぱい。
02/01/18 21:08ID:???そのカウンタを直接呼び出したら?
てゆーか、ApacheのSSIの設定が通ってないとかは?
アイコン変える方法は、ファイルの関連付けでしょう。
0235232
02/01/18 21:18ID:???原因は、本に誤りがあったようです。ホームページで確認しました。
<!--#exec cmd="*.pl"-->
を
<!--#exec cgi="*.cgi"-->
に変えろということでした。変えたところ、上手くいきました。
どうもありがとうございました。
0236名無しさん@お腹いっぱい。
02/01/18 23:49ID:vKcOvEew例えば2002年1月1日の曜日を知りたい場合、以下の式で分かるのですが、なぜこ
れだけで分かるのでしょう?
($year + ($year-1)/4 - ($year-1)/100 + ($year-1)/400) % 7
上の式で出た余りを対応させれば2002年の最初の日の曜日が出ますが、これだけ
でなぜそうなるのか全く分かりません。
また、
$i = ($year + ($year-1)/4 - ($year-1)/100 + ($year-1)/400);
とした上で、
2002年4月1日の曜日を知りたい場合はその前の月(1月から3月まで)の日の合計
(31+28+31)を$iに足して7で割り余りを出すと出て来ます。
($i+(31+28+31)) % 7
でもこの仕組みが良く分かりません。そもそもなぜ年だけで、任意の年の最初の
日の曜日が分かるのか、また、それをもとにしてどうして任意の年の任意の月の
最初の曜日まで分かるのか全く分かりません。
どなたか説明をお願いできますか。
0237名無しさん@お腹いっぱい。
02/01/19 00:07ID:???Zellerの公式で検索してみて
ここに、日付け絡みのサンプルが色々出てるから必読
他にも役に立つしね
http://www.din.or.jp/~ohzaki/perl.htm
0238名無しさん@お腹いっぱい。
02/01/19 01:59ID:tDZ3djB8win98に、間違ってwinNTのPerlをインストールしてしまったんですが、
アンインストールはどうすればいいのでしょうか???
C:を「Perl」とか「NT」で探したら、Temporaryフォルダにしか
ないみたいなんで大丈夫かな?と思ったんですが、
インストーラーをもう一回起動させたら、
『指定されたサービスはすでに存在します』
ってエラーメッセージが!!!!
『アプリケーションの追加と削除』には、何もできてません。
どなたかお助けーーーー!
0239agege
02/01/19 05:21ID:???C:がダメならD:があるさ
0240Tupple3d
02/01/19 05:30ID:tSYJ2BTR$a = 1;
$a = $a++;
Perlで$aの値はどうなりますか?
0241agege
02/01/19 06:00ID:???「すんまそん」って、出だしから寒すぎて手がかじかんでうまく答えがかけないよー。
どうしよー。
0243名無しさん@お腹いっぱい。
02/01/19 06:34ID:???$a = $a++; # $aは 1
$a = ++$a; # $aは 2
0244名無しさん@お腹いっぱい。
02/01/19 07:06ID:tDZ3djB80245名無しさん@お腹いっぱい。
02/01/19 07:21ID:???おめでとう
0246名無しさん@お腹いっぱい。
02/01/19 15:46ID:b2nTXpDvFlashからデータをPOSTで送信しようとすると、
データが渡ってないようです。
GETだとちゃんとわたってます。
cgiはこんな感じです。(一部ですが)
#フォームデータの取得
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN,$query,$ENV{'CONTENT_LENGTH'});
}
else{
$query=$ENV{'QUERY_STRING'};
}
0247初心者
02/01/20 06:05ID:+Bzlb+s3サブルーチンの定義のところで
sub FormThList($;$)
{
処理・・・
}
という部分をいくつも見かけます
引数にある" $;$ " という部分は何をあらわしているのでしょうか?
自分で書籍やWebを調べてみたりしたのですが、引数なのか、リフ
ァレンスなのか、それとも他のものなのか、さっぱりわかりませんでした。
どなたかお分かりの方ご教授ください。宜しくお願いいたします。
0248名無しさん@お腹いっぱい。
02/01/20 15:18ID:GAoGOGYW0249
02/01/20 17:22ID:xUMdAd4Xほら、あれもってきて。って、よく、彼女とかにいってるでしょ。
そのあれ。だよ。
0250名無しさん@お腹いっぱい。
02/01/20 17:58ID:???引数の形式を指定してる。
$はスカラー。;以降は省略可。 ほかにもいろいろ指定できる。
詳しくはperldoc perlsubか,プログラミングPerl改訂版133Pを参照のこと。
0251名無し
02/01/20 21:19ID:Nggbj65w$dir = ''; # 指定ディレクトリ
$file = '.html'; # 検索対象ファイルの拡張子
$key = ''; # キーワード
opendir(DIR,$dir);
@files = readdir(DIR);
closedir(DIR);
foreach (@files){
if(/$file$/){
open(FILE,"$dir/$_");
@data = <FILE>;
close(FILE);
foreach (@data){
$seach = $seach . $_;
}
if($seach =~ /$key/i){
push(@list,$_);
}
}
}
foreach (@list){
print;
print "\n";
}
0252名無しさん@お腹いっぱい。
02/01/20 21:26ID:???URLデコードをしてないとか。
「ー」が含まれてるとか。
余談だけど無駄が多いからもうちょっとシェイプアップした方がいい。
grep使うとか。
0253名無しさん@お腹いっぱい。
02/01/20 23:36ID:9LP6jm+wEUCの場合
$EUC_JP = '(?:[\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])';
if $seach =~ /^$EUC_JP*$key/i {
...
perlメモだかに、詳しく載ってた気がする。
0254agege
02/01/21 03:26ID:???それにしてもサブルーチンに引数の形式を指定するメリットがわかんないんだけど、
どういうことYO!
単に引数形式を明確にするだけのこと?
うーん!こんやも眠れない。
0255名無しさん@お腹いっぱい。
02/01/21 03:31ID:???眠れないんだったらperlsub読みなよ。
どういうときに使うのか書いてある。
0256名無しさん@お腹いっぱい。
02/01/21 03:39ID:???逝っちゃってますねもう
0257agege
02/01/21 03:47ID:???なるほど、漏れが異常なのか。チョットだけ安心しました。
255さんの提案でperlsub読んでだいたいはわかりました。
それにしても今までラクダ本しか読んでなっかったからバージョンアップに伴う追加・更新部分は
未知な部分が多いネー。
0258あうあうあう
02/01/21 07:42ID:???日本語部分は(メッセージなど)EUCで書くのが正解と聞きました。
ところが、DOSプロンプトだとEUCは文字化けします。
Shift-JISで書けば、DOS上では問題ないですが・・・。
どうしたらよいですか?
print "日本語いーゆーしーだ!";
とかでやると
ニ・ワク・、。シ、譯シ、キ。シ、タ。ェ
になります。
■ このスレッドは過去ログ倉庫に格納されています