【Perl 】初心者コーナーPart3

このエントリーをはてなブックマークに追加
1_gunzip

初めて来た方、初心者はまずこのスレッドから始めよう。
尋ねる前に同じ質問がないかこのスレや旧スレ、及び下のリンクを一通り見てみよう。
案外答えはもう書かれているかもしれない。

[関連スレッド]
Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087
【Perl@`CGI】参考書籍 http://tako.2ch.net/test/read.cgi?bbs=perl&key=970166109

[総合]
□入手先&総本山
  ・Perl Com http://www.perl.com/
  ・CPAN http://www.cpan.org/
  ・ActiveState http://www.activestate.com/
□神の御姿
  ・Larry Wall's Very Own Home Page http://www.wall.org/~larry/

[FAQ&過去ログ検索]
  ・Search CPAN org http://search.cpan.org/
  ・Perl初心者 検索の部屋 http://www.harukaze.net/namazu/
  ・とほほほ http://www.wakusei.ne.jp/twn/wwwlng.cgi
  ・CGI-ML内 http://forest.ne.jp/cgi-ml/

[モジュール]
□モジュールの解説(日本語)
  ・河馬屋二千年堂's Page http://member.nifty.ne.jp/hippo2000/index.htm
  ・use Object http://perl.infoware.ne.jp/
  ・いろいろ http://www.bekknet.ad.jp/~bero/docj/module/
□モジュール入手先
  ・ActivePerl http://www.activestate.com/PPMPackages/

[情報源&参考リンク]
□メールマガジン
 ・Perlニュースレター http://www.context.co.jp/
 ・OOP http://perl-oop.hoops.ne.jp/
 ・まぐまぐ内 http://search.mag2.com/reader/Magsearch
□メーリングリスト
  ・CGI-ML http://forest.ne.jp/cgi-ml/
  ・Free-ML内 http://www.freeml.com/search_ml.php?page=1&key=Perl
□参考リソース
  ・Perl初心者の部屋 http://www.harukaze.net/~mishima/perl/index.html
  ・Perl Journal http://www.itknowledge.com/tpj/
  ・WDVL Perl http://wdvl.com/Authoring/Languages/Perl/
  ・Effective Perl http://www.effectiveperl.com/
  ・The Web Techniques Perl Columns (by Randal Schwertz)
    http://www.stonehenge.com/merlyn/WebTechniques/
  ・Beginning Perl Tutorials http://www.pageresource.com/cgirec/index.html
  ・HotScripts http://www.hotscripts.com/Perl/
  ・Perl Month http://www.perlmonth.com/index.html
2_gunzip:2001/01/19(金) 17:58
    。    _ 。 ┌────────────────
      / ̄\\ < 長すぎるって何度も怒られたよ.........
  。  / ミ.   \| └────────────────
     > l≪ ###\/|   〜
     \_____/\|  〜

 。        _   。      。
           // ̄\   。
         |/  ; イヽ ゜   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  〜  |\/### ≫l <   < と言うことで、【Perl】初心者コーナーPart3 です。
〜    |/\_____/     \_________________
                      

3名無しさん:2001/01/19(金) 22:52
OSを判別する方法ってありますか?

組み込みのものでは無いようなので、何かモジュールでもあったら教えてください
4名無しさん:2001/01/19(金) 23:03
>>3
激しくがいしゅつです。
5_gunzip:2001/01/19(金) 23:28
>>3
参考までに
perl -MConfig -e "print $config{osname}"
または、
perl -e "print $^O";

こんな方法もあるそうです(分かりにくい)
#!/usr/bin/perl
print -e "/.\\.\\NUL" ? "Windows/DOS" : "Not Windows/DOS";
6名無しさん:2001/01/19(金) 23:29
>>3
何のOS?
7_gunzip:2001/01/19(金) 23:37
>>5の一番目は、$Config{osname}です。(大文字)
            ^
(三番目はあまり信用しないで。)
8名無しさん:2001/01/20(土) 01:04
>>1
コテハンで継続スレ建てるな。売名厨房か。
9名無しさん:2001/01/20(土) 08:16
だったらなに?
10名無しさん:2001/01/20(土) 09:33
>>8
いじゃん売名でもサー
暇な人が教えてあげると、初心者君には
助かるだろうし。
頑張ってくれたまえ。(ただし、間違えて教えないように)
11名無しさん:2001/01/20(土) 14:46
>頑張ってくれたまえ。(ただし、間違えて教えないように)
なんか偉そうだね
12名無しさん:2001/01/20(土) 17:44
だからなに?
13名無しさん:2001/01/20(土) 17:48
同じDBMモジュールを使ってればOSなんて関係ないよね?

ActivePerl(Windows98)のSDBMで作成したデータファイルを
レンタルサーバ(FreeBSD)上のデータ検索スクリプト(自作)で参照できますよね?
もちろんレンタルサーバにSDBMモジュールが組み込まれている場合に限定して
14_gunzip@病院:2001/01/20(土) 22:31
>>13
おそらく関係ないと思います。
ただ、昔 Netscape::Cache をインストールした際に、DB_File(Berkley DB)
のバージョンが高すぎる(2.xxから1.85にダウングレードしろ)と怒られた経験があるので、
バージョン周りにも気を付けられると良いかと思います。
(殆ど関係ないと思いますが......)

>>8
すまん。以後気を付ける。(いや、本当に)
1513:2001/01/20(土) 23:11
あ。バージョンも気をつけねば・・・
とりあえずサンクス>>14
16名無しさん:2001/01/21(日) 00:11
$name名の変数に値、$valueを代入したいのですが
$$name = $value だと動きません。いい方法を教えてください。
17ん?:2001/01/21(日) 00:24
$name = "$value";
ではいかんの?
18名無しさん:2001/01/21(日) 00:33
>>17
それだと、
$name = "giko"、$value = "mona"、だったとすると、
$name内のデータ、「giko」を「mona」で上書きするだけなんですね。

変数名が「$name」の値、「$giko」に「mona」を代入したいのです。

よろしくおねがいします。
19名無しさん:2001/01/21(日) 00:41
>>16
$DAT{'$name'} = $value;
ではどうですか?
20名無しさん:2001/01/21(日) 00:52
そうですね。連想配列使えばシンプルにすむ話でしたね。失礼しました〜。

>>17様、>>19様、どもどもです。
21名無しさん:2001/01/21(日) 01:11
検索ヒット数が知りたくて、下のような質問を「初心者コーナー Part2 」
で書き込んだのですが、回答を頂けませんでした。
そもそも、質問が初心者以前だからでしょうか…。
それだけでも教えて下さい。調べたつもりなのですが分からなくて。
http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087&st=772&to=772&nofirst=true
22名無しちん、ぴんち:2001/01/21(日) 01:19
>>16
${$name} = $value で。
23名無しさん:2001/01/21(日) 01:38
>>21
これは画像をアップロードしたいのかい?概要説明プリズ
247c:2001/01/21(日) 01:41
もう終わったけど、16はmy変数を使っていたのでは?
(それでハマった経験あり…)

$name = 'giko';
{
my $giko = 'giko';
$$name = 'mona';
print "my giko = $giko\n";
}
print "global giko = $giko\n";

をテストすると動作がわかるかも…。
25名無しさん:2001/01/21(日) 01:42
画像アップがしたいのなら

ttp://www3.mahoroba.ne.jp/~yuugeki/cgi_lab/index.html

のdecoder.plでも使うといい。
ただし無駄な部分がかなり重いので削るように。
267c:2001/01/21(日) 01:50
>>21
@hit = $target =~ /PATTERN/g;
$number_of_hit = @hit;

ではダメですか?
2721:2001/01/21(日) 02:28
>23
画像アップではないです。検索の各値ではなくマッチした数だけ調べてくて。
>26
今はその方法で調べています。
でも、ひょっとして$#arrayの様な方法を知らないだけかも?と思いお聞きしました。

方法の有無が分かれば気持ちもスッキリです。ありがとうございました。
28名無しさん:2001/01/21(日) 02:45
if($xxxx =~ /hoge/i) の後ろのiって何ですか?
29名無しさん:2001/01/21(日) 03:00
>28
大文字と小文字を区別しないというオプションです。
iが無いと書かれたとおり(小文字のhogeだけ)になるみたい。
iはinsensitive…だったかな。
30名無しさん:2001/01/21(日) 03:00
>>28
すみません、小文字と大文字を区別しないですね。
マニュアル調べたらすぐ出ました。
3128:2001/01/21(日) 13:21
>>29
どもどもですー。
32名無しさん:2001/01/21(日) 23:18
あの、テスト用cgiを作ったのですが
なんかエラーになってしますんです。
間違い等あったらご指摘ください。
おねがいします。
#!/usr/bin/perl
print "Content-type: text/html";
require 'jcode.pl';
read (STDIN@`$str@`$ENV{"CONTENT_LENGTH"});
($name@`$memo)=split(/&/@`$str);
($nn@`$nm)=split(/=/@`$name);
($mn@`$mm)=split(/=/@`$memo);
$mm =~ tr/+/ /;
$mm =~ s/%(..)/pack "C"@` hex $1/eg;
&jcode::convert(*mm@`'sjis');
open (FILE@`"ita.htm");
@old=<FILE>;
close FILE;
open (FILE@`">ita.htm");
print FILE "<hr>name<b>$nm</b>";
print FILE ":$mm<br>";
print FILE "@old";
close FILE;
33名無しさん:2001/01/21(日) 23:42
HTTPヘッダのあとに改行2つが無い。

perl -cw で文法チェックはやったんだよね?
34名無しさん:2001/01/21(日) 23:42
>>32
エラーメッセージぐらい書いてよ
35名無しさん:2001/01/21(日) 23:56
ヘッダーの後に改行を入れろ改行を。>32
36名無しさん:2001/01/22(月) 00:30
$sage(内容unko) と $sageage(内容chinchin) がある場合、
unkoage と表示させるには
print "$sage"."age";
でいいのでしょうか?
print "$sageage";だとchinchinが出てきそうなんですが・・・
37japu(AyuMoe):2001/01/22(月) 00:51
試せば分かります。"${sage}age" でも可。
*** 調べること・試すことは重要です ***
38名無しさん:2001/01/22(月) 15:09
>>34-35
有り難う御座います。
簡単なトコロを見落としてたみたいです。
39名無しさん:2001/01/22(月) 15:14
あの、勉強始めたばかりです。
PerlってBasicみたいに、グラフ書けないんですか?

よろしくお願いします。
40名無しさん:2001/01/22(月) 15:20
すみません。初心者です。ちょこっと質問させてください。
%hash('a'=>'1'@`'b'=>'2'@`'c'=>'3');というハッシュがあって
再帰的呼び出しで3回繰り返しその結果が
a=1@`b=2@`c=3
a=11@`b=22@`c=33
a=111@`b=222@`c=333
となるようなサブルーチンを作ってるんですが、
どうしてもうまくいかないので教えてほしいのですがよろしくおねがいします。
41むぎ茶:2001/01/22(月) 15:53
どうしたいのかがわからん。
最初が a=1@`b=2@`c=3
で1回呼び出しても値が変わらず
a=1@`b=2@`c=3
2回呼び出して a=11
3回呼び出して a=111
ってわけじゃないでしょ?
あと 再帰ってのも関係ないんじゃない?
n回よばれると 長さnになるってだけ?
4232:2001/01/22(月) 16:25
とりあえずエラーはなくなったのですが、
また問題が発生してしまいました。
$nmと$mmがファイル出力されてなくて
どうしたらいいのかわからのでご指導お願いします。
43名無しさん:2001/01/22(月) 16:27
さっそくレスありがとうございます。
そうです。n回呼び出すとa=n個みたいな風です。
初心者なもんでうまく理解してないんで、うまく質問できないんですが、
すみません。

44名無しさん:2001/01/22(月) 16:33
はじめまして。
社内ツールをWebで作っているのですが、Perlでエラー処理を書く
場合、ファイルオープン時しか書かないものでしょうか?
Open(LOG@`">>logfile") || die "cannot append: $!;
はよく見掛けるのですが・・・。これだと、ログファイルを
開く時に失敗すると、die関数のエラーメッセージが表示され、
それ以外に何かエラーがあると、Apacheのエラーメッセージが
表示されておしまいですよね。VBのように、エラーが起きたら
OSがエラーを拾い、無条件にエラールーチンへジャンプという
書き方はないのでしょうか。Perlではそういう書き方をしない
ものでしょうか?
45名無しさん:2001/01/22(月) 16:58
>むぎ茶
自己解決できました。x使ってできました。
こんな簡単なものなんですぐにわからなかったんだろう?
あっ!!初心物だったからだ・・・
がんがん育って逝きます。
46_gunzip:2001/01/22(月) 17:14
>>44
例外処理は

eval{
 #実行したいコード
};
if(defined $@){
 #エラールーチン
}

エラーメッセージは特殊変数$@に入っているよ。
(ちなみに、;を忘れないように)

参照
-------
http://www.harukaze.net/~mishima/perl/faq/faq4j.html#4-8
http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
47だぼ:2001/01/22(月) 17:48
ちくしょーNTのばかやろー。なんでうごかねーんだこのダボ!!
テスト時には動いたくせに本番でふぁいるおーぷんえらーじゃ
ねんだよゴルァ!!
なんででしょうね。
48名無しさん:2001/01/22(月) 17:50
さあ
49名無しさん:2001/01/22(月) 18:20
>>46
こんな書き方があったのですか!URLまで丁寧にありがとう
ございます。もう少し読んでみて、頑張ってみます!!
$@をこうやって使うのですね〜なるほど。地道にdieを書く
なんて〜と思っていたのでうれしいです。
50名無しさん:2001/01/23(火) 13:08
>>46
エラートラップを書いてみました。
関数内に書く場合、こつがあるのでしょうか?

sub check {
  my $str;
  〜何か処理〜
  return;
}

sub check {
  eval{
    my $str;
    〜何か処理〜
    return;
  };
  if(defined($@)){
    エラーを表示
  }
}
にするとき、evalの位置は、
>sub check {

>my $str;
のどちらがいいのでしょうか。また、
>if(defined($@))
だとなぜかうまく行かず、
>if ($@ ne ""){
だと成功します。これは理由があるのでしょうか?
51_gunzip@病院食堂:2001/01/23(火) 13:30
あーミスでした。

>>50
>>if(defined($@))
>だとなぜかうまく行かず、
>>if ($@ ne ""){
>だと成功します。これは理由があるのでしょうか?

$@に入るのは最後に実行されたevalのエラーメッセージですから、
これが空文字列ならばOK、何か入っていればNG。
ということで、
if($@ ne "")
の方が正しいです。(これはミスでしたね.......すんません)

>evalの位置は、
>>sub check {
>か
>>my $str;
>のどちらがいいのでしょうか。
前者はちょっとよく分かりません
eval{
sub check{
}
}
ってことですか?(これは意味がない.....)
52名無しさん:2001/01/23(火) 13:56
>>51
失礼しました。evalの位置は、
>sub check {
の直後か
>my $str;
の直後のどちらがいいのでしょうか。

が正しかったです。
試してみると、どちらでも変化無しですが、それ以前にeval{〜
の書き方が悪いせい(私がです)か、この関数が実行時点でエラー
になってしまいます。具体的にいうと、

sub fp_saveParam {
  eval{
    my ($str_chrCode@` $str_form_method@` $str_dataString@` @str_data@` $var_each@`$str_property@` $var_value);
    (ここから処理〜)
    (処理の終了部分から)
    if(!$bln_judge) {
      return 0;
    } else
      return 1;
    }
  };

  if($@ ne ''){
    &fp_systemError("fp_saveParam"@`$@);
  }
}

fp_systemErrorはエラー結果を出力するもので、これば問題ないです。
どこかすごい勘違いをしているのでしょうか?
if($@ ne "") の件は分かりました。空文字列が入るのですね。

#ご入院中でしょうか?
53名無しさん:2001/01/23(火) 13:57
↑長すぎました・・・・・
54_gunzip@病院食堂:2001/01/23(火) 14:07
そのー、どんなエラーメッセージが出ているのでしょう?

それと、
} else
      return 1;
    }
は、
} else {
      return 1;
}
ですよね。(ブラケットが一つ抜けていますが)

>#ご入院中でしょうか?
いえ、逆です。
55_gunzip@病院:2001/01/23(火) 14:28
たびたび済みません。

これは推測ですが、もしかして、
fp_saveParam から値を返そうとして、何も返ってこないため
他の部分でエラーになっているのではないですか?
eval BLOCK 内から値を返しても(return しても)、それは
evalコードの戻り値になってしまいますよ?
(evalがサブルーチンの最後にあれば、同時にサブルーチンからも
evalから返された値が返されますけど)

ですから、このように書いた方が
my $ret; #戻り値
eval{
 $ret = &fp_saveParam();
 #$retの値ごとの処理
 if($ret == 1){
  #いろいろ
 }
 #その他の処理
 .........
};
if($@ ne ""){
 #エラー処理
}

sub fp_saveParam{
 #処理
 reuturn 0; #値を返す(別に0にかぎらんが)
}
56名無しさん:2001/01/23(火) 14:45
>>55
その通りですっ!!
eval{〜を入れた関数が値を返していない(0か1ですね)ため、
あちこちで戻り値がおかしくなり、エラー表示関数が出ていたの
でした。Apacheのログファイルに出ているエラーではないため、
どのようにご説明したらいいだろうと考えて、テストをしていたら
先にご返答を頂きましたね。結果は成功です。
(ちなみに{が足りない部分は、コピペミスでした。ご指摘ありがとう
ございます)
周りにPerlが分かる方がいなく(ASPでしたらいるのですが)、今の
時期に恥ずかしいですが先行開発なので(涙)、このスレッドが頼り
なんです。いつか皆さんに成果を返せるように頑張りますので、もう
しばらくよろしくお願いします。ああでも、本当にお礼したいぐらい
感謝しています > gunzip様および皆様。
57_gunzip@病院:2001/01/23(火) 15:14
>>56
うまくいってよかったですね。ハイ

>>39
恐らく GD::Graph で間に合うと思います。
インストールは、(窓なら)コマンドラインから
ppm install GD::Graph
それ以外ならCPANモジュールでインストール
使用法は、下記参照
http://member.nifty.ne.jp/hippo2000/perltips/ggmemo.htm
58_gunzip@鬱:2001/01/23(火) 15:22
ごめんなさい。間違えました。(何度も性懲りもなく)
http://member.nifty.ne.jp/hippo2000/perltips/ggmemo.htm
これは違うものでした。
これからは気を付けます。
59名無しさん:2001/01/23(火) 15:55
基本的な質問なんですけど
ファイルを「読むだけ」ならファイルロックは不要ですよね?
60名無しさん:2001/01/23(火) 16:02
>>59
書き込み処理が無いならね。。
他のプロセスorスレッドが書き込み中に読むと
読みにミスるから、それを書き込む危険性がある。

読んだ値をその後書き込むなら、そのミスをしないように
普通はロックする必要あり。
6159:2001/01/23(火) 16:56
>60
ありがとう

ローカルマシンで作成したデータベースをネット上で検索するだけのCGIなんだけど
利用者の性質上、ある時間帯のアクセスが1万回以上/時間になりそうなので
とりあえずデータファイルが破損しないか質問してみました

書き込み処理は全く無いからたぶんOKですよね
62名無しさん:2001/01/24(水) 00:07
すごく初心者な質問なのだろうとおもうのですが

(ローカル鯖&他のCGIの動作確認は出来てます)
ローカルで動かそうとすると、「ここから実行しますか云々」の
例のダイアログが出てしまうのです。

んで、TEXTでHTMLソースが出てくる・・・

これはどうしたらいいのですか?
63名無しさん:2001/01/24(水) 00:30
>>62
ヘッダがおかしそう。
64名無しさん:2001/01/24(水) 00:32
parlに関する質問ではないのですが、
他に質問できるような掲示板がなかったので、ここで聞きます。
(すんません)

ftpソフトでcgiを入れてあるフォルダに移動しようとしたら、
そのフォルダごとftpソフトで表示されないというのが時々あるのですが、
これって、表示を復活させることはできるのでしょうか。
まったく別のサーバーで同じような症状が起きているので、
サーバー固定の問題ではないようです。

ちなみに、削除されているわけではなく、
しっかりcgiは動いています。
65名無しさん:2001/01/24(水) 02:24
FTPクライアントのバグ。
66名無しさん:2001/01/24(水) 07:39
視力低下
67名無しさん:2001/01/24(水) 08:16
共有レンタルサーバって何?
専用レンタルサーバって何?
68名無しさん:2001/01/24(水) 09:36
>>62ですが・・・

鯖へFTPしてみたら動きました。
ローカル鯖テストでは(前述のように)動かなかったのに・・・

なんででしょう?

69名無しさん:2001/01/24(水) 10:29
そのフォルダ、なんかディレクトリ構成がおかしいとか。
再帰的にsymbolic linkされていたり・・・
70Perl2日目:2001/01/24(水) 20:45
WebページからIDを入力すると該当者の学生番号を出力する
Perlスクリプトを作りたいと思っています
-----------------------------------------
#!/usr/local/bin/perl

$DBM= "ID_CODE";#データファイル
require "cgi-lib.pl";
require "jcode.pl";

&ReadParse;

$id = $in{"id"};#フォームから送信された検索ID
&jcode'convert(*id@`"sjis");

use DB_File;
tie %DAT@`DB_File@`$DBM;
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n</HEAD>\n<BODY>\n";
print "$idさんの学生番号は$val{$key{$id}}です";
print "</BODY>\n</HTML>\n";
untie %DAT;
-----------------------------------------
一応表示されるのですが何かおかしいでしょうか?
不要な部分、より良い書き方などありましたら教えてください
71名無しさん:2001/01/24(水) 21:04
あの、perlのファイルをexeに変換する
プログラムってないんですか?
72_gunzip:2001/01/24(水) 22:45
>>71
perlcc
参考
perldoc perlcc

Perl2Exeというものもがあるようですが、使ったことはありません。
(シェアウェアで49ドル、試用期間30日)
http://www.indigostar.com/
参考
http://www.google.com/search?q=perl2exe&hl=ja&safe=off&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
73>70:2001/01/25(木) 09:32
perl -wc test.pl で文法チェックすると
Name "main::key" used only once: possible typo at test.pl line 16.
Name "main::in" used only once: possible typo at test.pl line 9.
Name "main::val" used only once: possible typo at test.pl line 16.
test.pl syntax OK

って表示されるよ〜
俺も初心者だから理解できないけど、syntax OKだからいいのかい?

>詳しい人
print "$idさんの学生番号は$val{$key{$id}}です";

こういう使い方でいいの?
74名無しさん:2001/01/25(木) 10:43
>73
print "$idさんの学生番号は$DAT{'$id'}です";
だと思う
75名無しさん:2001/01/25(木) 13:01
デコードもしてないし修正点ありすぎやん
76_gunzip:2001/01/25(木) 16:07
>>70
>一応表示されるのですが何かおかしいでしょうか?
「一応表示される」とは、どのように?
ちゃんと「モナーさんの学生番号は0000です」のように表示されますか?
77名無しさん:2001/01/25(木) 17:05
jcode.pl でJISにコンバートすると株式会社
という文字が文字化けしてしまうのですが何故ですか?
jcode.pl は 2.13 です。
78名無しさん:2001/01/25(木) 17:40
他の文字をsjisかeucで出力してる,に一票〜
状況知らないから適当だけどな
7977:2001/01/25(木) 18:41
訂正です。

cgi 自体は euc 、フォームからデータを受け取って
まとめて &jcode'convert( $**@` "jis") でコンバート。
他でコンバートは行っていません。

としているのですが、なぜか株式会社の式と社だけが文字化け
してしまいます。他の文字は大丈夫です。
80名無しさん:2001/01/25(木) 18:59
>>76
はい。そのように表示されます
だたperl -wcで理解不能なコメントが表示されるし
デコードや配列の使い方がわかりません
81名無しさん:2001/01/25(木) 19:09
どうしてもReferrerが取れません。
症状としては、http://www.domain.com/test.htmlに
透明GIFなどで、CGIを呼び出してReferrerを取ると
http://www.domain.com/と記録されるのです
なんででしょうか??

「オレは取れてる!」と言う人がいたら、
やりかたを教えて下さい。
お願いします。
82サゲ茶漬け:2001/01/25(木) 20:33
>>81
ここかどこかにソースを載せましょう。
83名無しさん:2001/01/25(木) 21:14
>>82

# リファの取得
$referrer = $ENV{"HTTP_REFERER"};

# 書きこみデータを変数に入れる
$da[0]="$referrer\n";

# データをログファイルに書きこむ
$logfile = "ref.txt";
$i=1; open(IN@`"$logfile"); while(<IN>){$da[$i++]=$_;} close(IN);
$j=0;
open(OUT@`">$logfile");
# 10000件まで記録できる
while($j < $i){print OUT $da[$j++]; if ($j==10000){last;}}
close(OUT);


ソースはこれです。
全く取れないで空の場合もあります。
全く別の方法で取るって事も出来るんでしょうか??
もし、あれば教えて下さい。
お願いします。
84EPSOM:2001/01/25(木) 22:06
>>81
これでいけると思いますが
JavaScriptを使って

<script language="JavaScript">
&lt;!--
document.write("<img src=***.cgi?refe=" +document.referrer + ">");
// --&gt;
</script>


$referrer = $FORM{'refe'};

>>82 ソースを載せるほどのことかぁ?
85EPSOM:2001/01/25(木) 22:13
ところでCGIのネタを思いついたので彼女のパソコンを借りた所、
「いって」を打った時、始めの変換で「逝って」となった。
ん?と思い、「うつ」を変換するといきなり「鬱」となった。
ええ!?まさか、うそだろ!?と思い「はぁ」を変換した。
すると「(゚Д゚)ハァ?」となった・・・。
86名無しさん:2001/01/25(木) 22:32
掲示板で、レスのマーク(>)をつけた行の文字色が
変わるようにしたいのですが、いかがいたしたらよろしいですか。
ちなみにstlfbbsです。
87サゲ茶漬け:2001/01/25(木) 22:55
>どうしてもReferrerが取れません。
>症状としては、http://www.domain.com/test.htmlに
>透明GIFなどで、CGIを呼び出してReferrerを取ると
http://www.domain.com/と記録されるのです

ソース見ましたけど、refererが中途半端になる原因はわからないですねぇ。
取得&ログには問題なさそうなので。
88サゲ茶漬け:2001/01/25(木) 22:57
>>84 EPSOMさん
え、原因わかったのですか?
89_gunzip@鬱:2001/01/25(木) 23:04
>>80

>73 のエラーメッセージは、
「変数名(mainパッケージの)keyは一回しか使われてないぞ。タイプミスとちゃうか?」
ということです。
エラーメッセージが出たら、取りあえず辞書でも引くか、ラクダ本の第九章「診断メッセージ」
で探す、又は以下のようなサイトを検索して調べる、といったことをする方が早いかと。
http://wakusei.cplaza.ne.jp/twn/wwwcgi7.htm
http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html

>デコードや配列の使い方がわかりません
デコードはcgi-libのReadParse()がやってくれます。
その他、「配列の使い方」などについては、やはり参考書を読むのが
一番早く、効果的だと思います。
【Perl@`CGI】参考書籍
http://tako.2ch.net/test/read.cgi?bbs=perl&key=970166109

それと、スクリプトですが、
>&ReadParse;
は、&ReadParse(*in);の方がいいです。(どっちでもかまいませんが)

>print "$idさんの学生番号は$val{$key{$id}}です";
は、
print "$idさんの学生番号は$DAT{$id}です";
ではないのですか?
(というより、こうでないと動きませんでしたよ)
90_gunzip@鬱鬱:2001/01/25(木) 23:10
それと
&jcode'convert(*id@`"sjis");
ですが、Perl5ではパッケージデリミタは::(コロン x 2)の方を使う方が
推奨されている(たぶん)ので、
&jcode::convert(*id@`"sjis");
こちらの方がよろしいかと。
91名無しさん:2001/01/25(木) 23:12
>>90
>&jcode::convert(*id@`"sjis");
&jcode::convert(\$id@`"sjis");

リファレンスの方が概して速いです。
92_gunzip:2001/01/25(木) 23:15
>>91
有り難う。

ちょうど下を見て「あー」とか思ったら......
http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
93名無しさん:2001/01/25(木) 23:22
すみません。Perl初心者なのですが、自分のサイトの
ディレクトリの階層をエクスプローラのようなツリー形式で出力するCGIを
書きたいのですが、どのようにすればいいでしょうか
File::Findを使うといいと友人に教えてもらったのですが、そこから先に進みません
どなたか教えてください。
94_gunzip@病院:2001/01/25(木) 23:31
>>93
MSのサイトのようなDHTMLを駆使したやつのこと?
それともtreeコマンドの出力ようなもの?
95名無しさん:2001/01/25(木) 23:40
>>94
テキストで簡単に階層をあらわすようなものです
簡単でいいので教えてください
ところでtreeコマンドってなんでしょうか?PERLのマニュアルにはありませんでした
96_gunzip@もう寝ます:2001/01/25(木) 23:47
>>94
かなり前に作ったやつ。見つかったからはっ付けるよ
いい加減な作りだから、自分で適当に改造して。
ローカルテストしかしてないから、後はしらんよ

#!/usr/bin/perl -w

$dir = shift || die "usage: perl walkdown.pl dirname";
print "$dir\n";
&walkdown($dir@`"");

sub walkdown{
my($dir@`$header) = @_;
my(@dir);
#local(*DIR);
opendir(DIR@`$dir) or die "Can't open $dir!";
foreach(readdir(DIR)){
next if $_ eq '.' or $_ eq '..';
push(@dir@`$_) if -d "$dir/$_";
}
closedir(DIR);

while($_ = shift @dir){

if(@dir){#最後かどうか
print $header @` "├─$_\n";
&walkdown("$dir/$_"@`$header . "│ ");
}else{
print $header @` "└─$_\n";
&walkdown("$dir/$_"@`$header . " ");
}
}
}
97_gunzip@もう寝ます:2001/01/25(木) 23:49
あーあ ずれた もう知らん
それと、>>94じゃなくて>>95
寝る
98名無しさん:2001/01/25(木) 23:50
treeというのは昔MS-DOSに・・・
と思ってDOS窓でやってみたらコマンドまたはファイル名が・・
って言われてしまった。
気のせいだったかな。DOSのコマンドに有ったと思ったが・・鬱だ
99名無しさん:2001/01/26(金) 00:58
>>96

95じゃないけど・・・凄い、これ。
再帰関数のサンプルみたいなもんだなあ。
100電動ナナシ:2001/01/26(金) 05:21
>>98
tree/deltree あったよ。DOS5/6 じゃないとついてないはず。
Windows95 から廃止。
101_gunzip:2001/01/26(金) 09:19
半角スペースがdじゃった
>&walkdown("$dir/$_"@`$header . "│ ");
の"| "は"|" + 半角スペース x 2
&walkdown("$dir/$_"@`$header . " ");
の" "は半角スペース x 4

ちなみに出力例
~/java/src/javax/
├─accessibility
├─naming
│ ├─directory
│ ├─event
│ ├─ldap
│ └─spi
└─swing
  ├─border
  ├─colorchooser
  ├─event
  ├─filechooser
  ├─plaf
  │ ├─basic
  │ ├─metal
  │ └─multi
  ├─table
  ├─text
  │ ├─html
  │ │ └─parser
  │ └─rtf
  ├─tree
  └─undo
10281=83:2001/01/26(金) 10:57
>>84
ありがとうございます!
出来ました!!

ついでと言っては何ですが、
JavaScriptを使わない方法もあるんでしょうか??
もしあるなら、教えて下さい!
お願いします。
10370(Perl4日目):2001/01/26(金) 14:22
ありがとう!
無事に解決しました
----------------------------------------
#!/usr/local/bin/perl

$DBM= "ID_CODE";#データファイル
require "cgi-lib.pl";
require "jcode.pl";

&ReadParse(*in);

$id = $in{"id"};#フォームから送信された検索ID
&jcode::convert(\$id@`"sjis");

use DB_File;
tie %DAT@`DB_File@`$DBM;
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n</HEAD>\n<BODY>\n";
print "$idさんの学生番号は$DAT{$id}です";
print "</BODY>\n</HTML>\n";
untie %DAT;
----------------------------------------
10495じゃないが:2001/01/26(金) 15:05
>>101
Perlでクリップボードを操作するにはどうすればいいの?
こういったのを自動的にクリップボードに張り付けられると
便利なんだけどさ
右クリックから「ディレクトリツリーをテキストでクリップボードに出力」
っていうふうにできない?
105名無しさん:2001/01/26(金) 15:37
質問です。
サーバの容量が10Mという場合、10Mを少しでもすぎたら送れないのですか?
また送れる場合、どの程度までのオーバーが許されるのですか?
106_gunzip:2001/01/26(金) 15:54
>>104
下のように改造すればいいと思う。(たぶんずれるから、修正してから使ってくれ)
>Perlでクリップボードを操作するにはどうすればいいの?
Win32::Clipboard モジュールを使えばいいと思うよ。

#!/usr/bin/perl -w

use Win32::Clipboard;

$clip = Win32::Clipboard() or die "もうしらん"; #クリップボードオブジェクトの取得
$dir = shift || die "usage: perl walkdown.pl dirname";
$output = ""; #global
$output .= "$dir\n";
&walkdown($dir@`"");
$clip->Set($output); #出力をセット

sub walkdown{
my($dir@`$header) = @_;
my(@dir);
#local(*DIR);
opendir(DIR@`$dir) or die "Can't open $dir!";
foreach(readdir(DIR)){
next if $_ eq '.' or $_ eq '..';
push(@dir@`$_) if -d "$dir/$_";
}
closedir(DIR);

while($_ = shift @dir){

if(@dir){#最後かどうか
$output = join(""@`$output @` $header @` "├─$_\n");
&walkdown("$dir/$_"@`$header . "│ ");
}else{
$output = join(""@`$output @` $header @` "└─$_\n");
&walkdown("$dir/$_"@`$header . " ");
}
}
}
107_gunzip:2001/01/26(金) 16:07
右クリックへの追加方法はよく分からないよ.......

たぶん、下のやり方でいいと思う。(うちのWindows98の場合)
レジストリエディタで
HKEY_CLASSES_ROOT\Directory\shell\
以下に好きな名前(仮に"tree"とする)のキーを作って、
その「デフォルト値」にラベル名を(仮に"dtree"とする)設定、
次に
HKEY_CLASSES_ROOT\Directory\shell\tree(上の場合)
に今度はcommandというキーを作り、その「デフォルト値」に以下のように記述する
(Perlのパス) (スクリプトのパス) %1
例(うちの場合)
C:\Perl\bin\perl.exe D:\usr\my_commands\walkdown.pl %1

これでいいと思う。(すくなくともこれでうちの窓では動作した)
もし間違った点とかあったら教えてほしいなあ。>>104
(レジストリをいじって、どうなっても*絶対*責任はとれないが.....
まあ、道義的責任は感じるが、だからどう、というものでもないしな。)
108_gunzip@鬱:2001/01/26(金) 16:17
#こりゃ、Vector辺りにあるものでも使った方がいいと思う。
DOS窓が出て、なんかいやだあ...
しかも遅いし
#うーん。あんまりお役に立てないみたい>>104
109名無しさん:2001/01/26(金) 19:49
バイナリファイルをPerlから扱うにはどうすればいいのですか
110電動ナナシ:2001/01/26(金) 19:53
ツリーを textarea 内に書き出して、全選択 (Ctrl+A) で右クリック - コピーじゃダメ?
全部 Perl で自動化する必然性が良く分からない・・・。
111104:2001/01/26(金) 20:22
>>106-108
ありがとうございます。
ちゃんと動きました。(Win95)

>>110
んー確かに。そちらの方が楽みたいです。

いろいろどうもすみませんでした
112_gunzip@病院:2001/01/26(金) 22:37
>>109
どういった処理がやりたいのでしょうか?
113名無しさん:2001/01/27(土) 07:17
掲示板をつくってるのですが
そのままノーマルに拡張子cgiよりHTMLファイルに出力する方が
軽いのでしょうか?
114109:2001/01/27(土) 09:16
バイナリファイルのサイズを取得する際、ちゃんとbinmodeにしなくてはいけないのですか?
115JAPU(AyuMoe):2001/01/27(土) 10:03
>>113 yes (CGIの起動や実行にはコストがかかります。)
>>114 no (モードに関わらず、-s or stat で問題なく取得可能です。)
116109:2001/01/27(土) 13:31
>>115
ありがとうございます。
(しかし、試せばすぐ分かることでした.... すみません)
117名無しさん:2001/01/27(土) 14:16
皆さんPerlをどのように活用しているのでしょう?
掲示板とかゲストブックとかCGI用途以外で......

#昔スレがあったような気がするのですが.....あげるのも何なので。
118今夜は酢豚:2001/01/27(土) 14:40
未ソートで重複レコードを含むデータファイル(before.txt)を
を重複レコードを削除してソートする方法を教えてください

--------------------
[email protected]
[email protected]
[email protected]
[email protected]
--------------------
↓↓↓↓↓↓↓↓↓↓↓
--------------------
[email protected]
[email protected]
[email protected]
--------------------

#!/usr/local/bin/perl
print sort { $a <=> $b } <>;

↑これじゃだめみたいです
119_gunzip:2001/01/27(土) 14:50
>>118
#!/usr/bin/perl

my %seen = ();
print @array = sort grep(!$seen{$_}++@`<>);

# chomp
120偽名無しさん:2001/01/27(土) 14:50
cat hoge.txt|sort|uniq >muha.txt
121名無しさん:2001/01/27(土) 14:52
>> 118
この例を見る限りSPAMの前準備にしか思えないんだが・・・・。
122JAPU(AyuMoe):2001/01/27(土) 15:02
お好きなのをどうぞ。

#! /usr/bin/perl -w

@kanon = qw[Ayu Nayuki Ayu Makoto Shiori Ayu Mai
Mai Sayuri Akiko Sayuri Mishio];

sub uniq(&@)
{
my $fref = shift;
my %X;
sort grep { not $X{$fref->()}++ } @_;
}

# さくせんその1
undef %X;
@uniq = sort grep { not $X{$_}++ } @kanon;
print "@kanon\n => @uniq\n";

# さくせんその2
@uniq = sort keys %{ { map { ($_ => "moe") } @kanon } };
print "@kanon\n => @uniq\n";

# さくせんその3
@uniq = uniq { $_ } @kanon;
print "@kanon\n => @uniq\n";

__END__
123今夜は酢豚(=118):2001/01/27(土) 15:24
>>119>>120さんありがとうございます
無事にソートしてくれました

>>121
考えすぎですよ〜
同人誌の会員リストを作成してただけです
124:2001/01/27(土) 15:49
>>123
本当に動いた?
つーか俺だけ変態なのかな

#!/usr/bin/perl

#データファイル指定
$datafile = "mail.txt";

#読み込み
open(IN@`"$datafile");
@lines = <IN>;
close(IN);

#ソートしてから重複データを削除する
my %count;
@lines = sort { $a cmp $b } grep ( !$count{$_}++@` @lines );

#書き込み
open(OUT@`">$datafile");
print OUT @lines;
close(OUT);
125名無しさん:2001/01/27(土) 16:41
あの、教えて欲しいんですけども、
例えば118さんの書いた様なファイルがあって、
それに一行ずつ書き足していくCGIがあったとします。
何かが原因でそのファイルのある部分(1行)だけ抜け落ちる、
って事は起こり得るんでしょうか?
126名無しさん:2001/01/27(土) 17:13
はい。起こり得ます
127名無しさん:2001/01/27(土) 17:22
>125
起こり得ます。
が、その"何か"っていうのはプログラム上の問題点(バグ)
だと思われます。
128サゲ茶漬け:2001/01/27(土) 18:01
>>125
起こり得ないように出来るかもしれない。

きっちりプログラムを書けば、
(マシンが逝かない限り)
データ追記(書き足し)ではミスらないでしょう☆
129名無しさん:2001/01/27(土) 18:01
>>123
> 考えすぎですよ〜
> 同人誌の会員リストを作成してただけです
ワラタ
130Perl初心者:2001/01/27(土) 23:24
Perl初心者なのですが現在板を作っています。
bord.cgiからHTMLファイルに出力させたいのです。
出力までは普通に出来ました。
unshiftを使って処理させたいのですがうまく動きません。
どなたかご教授お願いします。

#!/usr/local/bin/perl

$homonsya = $ENV{'QUERY_STRING'};

@group = split(/&/@` $homonsya);
foreach $ans (@group)
{($name@` $value) = split(/=/@` $ans);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("c"@` hex($1))/ge;
$ok_homonsya{$name} = $value;}

$name = $ok_homonsya{'myName'};
$mail = $ok_homonsya{'email'};
$Honbun = $ok_homonsya{'honbun'};

open(FILE@`"bord.html");
@allbody=<FILE>;
close(FILE);
$full="名前:$name e-mail:$mail<br>本文:$Honbun\n<hr>";
unshift (@allbody@`$full);
open (FILE@`">bord.html");
print FILE @allbody;
close (FILE);
print "Location:http://wawawa.e-chome.net/cgi/bord.html\n\n";
131名無しさん:2001/01/27(土) 23:30
132_gunzip@おやすみ:2001/01/27(土) 23:44
>unshiftを使って処理させたいのですがうまく動きません
ちょっと意味が...分からないのですが、
ローカルでは、どんなエラーメッセージが出ていますか?

unshiftを使わなくても、書き出すときに
print FILE @allbody @` $full;
とすればうまくいくような気がします。

#....大きく.はずしている気が。
133130:2001/01/27(土) 23:51
>>132

すいません。わかりずらい説明で。
えーっと新しい投稿ほど上に来るようにしたいのです。
unshiftで出来るみたいだったので...
ローカルでは実験してないのです。
134名無しさん:2001/01/28(日) 00:04
>>130
> $full="名前:$name e-mail:$mail<br>本文:$Honbun\n<hr>";

ここがぁゃιぃ。
135_gunzip:2001/01/28(日) 13:20
>>133
>unshift (@allbody@`$full);
このようにすると、こんな事になりませんか?
-----(元)
<HTML><HEAD>(省略)</HEAD><BODY>
名前:name1 e-mail:mail1<br>本文:Honbun1\n<hr>
名前:name2 e-mail:mail2<br>本文:Honbun2\n<hr>
</BODY></HTML>
-----
”名前:name3 e-mail:mail3<br>本文:Honbun3\n<hr>”を追加すると、
-----(後)
名前:name3 e-mail:mail3<br>本文:Honbun3\n<hr>
<HTML><HEAD>(省略)</HEAD><BODY>
名前:name1 e-mail:mail1<br>本文:Honbun1\n<hr>
名前:name2 e-mail:mail2<br>本文:Honbun2\n<hr>
</BODY></HTML>
-----
ですから、「名前」と「メールアドレス」と「本文」を格納した
データファイルでも作っておいて、"<HTML><HEAD></HEAD><BODY>"に続けて、
まず新しく投稿されたデータを書き出し、その後にファイルから読み込んで
書くのが簡単だ思いますが。

136名無しさん:2001/01/28(日) 13:58
漠然とした話で申し訳ないがDB_Fileのメリットを教えてください
同じデータを格納しても他のDBMよりデータファイルが大きいですよね
137>136:2001/01/28(日) 14:01
これ読んで好きなDBMを採用してください
http://www.perldoc.com/perl5.6/lib/AnyDBM_File.html#DBM%20Comparisons
138_gunzip:2001/01/28(日) 14:10
>>136
他のものに比べて早いらしいね。
http://www.sleepycat.com/
ソースも付いてるから、読んでみよう
139136:2001/01/28(日) 16:09
>>137-138
ファイルサイズは大きいけど検索するスピードは速いみたいですね
ありがとう
140名無しさんの野望++:2001/01/29(月) 05:36
open関数で
open(IN@`"DIR |") or die "";
としたとき、エラー出力を得たいのですがどうすればいいかわかりません
厨房な質問でスマソですが、誰か答えてください。
141_gunzip@ホットスパー艦長:2001/01/29(月) 06:02
>>140
open(IN@`"any_command 2>&1 |") or die "";
これでは駄目ですか?
(窓では駄目だったかな)

IPC::Open3で
use IPC::Open3;
my $pid = open3(\*WTRFH@` \*RDRFH@` \*ERRFH@`'ls -la') or die "アヒャ";
としてERRFHから読めばいいような気が

#んー朝で頭ぼけてるからこんなとこ
142ぷっか:2001/01/29(月) 09:53
ええと、質問なのでぷが、CGI掲示板ってありまぷよね、
それのCGI出力の物(bbs.cgi)とHTML出力の物(bbs.html)は、
どう違うんでぷか?2ちゃんもHTMLなのかな?教えてくらぷい。
143名無しさん:2001/01/29(月) 13:02
>>142
HTML出力ならば、表示する時にCGIを使わない為
CGIによるサーバへの負荷が激減します。
144名無しさん:2001/01/29(月) 13:06
perlスクリプトを1日1回とか定期的に動作させたいんですけど
いい方法ありませんか?
普通サーバの方で細工するのかも知れないけど
よく分からないし・・。
145名無しさん:2001/01/29(月) 13:19
print "$obj->Test";
でオブジェクトを変数展開したいんですけど
->Testがテキストになっちゃいます。
どうしたらよいのですか?
146名無しさん:2001/01/29(月) 13:34
$ENV{'REMOTE_HOST'}として、IPアドレスを取得したいのですが、何故かできません。
私のテスト環境は、Linuxをサーバーとして使用し、Windows2000をクライアントとして、
ローカルネットワークでテストしています。
IPアドレスはグローバルIPじゃないと取得できないのでしょうか?
ご教授、よろしくお願いします。
147名無しさん:2001/01/29(月) 13:53
>>144
分からん・・。俺もコレ教えてほしぃ。

>>145
print $obj->Test;
じゃ駄目なの?
勘違いしてたらゴメン。

>>146
$ENV{'REMOTE_HOST'}
ローカルでもローカルIPを取得できます。
なにか間違えているのでしょう。
148146:2001/01/29(月) 14:04
>>147さん
レスありがとうございます。解決いたしました。
$ENV{'REMOTE_ADDR'}としたら、IPアドレスを取得できました。
その他のコードは、やはり間違っていません。
この二つを使い分けないといけないのでしょうか?
使い分けるポイントとは、一体どこなんでしょうか?
149名無しさん:2001/01/29(月) 14:06
>>148
$host=$ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'};
こんな感じ。
150偽名無しさん:2001/01/29(月) 14:57
>>144 普通はcronしかないね。

>>146 最近は重くなるので逆引きを行わないサーバが多い。
そのためREMOTE_HOSTには何も入らない。
151偽名無しさん:2001/01/29(月) 15:01
ちょっと考えたけど
while(1){
 unless(fork){
  処理
  exit;
 }
 sleep $n;
}
みたいにしたらできないかな?
152名無しさん:2001/01/29(月) 15:07
cronってのをもう少し詳しく教えてください。
もしくは、詳しい解説のあるページとかありませんでしょうか?
153名無しさん:2001/01/29(月) 15:15
perlスクリプトから別のperlスクリプトを実行するには
どうしたらよいのでしょう??
154名無しさん:2001/01/29(月) 15:26
>>153
system '/usr/bin/perl'@`'aaa.cgi';
155146:2001/01/29(月) 17:07
>>150さん
なるほど、そうだったのですね。私が持っている本が古いのでしょうかね?
でも、理由が分かって安心しました。今度からはIPアドレスを取得する時は
REMOTE_ADDRを使用します。

みなさん、ありがとうございました。
156145:2001/01/29(月) 17:49
>>147さん
print "$a->{key}\n";とか、ハッシュへの指定だと
ちゃんと展開されるんですけど
メソッドに対しては展開されないのでしょうか。
157名無しさん:2001/01/29(月) 18:53
print "@{[$moe->method()]}\n";
158名無しさん:2001/01/29(月) 21:42
>>153
do "hogehoge.cgi"
159名無しさん:2001/01/29(月) 22:03
米のサーバーに設置するときの時間設定は
(@`$min@`$hour@`$day@`$mon@`$year@`$wday) = localtime(time);

(@`$min@`$hour@`$day@`$mon@`$year@`$wday) = localtime(time + 9*60);
と変えればいいんでしょうか?
160サゲ茶漬け:2001/01/29(月) 22:05
$ENV{'TZ'} = 'JST-9';
とかすればいいんじゃないかな?
↑は思いつきで書いたから正しいかは不明。
161名無しさん:2001/01/29(月) 22:31
>>157
できました!ありがとうございます!
162名無しさん。:2001/01/29(月) 23:06
ファイルの中身をソートしたいのですが、どうしても巧く行きません。

$file = 'file.txt'; #ソートするファイル名
$sortfile = "sort -t '<>' -k4 -k5 -k6 $file>sortfile"; #<>:デリミタ k4〜k6:ソートするキー番号
$sf = system $sortfile;
$sortfile = "cat sortfile>$file";
$sf = system $sortfile;

一応、このプログラムで、
100<>200<>300<>40<>50<>300<>40<>50
110<>240<>350<>80<>50<>400<>40<>50
110<>260<>300<>40<>50<>100<>40<>50
こういったデータのソートはできます。

しかし、サーバによって何故か動きません。
たぶん、systemでコマンドがキックできないせいだと
思いますが。

ということで、perlだけでソートを行う方法をどなたご教授頂けませんか。
どうかよろしくお願いします。
163_gunzip@寝る:2001/01/29(月) 23:34
>>162
sort -k4@`6だから、
@array =
map {$_->[0]}
sort {$a->[4] <=> $b->[4] or $a->[5] <=> $b->[5] or $a->[6] <=> $b->[6]}
map {[$_@` split /<>/]} <>;

print join("\n"@`@array);

-------
参考
http://www.effectiveperl.com/ (Eng)
http://www.din.or.jp/~ohzaki/perl.htm#SortMulti (日本語)
164_gunzip@寝る:2001/01/29(月) 23:37
訂正
>sort -k4@`6だから
sort -k4@`5@`6だから
165ぷっか:2001/01/29(月) 23:42
>>143 ありがぷう
166名無しさん:2001/01/30(火) 03:02
>>159
世界中どこの鯖でも
gmtime(time+9*3600)
で日本時間は手に入る
167名無しさん:2001/01/30(火) 10:02
$ENV{'TZ'} = 'JST-9'; って環境変数をいじるのは
やめた方がいいって聞いたんだけど??
168名無しさん:2001/01/30(火) 10:28
やめた方がいい理由と情報ソースを書いてくれ
169サゲ茶漬け:2001/01/30(火) 10:33
>>167
あれ、そうなの?
是非情報源を教えて下さい☆
170サゲ茶漬け:2001/01/30(火) 10:40
さっき、ハック板とプログラム板みたけど、程度が低すぎるね(藁
このCGIレンサバ板の方がよっぽどマシだわ・・・。

まぁ、このスレには関係ないけど。
171名無しさん:2001/01/30(火) 10:43
>>169
http://www2.kiwi-us.com/~j_n/perl/#localtime

ん〜何が良くないのかよく分からんけど
環境変数変えると、その後も変わったままなのでは?
だとしたら、同じサーバの人に迷惑が掛かる可能性が・・。
俺の勘違い??
172162:2001/01/30(火) 11:02
>>163-164
動きました!
参考urlも大変勉強になりました。
今後とも精進させていただきます。
ありがとうございました!!
173名無しさん:2001/01/30(火) 11:20
>>170
医療関係者と学生が荒らしてるんだよ(涙
174名無しさん:2001/01/30(火) 11:27
スカラー値に上書きせずに徐々にスカラーの長さを伸ばす方法ってありますか?
たとえば$a="ありがとう";っていれて次に$a="さようなら";って入れると結果的に
$aは"さようなら"になるじゃないですか?それを"ありがとうさようなら"ってまた何か入ってきたら
さようならの後ろにと徐々に伸ばしていく方法がありましたら教えてください

初心物で質問のしかたが下手なのですみません。
175サゲ茶漬け:2001/01/30(火) 11:38
>>174
$a = "ありがとう";
$a .= "さようなら";
こんなんでどうかな?
176サゲ茶漬け:2001/01/30(火) 11:40
>>171
ありがとう。
理由が「後に影響を残さないように」って書いてありますね・・・。
影響が残ったらまずいことでもあるのかなぁ☆

>>173
医療関係者と学生・・・ウゼェ
177unko:2001/01/30(火) 11:51
環境変数変えてそのままになるわけねーよ。
UNIX鯖でスクリプト動かすならUNIXの基礎知識くらいおぼえとけ!
178名無しさん:2001/01/30(火) 11:55
初心者コーナーで威張るな(ウケケ
179名無しさん:2001/01/30(火) 11:57
>>176
学生はわからんでもないが、医療関係者って思いつかん(見つからん)な。
どんな奴?
180名無しさん:2001/01/30(火) 11:57
>>176
どんな影響を残したくないのか不明だが
同じサーバ利用者の時刻表示まで変わることはないですよ

せいぜいチャットやBBSで表示する時刻を日本時間にする程度です
181サゲ茶漬け:2001/01/30(火) 12:20
>>179
俺に聞かないで。>>173に聞いて。
182サゲ茶漬け:2001/01/30(火) 12:21
>>177
それぐらいのことはみんな当然として知っているでしょ?
例のページの真相を探ろうって話で☆
183サゲ茶漬け:2001/01/30(火) 12:22
>>178
俺のこと?いや違うな・・・。
俺は威張れるほどのこと書いてないし(藁
184173:2001/01/30(火) 12:27
>>179
純情恋愛板のコテハン「薬剤師」。最近は鳴りを潜めたけど…
プログラマ板になんでこんなスレを立てたんだ?
おまけに個人は特定されたらしい。去ね!
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=980095465
185173:2001/01/30(火) 12:30
間違いっす。すいません
個人は→個人名は
186名無しさん:2001/01/30(火) 12:36
UNIXの基礎知識・・・
ココperl初心者のスレだって。。ワラ
187179:2001/01/30(火) 12:52
にゃるほどね。 ども。 >>184
188名無しさん:2001/01/30(火) 13:03
>サゲ茶漬けさん
あぅ〜(T-T)できました。。簡単に・・・・ありがとうございます。
脳みそ不足でした。
189Oo。(^。^)y-゜:2001/01/30(火) 13:07
Oo。(^。^)y-゜ またーり いきましょうや。みなさん
190名無しさん:2001/01/31(水) 15:21
Cookieがわからなくて困ってます。
index.cgiで$testと$test2という変数をCookieに指定して、
print "Set-Cookie: NAME=$test; NAME2=$test2; \n";

next.cgiで
# cookie取り出し
foreach (split(/; /@`$ENV{'HTTP-COOKIE'})){
($key@`$value)=split(/=/);
$cookieJar{$key}=$value;
}
$cookieJar{'NAME'}=$test;
$cookieJar{'NAME2'}=$test2;

# htmlで表示
print "Content-type: text/html\n\n";
print <<EOF;
<HTML><HEAD><TITLE>Cookieテスト</TITLE><BODY>
$test<br>
$test2<br>
EOF

と書いたのですが、$test、$test2の変数が画面に出ません。
Cookie取り出しの部分が間違ってるのでしょうか?
191名無しさん:2001/01/31(水) 15:27
$test = $cookieJar{'NAME'};
$test2 = $cookieJar{'NAME2'};

ちゃんと</HTML>まで書いても駄目ですか?
192名無しさん:2001/01/31(水) 15:45
>>191
ありがとうございます。最後、</BODY></HTML>付け忘れてました。
直してやってみたんですがやっぱり変数が表示されません。
193サゲ茶漬け:2001/01/31(水) 16:59
print $ENV{'HTTP_COOKIE'};
とすると何が表示されますか?
194名無しさん:2001/01/31(水) 17:05
サゲ茶漬けさん、ありがとうございます。↓のように
記入してみたんですが、何も表示されません。Cookieの取得が
間違ってるんでしょうか?テストはAnhttpdで行ってます。

print <<EOF;
<HTML><HEAD><TITLE>Cookieテスト</TITLE><BODY>
$ENV{'HTTP_COOKIE'}; <br>
</BODY>
</HTML>
EOF
exit;

195194:2001/01/31(水) 17:14
print "Set-Cookie: NANE=VALUE; 以下省略 ";

ちゃんと宣言してますか?
196195:2001/01/31(水) 17:15
ごめん
>>194宛です
197名無しさん:2001/01/31(水) 18:57
>>194
何も表示されないなら、取得以前に
クッキーがセットできてないんだよ。
198名無しさん:2001/01/31(水) 19:11
米塩入れねー。
どのくらいでもとに戻るの?
199サゲ茶漬け:2001/01/31(水) 23:20
>>194
「AnHTTPDはHTTP_COOKIEをセットしてくれる」という前提で書きますが、
>>197の人の言うようにクッキーをセットできていないだけだと思います。

expires=を指定しない場合の挙動がどうなるかを知っている人、フォローして下さい。
2007c:2001/02/01(木) 00:01
expiresを指定しないと、ブラウザ終了時(窓閉じたときかも?)に
クッキーは破棄されます。
201名無しさん:2001/02/01(木) 01:10
少し抽象的になるんですが、Perlってどんな処理をしたときにサーバーに負担かけるんですか?
なるべく軽いCGI作ろうと思ってるので、(負担をかける、かけないという意味で)Perlが得意な処理、苦手な処理の例を教えてください。
202名無しさん:2001/02/01(木) 01:23
Perlに限らないけどファイルアクセスはなるべく減らしたほうがいい。
203サゲ茶漬け:2001/02/01(木) 01:46
>>200 ありがとう

>>194
Expiresを試しに指定して、やり直してみましょう。
何か変化あるかもしれませんよ。
204名無しさん:2001/02/01(木) 10:51
つまり別に保存したCSVファイルを参照するより
Perlスクリプト内部に配列として格納した方が
サーバに負担がかからないんですか?
利便性は度外視した場合、どうなんでしょうか
205名無しさん:2001/02/01(木) 14:32
>>201
CGIならば、出力送信が処理的にきついらしい。
だから表示部を2chの掲示板みたいにhtmlファイルを作成して表示させる方が
全然軽い。

型宣言がない分perlでの計算処理は、Cに比べてかなり遅いのでは?

ファイルの読み書きの負担が大きいってのは
メモリに格納して処理する方が無駄にメモリを食うので
負担がデカイって聞きましたけど。。

206名無しさん:2001/02/01(木) 14:47
メール送信スクリプトに関する質問です

フォーム上で訪問者がメールアドレスを入力すると
そのアドレスに私が描いたCGの場所(URL)を
連絡するようにしたいと思っています

もし存在しないメールアドレスに送信した場合
そのエラーログを見ることはできるのでしょうか?

私は普通のプロバイダを利用しているので
sendmailのログなどは見れないと思います
207名無しさん:2001/02/01(木) 17:27
ttp://www.isn.ne.jp/~nayuki/cgi-sample/upload.cgi
↑のコメント部分を複数行にしたいのですが、分かる方いたら教えてくださいm(._.)m オネガイ。
過去ログは呼んだんですが、自作PC板やその他の板と違って書いてあることがさっぱり分からなかったり(^^;。
親切な方いたらよろしくです。
208ほういち:2001/02/01(木) 17:52
>206
あまり詳しくないですが・・・
open(MAIL@`"| $sendmail -t");
などとやって送る場合は、送信相手を確認して
送る事ができないのでsendmailのログを見ない事には
エラーはわからないです。
SMTP通信で送信する場合はいちいち相手を確認するので
相手が存在しなければエラーが帰ってくるのでわかります。
209JAPU(AyuMoe):2001/02/01(木) 18:44
>>208
> SMTP通信で送信する場合はいちいち相手を確認するので相手が存在しなければエラーが帰ってくる
とは限らない。
210名無しさん:2001/02/01(木) 18:58
>>207
一からperlなりCGIなりを勉強してください。
さっぱり分からない人に教えるのは非常に困難です。
211ほういち:2001/02/01(木) 19:43
>>209
すみません・・・
212名無しさん:2001/02/01(木) 19:45
AnHTTPD+ActivePerlなのですがこれって
perlの標準のSDBM使えますよね?
実は今使えてるのは使えてるのですが、
データが100バイト程度を超えるとその
レコードが消えてしまうようなのです。
先日まで、ID:PASSみたいな短いデータしか扱って
なかったので気がつきませんでした。
何か原因がありましたらアドバイスをお願いします。
213206:2001/02/01(木) 21:06
>>208
回答ありがとうございます
とりあえずエラーを確認できないと気持ち悪いので
別の方法を考えようと思います

>>209
とは限らない・・・と言うことは
基本的にはOKなんでしょうか?

>>212
その環境ならSDBMは標準搭載してます
レコードの上限は1Kなので容量には問題ありません
原因はスクリプトを見ないとわからないと思います
214:2001/02/01(木) 21:40
perlにてpop3のメール受ける事は出来るんですが
jis(?)を変換出来ません。
perlだけでいい方法ないですかね?

処理の流れ
接続→パスワード認証→listしてretrする→受け取ってテキストに吐き出す

吐き出したデーターを次の処理に受け渡したいんですが...
215名無しさん:2001/02/01(木) 22:00
http://www.geocities.com/dvqlpx/index.txt
エラーがでて動きません。
エラー内容を見て自分なりにやってみたんですがだめでした。
どなたかお願いします。
216名無しさん:2001/02/01(木) 23:02
>>215
俺が修正してもキミの意図するものとは違う可能性が大きいです
何をどうしたいのか明確に書いてください

アーメン2号をどんな風に改造したいの?
デフォルトでは設置できたの?
217名無しさん:2001/02/01(木) 23:11
ジオのことだし、module利用できないとか。。。
218名無しさん:2001/02/01(木) 23:13
>>214
use Jcode;
219215:2001/02/01(木) 23:16
>>216
ひとまず手を加えていなかったときのアーメンは動いてました。
トップページにコンテンツ等と一緒に環境変数を表示させたかったので
アーメンが出力するIPアドレス等の位置を変えてみればいいかなと思ってやってみたんですが
最初自分が修正したときはホストが表示されなかったので
も一回いじってみたら、それからは幾度変更してみても動かなくなりました。
220212:2001/02/02(金) 08:03
>>213
そうなんですよね。1kbまでいけると思うのですが・・・
この問題2日以上悩んでるのです。もういい加減諦めようと思うのですが、
なんとも気持ち悪くて。いろいろ試した結果、どうも1つのレコードは
1KBまでいけるようなのですが、連続して処理しようとすると累積で
1kbを越えたところでおかしくなるようです。(短いデータでも100個
位やると、数個落ちたりします。)
コードは凝縮すると以下のようなものです。データのとこばかりデカイの
でここに書くのもどうかと思ったのですが、イライラしちゃってるので
書きます。(ループでデータを作ったりした場合は正常に動作します)
このコードでwin+anhttpd+activeperlではデータが表示されません。
linux+apache+perlでは何の問題もなく動作します。
221212:2001/02/02(金) 08:03
#!/usr/bin/perl

dbmopen( %dbhash@` 'db' @`0666) ;
while (<DATA>) {
($time@`$message) = split(/<>/);
$dbhash{$time} = "$message";
}

print "Content-type: text/html\n\n";
foreach ( keys %dbhash ) {
print "$_<BR>\n";
}
dbmclose ( %dbhash );

__END__
98111111<>テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。テストデータ1。
98222222<>テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。テストデータ2。
98333333<>テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。テストデータ3。
98444444<>テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。テストデータ4。
222_gunzip:2001/02/02(金) 08:39
>>220
今試してみたけれど、anHttpd1.32f+Win98+ActivePerl5.6で
OKだったよ。(データを増やしたりしてテストしたけれど。)

いくつか欠けるということは、もしかしてキーが重複してない?
print "$time はすでに定義されとるよ" if defined $dbhash{$time};
223212:2001/02/02(金) 12:41
>222
ありがとうございます。うちも全く同じ環境なのですが・・・
キーの重複の件は一番疑ったのでdbはまっさらな状態でテストしてます。
上に書いた明らかに重複していないデータでもアウトなんです。
で・・いろいろ調べた結果・・・結論らしきものが見えてきました。
キーの値がtime値のような9桁の実数だと挙動がおかしくなるんです。
キーの値を8桁にしたり10桁にしたりするとちゃんと動作します。
嘘みたいな話ですが・・本当なんです。
http://homepage1.nifty.com/yito/namazu/gbook/20000728.2352.html
ここにも似たような話があるのでどうも自分のミスではないような
気がしてきました。
224名無しさん:2001/02/02(金) 14:12
>>215
sub html の最後に } がない
if (($host eq $addr) || ($host eq '')) {
にも } がない。
これperl -wc でエラーでない?
225名無しさん:2001/02/02(金) 15:34
遅レスですみません。
Cookieについて質問した者です。
色々試していて、あまり理解してないのですがexpiresは
指定しなくてもうまくCookieを指定することが出来ました。
---
index.cgiで、以下のようにSet-Cookieをして、
print "Set-Cookie: NAME=$test1; \n";
print "Set-Cookie: NAME2=$test2; \n";
---
next.cgiで、
$cookie=$ENV{'HTTP_COOKIE'};
($cookie@` $test1@`$test2)=split('='@`$cookie);
・・・とすると、HTML表示で変数をそのまま書くだけでCookieの内容を見れました。
しかし、$test2は正常に表示されるのに、$test1は『○○○; NAME2』と$test2に付けた
Set-Cookie時の名前が付いてしまいます。どうす?%EAば良いでしょうか%8
226ど素人:2001/02/02(金) 16:07
$ENV{HTTP_COOKIE}には

NAME1=hoge; NAME2=foo; NAME3=moe

というふうに入ってますので
フォームのデコードとおなじようにやれば
うまく逝くと思います
227名無しさん:2001/02/02(金) 16:38
226さん、ありがとうございます。
デコード処理は本の通りに以下のように行ってみました。
---
foreach (split(/; /@`$ENV{'HTTP-COOKIE'})){
($key@`$value)=split(/=/);
$cookieJar{$key}=$value;
}
$cookieJar{'NAME'}=$test1;
$cookieJar{'NAME2'}=$test2;
---
これだとHTMLで何も表示されなくなります。
フォームと同じようにデコードというとこんな感じで良いのでしょうか?
これも間違っているようで全く表示されないです。
---
$length = $ENV{'HTTP_COOKIE'};
read(STDIN@`$buffer@`$length);
($test1@`$test2)=split( /&/ $buffer );
($data1@`$test1)=split( /=/ @` $test1 );
($data2@`$test2)=split( /=/ @` $test2 );
$test1 =~ tr/+/ /;
$test2 =~ tr/+/ /;
$test1 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C"@`hex($1))/eg;
$test2 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C"@`hex($1))/eg;
228名無しさん:2001/02/02(金) 18:16
非常に厨房な質問です
perlでフォームから入力をしたいんですが
selectタグを使って選ばせたところのvalueにアドレスをいれて
選択したらそのページに飛ばしたいのですが。。。
とりあえずselectからのデータが取れません。。。
通常のテキストからだと取れるんですが。。。
そこら中のページを見てものってないっす、どなたかヒントだけでも
教えてください。
229名無しさん:2001/02/02(金) 18:24
>>228
そんなのどこかのスクリプトの中にあるでしょ
ってゆうかJAVAスクリプトではだめなのか?
230名無しさん:2001/02/02(金) 18:27
どーせCGI串とかつくるんだろう?
つーかCGI串さがして勉強しろ
231228:2001/02/02(金) 18:32
iモード対応にしたいのでJAVAスクリプトではだめなんです
JAVAスクリプトであれば簡単なんですけどね。。。
232名無しさん:2001/02/02(金) 18:43
>>231
iモード対応ならselect部分は実際のURLじゃなくて識別コードにした方が軽いよ
受信パケット量が減るからね

CGI側でURLを配列に格納した方がいいみたい
selectを採用するくらいなんだからジャンプ先の数は少ないんでしょ
233名無しさん:2001/02/02(金) 18:50
>>228
テキストで取れたんなら原理は一緒だよ
もうちょっとがんばってみそ
234ど素人:2001/02/02(金) 18:58
>227

foreach (split(/; */@` $ENV{'HTTP_COOKIE'})){
($key@` $value) = split(/=/);
$value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C"@` hex($1))/eg;
$cookieJar{$key} = $value;
}

$test1 = $cookieJar{'NAME1'};
$test2 = $cookieJar{'NAME2'};

これでうまく逝くはずです。
235228:2001/02/03(土) 11:27
みなさんご迷惑をおかけしました、なんとかできました

>>232さん、ご参考にさせていただきます。アドバイスありがとう
ございます
236_gunzip:2001/02/03(土) 11:52
>>223
-----
http://faqchest.dynhost.com/prgm/perlu-l/perl-00/perl-0006/perl-000600/perl00060318_26308.html

You should note that SDBM won't work reliably on FAT or FAT32 file
systems (a percentage of records written are not retrievable). That
means you'll have to use DB_File on Windows 9x if you want it to work
reliably. Besides@` it saves four characters when typing the program:

らしいです。
------
また、ActivePerl5.6 bug report にも
http://bugs.activestate.com/ActivePerl/modules?id=495;expression=dbm;user=guest;prio00=1;prio01=2;prio02=4;prio03=8;stat00=1;stat01=2;stat02=4;stat03=8;stat04=16;stat05=32;stat06=64;assigntype=-1;assignuser=0
ここにも同様に。

#うちでは再現しないです。ん〜なぜだろう。
237223:2001/02/03(土) 15:26
>_gunzipさん
ありがとうございます。やっぱり本家のサイト見たほうが早いんですね。
英語あんまり得意じゃないので・・・
だいたいわかったのですが、ここに書いてる事を見ると・・・
>FAT or FAT32上ではSDBMは正常に動作しないことに気をつけなさい。
>それはwin9x上ではDB_Fileを使用しなければならない事を意味する。
って事でいいと思うのですが・・・
最後の
>Besides@` it saves four characters when typing the program
これがよくわからないです。・・
それはプログラムをタイプする時に4文字を救う????
全然違うんでしょうねえ・・・誰か教えてください。
で、DB_FileってBerkeleyDBを使うモジュールですよね。
今サイト見てきたけど・・・ソースファイルでの配布しかない
のでコンパイルできません。うぅ。
>> #うちでは再現しないです。ん〜なぜだろう。
こちらのOSはWIN98SEです。これに関連してるのかな?
あと・・まさかと思いますがCPUがAMD K6-3です。
関係ないとは思うのですがちょっと特殊なので少しだけ気になります。
238名無しさん:2001/02/03(土) 16:17
jcode.plっていろいろありますけど、どれ使ってもたいして変わりませんよね?
複数のCGIで一つのjcode.pl使おうと思うんですけど問題はないもんですか?
239名無しさん:2001/02/03(土) 16:38
>>237
DOSプロンプトから「ppm install DB_File」と入力すれば
インストール完了です
Windows用だとVer1.75かな?(未確認)

>>238
複数のCGIで使っても問題ありません
質問のレベルを考えると最新版を使えば特に問題ないと思います
240239:2001/02/03(土) 16:40
補足です
>>237
インターネットに接続した状態で入力してください
241名無しさん:2001/02/03(土) 20:34
CGIを勉強したいんですがいいwebサイトありませんか?
242名無しさん:2001/02/03(土) 20:58
243名無しさん:2001/02/03(土) 21:56
>241
とりあえず本買った方がいいよ。
244_gunzip:2001/02/03(土) 23:30
>>237
DB_Fileについては、コマンドラインから
ppm install DB_File
でインストール出来ます。(下のサイト参照)

>>Besides@` it saves four characters when typing the program
>これがよくわからないです。・・
おそらく、
「それに、プログラムを打ち込む際、四文字分だけ打たなくて済むよ」
云々は、その上に例として挙げられているスクリプトについて
use SDBM_File;
が、
use DB_File;
に、(二文字分)
tie(%h@`'SDBM_File'@`'junk136'@`O_RDWR|O_CREAT@`0640) or die "Oops@` $!\n";
が、
tie(%h@`'DB_File'@`'junk136'@`O_RDWR|O_CREAT@`0640) or die "Oops@` $!\n";
に(二文字分)なるので、(2+2=)四文字分タイプ量が少なくなるから、
DB_Fileの方がお奨めだよ、ということを(半ば冗談めかして)書いただけでしょう。
(間違ってたら恥ずかしいな〜)

うちはWin98(SEではない)+Celeron366Mhzですが、上の二つ目に書いてある
方は何度やっても再現しませんね。(いや、そちらの方がいいのですが)
どうもあんまり関係ないような気が。

-----
参考:
PPMの使い方
http://member.nifty.ne.jp/hippo2000/perltips/ppm.htm
モジュールのzipアーカイブ
http://www.activestate.com/PPMPackages/
Berkley DBについていろいろ
http://www.sleepycat.com/
245名無しさん:2001/02/04(日) 00:27
@list = $file =~ m/<a +href.+<\/a>/
とやってリンクを取り出したいのですが、
どうも".+"が最後の値までマッチしてしまいます。
だから返ってくる値も一つだけです。

どうすれば複数リンクを取り出せるでしょうか?
246名無しさん:2001/02/04(日) 00:32
間違えました。
@list = $file =~ m/<a +href.+<\/a>/gi;
です
247名無しさん:2001/02/04(日) 00:40
あともう一つ。誰か頼みます。
否定文字クラス[^...]で囲った文字の順番は無視されますが、
順番を保つ為には(...)で括ればいいのでしょうか?

でも[^...]は改行コードにはマッチしてしまうし。。。
248名無しさん:2001/02/04(日) 01:27
とりあえず、解決しました。
@list = $file =~ m/<a +href.*?<\/a>/gi;
「*?」とすることで最短マッチするようになりました。
答えは正規表現本のP91にありました。

#あの本ほんとに役にたつなぁ
249>246:2001/02/04(日) 01:30
m|<a.*?href="(.+?)".*?>.*?</a>|gi;
こんなんでどうよ?
247は…すまん、質問の意図がよくわからん。
250249:2001/02/04(日) 01:31
すでに解決済みか…鬱だ逝こう。
251名無しさん:2001/02/04(日) 03:30
>249 サンキュ
ところで.*?のところにコメントが入っていたらどうするの?
&lt;!--<a href ></a>--&gt; ←こんな感じにね。
これはじぶんでは解決不可能な気がする。
正規表現本のCのコメント削除をよく理解しないとだめだね。
252名無しさん:2001/02/04(日) 08:54
>>251
行頭からのパターンマッチじゃないんだから
そのままでOKじゃん
253プログラム未経験者だけど。:2001/02/04(日) 10:50
やべー、perlやってみようかと本買ったが進まんうちに
飽きてきた。なんか、息抜きに面白い事(プログラム)教えて。
254名無しさん:2001/02/04(日) 11:31
>>253
お断りします
自分で探してください
あるいは>>1にリンクされたサイトを訪問してみたら?
255名無しさん:2001/02/04(日) 14:16
>>253
俺はお前みたいな面白いやつを見つけたよ(わら
256253:2001/02/04(日) 15:20
PCしかできん奴に聞いた俺が間違っていたな。
話しには聞いていたが、やっぱ本当のクソなんだな。クソレスもするし(w
”特に”255、おまえだよー(w
頑張ってその腐った人間性直してねー。じゃないとお前みたいなクソみたいな友達や彼女しか出来ないよー。
つってもマジいねーか(わらいー

ま、せいぜい頑張れ、たーこ(笑)
257名無しさん:2001/02/04(日) 15:44
>>255
激しく同意
こんな面白いのに飽きるなんて信じらんねーな(ワラ
258名無しさん:2001/02/04(日) 16:25
安西先生、Perlの話がしたいです・・・
259名無しさん:2001/02/04(日) 18:52
ちょっと質問です

$mdayで1から9までの数値の前に0をつけたいんですがどうやれば
いいんでしょうか?

単純に
if ($mday < 10){$dday = "0"+$mday ;}
などとすると単なる足し算ですよね?
260名無しさん:2001/02/04(日) 19:08
>>259
$dday = sprintf("%02d"@`$mday);
・・・どうよ?
261名無しさん:2001/02/04(日) 19:19
>>259
文字列を足すのは ドット。
$dday = "0".$mday;

しかし、なるべく
$dday = sprintf "%02d"@` $mday;
を使おう。
$date = sprintf "%02d/%02d/%02d"@` $year-100@` $mon@` $mday;
のようにまとめて出来るからね。
262名無しさん:2001/02/04(日) 20:58
Perlの構文もBNFで定義されてるの?
263227:2001/02/04(日) 21:58
遅レスですみません。
234様、ありがとうございました
望んだ動きが!本当に感謝です。
264名無しさん:2001/02/04(日) 23:27
ファイルのコピーってバッククオート使わずにどうやるの?
今、NT上のapacheでやってるからどうやるのかさっぱりわかりません。
もしかして、Winのcopyコマンドが使えるとか?(w

一回やってみます。
265名無しさん:2001/02/04(日) 23:34
コンパイルすら通らず(w
266_gunzip@おやすみ:2001/02/04(日) 23:39
267AyuMoe(JAPU):2001/02/04(日) 23:41
File::Copy

or

$bufsiz = 2048;
$from = "/etc/rc";
$to = "/tmp/rc";
open IN@` "< $from" or die;
open OUT@` "> $to" or die;
print OUT $buf while(read IN@` $buf@` $bufsiz);
268259:2001/02/04(日) 23:48
>>260さん
>>261さん

早速のお返事ありがとうございます
なるほど。。。勉強になりました
269名無しさん:2001/02/05(月) 01:19
コピーできないへたれです。
ありがとう。
やっぱり関数としては提供されてないんですね。
File::Copyですか。やっぱりパッケージの知識も必須ですね。
270名無しさん:2001/02/05(月) 03:01
パッケージじゃなくてモジュールね >>269
Perl自体も高機能だけど、モジュール使えるようになると
もっと幸せになれます
271223:2001/02/05(月) 03:16
>_gunzipさん
SDBMの件いろいろありがとうございます。
4文字の件はそういう事だったのですね・・・
最初、「4文字分タイプを節約できる」って意味かとも
思ったのですが、どう考えても差が2文字なんで・・・
違うよなあーーって思ってしまいました。
2文字*2回なんですね・・・修行が足りませんです。
それとppmも成功しました。
あのたぐいのインストール方はunix系の専売特許かと
思ってましたがWin(しかもDOSプロンプトから)できるなんて
おどろきました。
まだ、テストはしていませんが大丈夫だと思います。
それとどういう条件でSDBMが正常に動作しないのかはよく
わかってないですが、例のAnHTTPDのサイトで悩んでいた方に
メールしたところ、彼もいろいろ調べたが結局わからないまま
だったそうです。
彼のところではK-6では正常動作していたらしいのでCPUより
メモリー周りが怪しいのでは?とも書かれてました。
どうでしょうねえ。
ともかくありがとうございました。
272名無しさん:2001/02/05(月) 12:40
use Socket;
で、ソケット通信したいんですけど
通信が出来ない場合のタイムアウト処理って
どんな感じでやればいいんですか??
その辺のサンプル見ても、そんな処理してないので
長時間固まるんですよね・・。
273名無しさん:2001/02/05(月) 14:03
質問です。FORMからファイルのアップロードをしようとしています。
受け取るCGI側が標準入力から受け取ったデータは以下のとうりです。

-----------------------------11241214169042
Content-Disposition: form-data; name="upfile1"; filename="C:\send.txt"
Content-Type: text/plain

これは送信ファイルの中身だよ
-----------------------------11241214169042--

この場合、送信ファイルがテキストファイルなのでセパレータ(-----------------------------11241214169042)を
見て判断すればファイルの中身を区別することが出来ますが
いろいろ実験してみると、バイナリファイルの時も空行から後は生データで送られてきているようです。
では、MIMEヘッダとバイナリファイルの区別はどこでつけるのですか?
空行から下はアップロードファイルだと認識しても最後にMIMEヘッダ(フッタ?)がはいっしまいますし。

あと、送信ファイル内にセパレータと同じ文字列が含まれている可能性がありますよね?
そのような場合、セパレータ文字列だけを見ていると誤動作が起こらないのでしょうか?
274名無しさん:2001/02/05(月) 17:12
#! /usr/bin/perl
use Jcode;

$Test = 'テストテスト';
print Jcode->new($Test)->iso_2022_jp->mime_encode;

JcodeのMIMEデコード機能を使うべく、上のスクリプトを書いた
のですが、
Can't call method "mime_encode" without a package or object reference
と言われてしまいます。
MIME::Base64も入っています。

Jcode.pm - v0.68 2000/12/27

どうすれば、MIME機能を使えるでしょうか?
よろしくお願いします。
275274:2001/02/05(月) 17:14
>>274
MIMEデコード機能→MIMEエンコード機能

間違えました。すみません。
276名無しさん:2001/02/05(月) 20:03
>use Socket;
>で、ソケット通信したいんですけど
>通信が出来ない場合のタイムアウト処理って
>どんな感じでやればいいんですか??
>その辺のサンプル見ても、そんな処理してないので
>長時間固まるんですよね・・。

そうか・・アクセスできない時俺のスクリプト
どうなるんだろ?汗
通信処理は難しいなぁ・・。
俺そんな事考えてなかった(笑)
277_gunzip@二日酔い:2001/02/05(月) 22:33
>>274

#!/usr/bin/perl -w
use Jcode;
$Test = 'テストテスト';
print jcode($Test)->mime_encode;

Jcode->new($Test)->iso_2022_jp->mime_encode;
・Jcode->new($Test)
はJcodeクラスにblessされたオブジェクトを返す。
・Jcode->new($Test)->iso_2022_jp
iso_2022_jp()がそのオブジェクトを第一パラメータにとって呼び出される。
そして、iso_2022_jp()は単なるスカラー値を返す。(たぶん)
・Jcode->new($Test)->iso_2022_jp->mime_encode
単なるスカラー相手にオブジェクトベースのサブルーチン呼び出しを
行おうとして失敗。

Jcode.pmの一部
sub mime_encode{
  my $self = shift;
(以下略)

#何時もnkf -jでやっていたから間違っているかも。(スマソ)
#間違っていたら教えてほしいです。(恥ずかしい)
-----
参照:
http://openlab.ring.gr.jp/Jcode/Jcode.html
http://openlab.ring.gr.jp/Jcode/index-j.html(下の方)

>>272
IO::Socketにtimeout()ってあった気がします。(うろ覚え)
278名無しさん:2001/02/06(火) 01:35
掲示板などで、題名未記入の場合代替文字列を入れるヤツ。
2ちゃんのナナ資産とかもそうだけど、
あれのやりかたがわかんない精薄です。

if使わないでも全然出来ると思うんだけど
「未記入」をどうあらわせばいいかわかんないでゴワス

フェラチオするから教えてくれ!
279名無しさん:2001/02/06(火) 01:45
$name ='$ENV{'REMOTE_ADDR'}' if $name eq '';
280名無しさん:2001/02/06(火) 01:49
>>279
$name = $ENV{'REMOTE_ADDR'} if $name eq '';
281名無しさん:2001/02/06(火) 02:10
>280

あ、ifあとにつければええんかわかった。
サンクヌ
282名無しさん:2001/02/06(火) 03:01
>>278
ifを使わないなら、、、
$name =~ s/^$/名無しさん/;
ifを使わないちょっとひねくれた方法は、
$name = '名無しさん' unless(defined($name));
283AyuMoe(JAPU):2001/02/06(火) 03:13
$name ||= '名無しさん';
"0" って名前の場合は問題あるけどな。
284名無しさん:2001/02/06(火) 03:36
$name = $name ? $name : '名無しさん';
'0'非対応。
285284:2001/02/06(火) 03:42
>>278
フェラティオはいらない。
286ほういち:2001/02/06(火) 04:51
282の
$name = '名無しさん' unless(defined($name));
は失敗する気がする。
287274:2001/02/06(火) 08:31
>>277
それでうまくいきました。
_gunzipさん、ありがとうございました。
288名無しさん:2001/02/06(火) 09:24
>>286
わかるけど、それなら添削してよ
今後のために
289名無しさん:2001/02/06(火) 10:39
$name = '名無しさん' unless($name eq '');
こうすりゃいいのでは?(0対応)
290289:2001/02/06(火) 10:40
がいしゅつでした。
すいません。
291ほういち:2001/02/06(火) 11:28
>288
こでの$nameはフォームから送られてきた値なので
実際に動作させる時は
$FORM{'name'} = '名無しさん' unless(defined($FORM{'name'}));
という感じになると思います。
definedは定義されてるかどうかを判定するはずなので、
もしフォームの名前欄に記入がなかったとしても
フォームをデコードする時に$FORM{'name'}はNullと
定義される事になるのでdefined($FORM{'name'})は常に真に
なってしまうということです。
(あんまり自信ないのですが・・・)
だから289さんのようにunless($name eq ''); を
使ってます。
292名無しさん:2001/02/06(火) 11:45
T-Cupの掲示板で書き込みフォームのHTMLでクッキー使えてるのはどういう仕組みっスか?
293名無しさん:2001/02/06(火) 12:01
>>292
javaスクリプトorサーバ設定

>>ソケットの処理でタイムアウト
alarm()関数と、シグナルハンドラーを組み合わせて
タイムアウトすれば・・・。
ゴメン俺じゃわかんねぇ〜(笑)
294名無しさん:2001/02/06(火) 14:51
本当に初心者な質問なんですが、
&&ってどういう意味なのですか?

僕の本には、

>&&は「かつ」という意味です。
>「条件1&&条件2」の場合、
>条件1か条件2のどちらかがあてはまれば良いのです。

と、あるのですが、そうなのでしょうか?
教えてくんですみません・・・・・
295AyuMoe- (JAPU):2001/02/06(火) 15:03
>>294
嘘です。

and または && はその両方を満たさなければだめ。
or または || は片方だけで良い。
だから、die if(1 and 0); は死ぬし、die if(1 or 0) は死なない。
# 1: 真@` 0: 偽

>>293
IO::Socket 使えば、Timeout で指定できるはず。
296名無しさん:2001/02/06(火) 15:09
>>295
お返事ありがとうございます!
しかも素早い!どうもありがとうございました。
m(_ _)m
297名無しさん:2001/02/06(火) 15:18
>>296
なんつー本?
298サゲ茶漬け:2001/02/06(火) 15:19
>だから、die if(1 and 0); は死ぬし、die if(1 or 0) は死なない。
># 1: 真@` 0: 偽

へぇ〜。die if (1 or 0) は死なないんですか。
dieって面白いですね。極力「死にたくない」んですね☆
299サゲ茶漬け:2001/02/06(火) 15:28
>だから、die if(1 and 0); は死ぬし、die if(1 or 0) は死なない。

やっぱ変だよね・・・?
die if (1 and 0); # 死ぬ
die if (1 or 0); # 死なない
違うかなぁ☆
300名無しさん:2001/02/06(火) 16:07
die if 1;
die if 0;
死ぬのはどっち?
301名無しさん:2001/02/06(火) 16:27
>>297
「掲示板・アンケートで覚えるPerlプログラミングforCGI」です。
すごくわかりやすくていい本でした。
でも&&のところで引っかかってもやもやしてました。
その点を除けば、初心者にもわかりやすいし、
けっこう僕は好きです。
302名無しさん:2001/02/06(火) 16:29
die if (1 or 0); #死ぬかもしれない

ですか?
303初心者:2001/02/06(火) 16:58
http://cgi.din.or.jp/~hagi3/Perl/Perf.htm に、
>配列 - 初期値の設定
>ローカル変数を使用する場合、初期値や定数を設定するケースがあります。
>見易く書く、単純に書く、色々とありそうですが、どれくらいの差があるでしょうか。
>No. 処理           時間
>1. my ($a@`$b@`$c)=($_@`$_@`$_); 3.3
>2. my $a=$_; $b=$_; $c=$_; 1.8
>どちらも似たようなものに見えますが、結果は結構違います。
とあったのですが、これって正しいでしょうか?
初心者なので、どうにも判断できないです。
(自分としては変だと思うのですが・・・)
304AyuMoe(JAPU):2001/02/06(火) 17:08
あ、すまん。逆だった。
die if(1 and 0); は死なない、die if(1 or 0) は死ぬ。
305_gunzip:2001/02/06(火) 17:14
>>303
んー もしかして、これは、
>my $a=$_; $b=$_; $c=$_;

>my ($a@`$b@`$c)=($_@`$_@`$_);
と同じ事をしている、という前提なわけですか?
>my $a=$_; $b=$_; $c=$_;
この場合、$aはきちんとレキシカルスコープに
なりますが、$b@`$cについてはmyが適用されずに(って、それ以前に)
グローバルスコープになってしまいます。
ですから、全く違うもの(の速度)を比較しているような気がします。

#!/usr/bin/perl -w
{
my $a@`$b; #$a(lexical)@`$b(global)
$a = "(・∀・)";
$b = "(T∀T)";
my($c@`$d); #$c(lexical)@`$d(lexical)
$c = "(・∀・)";
$d = "(・∀・)";
print "\$a = $a @` \$b = $b @` \$c = $c @` \$d = $d\n";
}
print "-----\n";
print "\$a = " @` defined $a ? $a : "not defined!" @` "\n";
print "\$b = " @` defined $b ? $b : "not defined!" @` "\n";
print "\$c = " @` defined $c ? $c : "not defined!" @` "\n";
print "\$d = " @` defined $d ? $d : "not defined!" @` "\n";
#test.pl

>>どちらも似たようなものに見えますが、結果は結構違います。
無論、やっていることが違いますし。
#myは、ちゃんと括弧にくくった方が。
306&&の質問した者:2001/02/06(火) 18:34
先ほどは質問に答えていただいてありがとうございました。
あのぉ、2度目の質問で恐縮なんですが、
あるスクリプトを解読しようと奮起して読み始めたのはいいのですが、
=~ /文字/
の意味がわからず行き詰まっています。

=~ s///

=~ tr///
の変形バージョンかなとおもい、本を見てみましたが、
載っていませんでした。
高度な技か何かなのでしょうか。
ご存知の方がいましたら教えてください。m(_ _)m
307ほういち:2001/02/06(火) 18:38
=~ s/// とか =~ tr/// は文字列(パターン)を置換するもの。
=~ /文字/ はその文字列(パターン)が含まれてるかどうか
検査するもの

308名無しさん:2001/02/06(火) 18:39
tripod(アメリカ)とvirtualavenueでBBSを設置してみたんですが
何故かパーミッションの変更が出来ません。
steedftpとFFFTPの2つを試してみたんですが、上手く行きません
steedのログには"カスタムコマンドエラー"と出ています。
一応、両方のサーバーのFAQにも目を通してみた(英語なので自信ないです ^^;)
のですが、FAQには無いようです。
時間があれば、教えていただけませんでしょうか。
309308:2001/02/06(火) 18:41
あああ、ちょっと初心者過ぎますね  (^_^;
スレ違いでした。
くだ質スレが有ればいいのですが。
310284:2001/02/06(火) 18:45
>>306
$str1 = 'あいうえお';
$str2 = 'かきくけこ';

if($str1 =~ /あ/){
print "「あ」が含まれてますね( ̄ー ̄)\n"
}else{
print "「あ」が含まれてませんね( ̄ー ̄)\n"
}

if($str2 =~ /あ/){
print "「あ」が含まれてますね( ̄ー ̄)\n"
}else{
print "「あ」が含まれてませんね( ̄ー ̄)\n"
}

出力:
「あ」が含まれてますね( ̄ー ̄)
「あ」が含まれてませんね( ̄ー ̄)
311310:2001/02/06(火) 18:47
あっ・・・名前の番号は関係ないデス。
312310:2001/02/06(火) 18:48
しかもprint分にセミコロン忘れた。。。死のう。。。
313&&の人:2001/02/06(火) 19:00
>>307
ほういちさん、どうもありがとうございます!
なるほど〜〜。意味がわかりました。すっきり。
if($アクセス者のホスト=~ /アクセス拒否ホスト/){
というのは、
「こいつはアクセス拒否するべき奴かな?どうかな?」
ってことなんですね。どうもありがとうございました。
314303:2001/02/06(火) 19:06
>>305
やはり変ですかね。
my $a=$_; $b=$_; $c=$_;
これだと、$b@`$c全然ローカルになってないし。
315&&の人:2001/02/06(火) 19:06
>>310
310さん、実例、とても参考になりました。
しかもちょっとユーモラス(笑)( ̄ー ̄)
ありがとうございます!
316>>314:2001/02/06(火) 19:27
カンマを行で読み替えればわかりやすいかも。
my $a=$_; $b=$_; $c=$_;
は、
my $a=$_;
b=$_;
c=$_;
・・・と、同義。
でも、303にあるようなタイムラグの原因は謎(教えてPerlの偉い人!)
スライスの処理で時間かかってるのか、レキシカル変数の作成で時間かかってるのか。。。
317316:2001/02/06(火) 19:30
カンマじゃなくてセミコロンでした。。。
318ほういち:2001/02/06(火) 20:51
303の件気になったのでベンチとってみました。
ついでに3番目にmy宣言を分けてやった例も入れてみました。
ついでにforとforeachもやってみました。
うちの環境では100万回やってこんなもんです。

#!usr/bin/perl

use Benchmark;
$time1 = Benchmark->new();
foreach ( 1 .. 1000000 ) { my ($a@`$b@`$c)=($_@`$_@`$_); }
$time2 = Benchmark->new();
foreach ( 1 .. 1000000 ) { my $a=$_; $b=$_; $c=$_; }
$time3 = Benchmark->new();
foreach ( 1 .. 1000000 ) { my $a=$_; my $b=$_; my $c=$_; }
$time4 = Benchmark->new();
for ( $i = 1 ; $i < 1000000 ; $i++ ) { my $a=$i; my $b=$i; my $c=$i; }
$time5 = Benchmark->new();


$difference1 = timediff($time2@` $time1);
$difference2 = timediff($time3@` $time2);
$difference3 = timediff($time4@` $time3);
$difference4 = timediff($time5@` $time4);

print timestr($difference1)@` " elapsed 1\n";
print timestr($difference2)@` " elapsed 2\n";
print timestr($difference3)@` " elapsed 3\n";
print timestr($difference3)@` " elapsed 4\n";

出力結果
4 wallclock secs ( 3.84 usr + 0.00 sys = 3.84 CPU) elapsed 1
3 wallclock secs ( 2.97 usr + 0.00 sys = 2.97 CPU) elapsed 2
3 wallclock secs ( 3.29 usr + 0.00 sys = 3.29 CPU) elapsed 3
3 wallclock secs ( 3.29 usr + 0.00 sys = 3.29 CPU) elapsed 4
319&&の人:2001/02/06(火) 21:00
perlを入力したらその説明が出てくるという便利なサイトはないでしょうか?
辞書/検索のperl版のようなサイトがあれば、僕のくだらない質問で
何度もみなさんを煩わせてしまう回数もぐんと減るかと思いまして・・・・
320名無しさん:2001/02/06(火) 21:06
>>319
そういうサイトはあるよ。
今googleで探したら、こういうのもあった(探せばもっといいやつがゴマンとある)。
http://www2u.biglobe.ne.jp/~MAS/perl/ref/index.html
http://www.paddie.com/perl-ref.html
http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/
でも、書籍が一番良いと思うので購入を検討されたし。
ちなみに僕はオライリーのクイックリファレンス使ってマス。
321&&の人:2001/02/06(火) 21:16
>>320
わ、ありがとうございます。あるんですね。
さっそく利用してみます。
実は僕はこてこてにYahoo!で検索してみたんですが、ありませんでした(汗
これを機にgoogleもお気に入りにいれました。
オライリーのクイックリファレンス、探してみます。
ありがとうございました。
322320:2001/02/06(火) 21:32
でも、クイックリファレンスはあまりお勧めできませぬ。
(題名ほどクイックじゃないから)
&&さんの場合は、プログラミングPerlあたりの網羅的な本がよいかもです。
↓参考書籍スレッドなどを参考にしてくださいませ。
http://tako.2ch.net/test/read.cgi?bbs=perl&key=970166109&ls=50
323_gunzip@二日酔い++:2001/02/06(火) 23:35
>>303 の速度比較は、二つの全く違う
(やって、後者は$b@`$cがローカルになっとらへんから、
"ローカル変数を初期化する"っていう当初の目的から
外れたものやし。恐らく my $a@`$b@`$c; ってやりたかったんかも
しれんけど、これも$b@`$c はグローバルスコープになってしまう事
には変わらへん。やっぱ、地道にmy()ってするしかないんかなあ)
働きをするコードを比べているわけですから、
んー比較自身に意味がないと思われるのですが。(T∀T)

ちなみに、myとlocalについては、こんな結果になりますね。
無論、myとlocalでは利用すべき場所が異なりますから
一概にはどちらがよいとは言えないのですけど。
----------
#!/usr/bin/perl
use Benchmark;
$_ = "お酒が飲みたいなあ";
$count = 1000000;
timethese($count@`{
 'my' => sub {my($a@`$b@`$c) = ($_@`$_@`$_);}@`
 'local' => sub {local($a@`$b@`$c) = ($_@`$_@`$_);}@`
});
----------
Benchmark: timing 1000000 iterations of my@` local...
my: 1 wallclock secs ( 1.54 usr + 0.00 sys = 1.54 CPU) @ 649350.65/s (n=1000000)
local: 4 wallclock secs ( 3.29 usr + 0.00 sys = 3.29 CPU) @ 303951.37/s (n=1000000)

>>318
なるほど。
my ($a@`$b@`$c)=($_@`$_@`$_);
より、
my $a=$i; my $b=$i; my $c=$i;
の方が早いのですね。(む〜何故だろう)
ともかくも、ありがとうございます。
>foreach ( 1 .. 1000000 )
こうすると、一気に要素数が1000000の配列が確保されてしまいますよ〜

#間違っていたら直しますので是非教えてくださいです。
324&&の人:2001/02/07(水) 00:40
>>320-322
どうもありがとうございます。
じっくりと選んでみますね〜
325名無しさん:2001/02/07(水) 00:47

if (1 .. /^$/)

ていうのを見つけたんですが
これってどゆ意味ですか?
改行だけの行を見つけたら??
326ほういち:2001/02/07(水) 01:01
>gunzipさん
>こうすると、一気に要素数が1000000の配列が確保されてしまいますよ〜
そう聞いた事あるんで普段は使わないのですが、あのサイトに記載されてる
通り$_を代入するのにいい手が思いつかなかったので。
だもんでついでに速度も差が出るかと思ってforでも試してみました。
こっちは$a=$iとしてしまいましたが。
で、配列を確保する件ですが最近のバージョンのperlはそういう
動作にならないと聞いたような気もします。
まあ、気持ち悪いので使わないにこした事はないとは思いますが。

327JAPU(AyuMoe):2001/02/07(水) 01:01
数字の場合は $. (行番号) と比較される。
while(<>) { print if(1../^$/) }
は1行目から空行まで表示。

perldoc perlop "Range Operators" 参照。
328AyuMoe(JAPU):2001/02/07(水) 01:05
>こうすると、一気に要素数が1000000の配列が確保されてしまいますよ〜

少し前の常識ではそうですが、最近のperl (5.005 逝こう) では最適化されるので、そのようなことはありません。

perldoc perldelta (5.005):
foreach (1..1000000) optimized

foreach (1..1000000) is now optimized into a counting
loop. It does not try to allocate a 1000000-size list
anymore.
329325:2001/02/07(水) 01:13
japuさんアリガトー。
まさにそのstdinからの入力部分で使われていました。
330_gunzip@酔いも醒めて もう朝か:2001/02/07(水) 05:38
>>326 >>328
ほういちさん、japuさん すみません。
http://www.perl.com/pub/doc/manual/html/pod/perldelta.html#C_foreach_1_1000000_optimize
に*そのまま*載っていますね..... 知識不足でした。
(しかも、たしか5.005がリリースされたのは三年近く前のような・・・
う、ちゃんとperldelta読まないと。)

#今後気を付けます。ご迷惑をおかけしました。
331少し不安なのですが:2001/02/07(水) 06:14
昨日ActivePerlをインストールしたのですが、さっき
http://wakusei.cplaza.ne.jp/twn/wwwcgi6.htm
を読んだところ、ActivePerlのセキュリティ問題とかいうのがかかれて
あったんですが、これって具体的に一体どんなものですか。
332_gunzip@あーあ朝になっちまった:2001/02/07(水) 06:26
>>331
>■ ActivePerlのセキュリティ問題を改善しておく
というセクションの所?
333331:2001/02/07(水) 06:32
>>332
そうです。
334_gunzip@そろそろ逝きますか:2001/02/07(水) 07:53
>>333
PerlScriptというのは、IEのActiveXスクリプトエンジンで....
何に使われているのかは、自分はよく知りません。
(ASPとしても使われているそうだけど、あまり聞かない)
ActivePerlをインストールしたのならば、
\html\Components\Windows\PerlScript.htmlに説明がありますので、
読んでみられては?

試しに以下のソースをコピペして、*.html
という名前で保存して開いてみれば、大体どのようなものか分かるかと。
#予め言っておくと、勝手にメモ帳が起動します(IEのみ)
#勿論、ActivePerl必要
<HTML>
<HEAD>
<SCRIPT LANGUAGE="PerlScript">
$window->document->write("PerlScript test");
$window->alert("notepad");
system("notepad");
</SCRIPT>
</HEAD>
<TITLE>test</TITLE>
</HEAD>
<BODY></BODY>
</HTML>

これを見てもわかるとおり、なんかJavaScriptみたいなものです。
無論、Perlですからopen/print/closeでローカルに読み書きも行えます。

ところで、
1.ActivePerl を(PerlScriptオプションをオンで)ローカルにインストールしている。
2.何の因果か、レジストリのその値を0x0001等に変更している。
(デフォルトでは0x0010だからローカルのみ...の筈)
3.PerlScriptなんか使おう(使って悪いコトしよう)という人がいる。
(知名度はかなり低いような気がするのだが)
...という不幸な事態が重ならない限り、大丈夫だと思いますが。(たぶん)

#個人的にはPerlScriptかなり好きで、ちょこちょこ作って遊んでますけど。
-----
HKEY_LOCAL_MACHINE\SOFTWARE\ActiveState\PerlSE\1.0
DWORD: EnabledZones
0x0001 :うみはひろいなおおきいな(all)
0x0010 :うちだけ(local)
0x0020 :いんたーねっと(Internet)#IEオプション
0x0040 :しんじてるサイト(trusted)
0x0080 :せいげんつきサイト(restricted)
335名無しさん:2001/02/07(水) 10:22
さっき、間違ってCGIスレに書いてしまいましたのが・・・
windows上のperlで外部コマンドを実行し、結果を取得したいのですが
現在はよくわからないので以下のようにして一時ファイルを読み込んでいます。
(rootじゃないとpingモジュールが使えないようなので外部コマンド使ってます)
$a= system "ping $hostn -n 1 >$temp_file";
なんかうまい方法はないでしょうか。一般のユーザー権限でpingが打てれば
この方法にはこだわらないのですが・・・。よろしくお願いいたします。
336_gunzip:2001/02/07(水) 12:33
>>335
open(IN@`"command |") or die "itteyosi";
            ^
とするか、
IPC::Open3モジュールを用いて、
use IPC::Open3;
$pid = open3(\*WTRFH@` \*RDRFH@` \*ERRFH@`"ls -al");
でRDRFHから出力を読むと簡単でいいかと思います。
#簡単な説明で済みません。
337335:2001/02/07(水) 16:37
>>336
うまくいきました。ありがとうございました。
338名無しさん:2001/02/07(水) 17:28
Windows上では文法チェックOKなのにUNIXサーバ上にFTPでアップロードした後に
telnet上で文法チェックすると下記の様なエラーメッセージが表示されます

■エラーメッセージ
----------------------------------------
"use" may clash with future reserved word at dbtest.pl line 3syntax error in fil
e dbtest.pl at line 3@` next 2 tokens "use strict"

"use" may clash with future reserved word at dbtest.pl line 4"use" may clash wit
h future reserved word at dbtest.pl line 5"tie" may clash with future reserved w
ord at dbtest.pl line 7"h" may clash with future reserved word at dbtest.pl line
7Illegal modulus of constant zero in file dbtest.pl at line 7@` next 2 tokens "h
@`"

syntax error in file dbtest.pl at line 7@` next 2 tokens "$DB_HASH or"
"untie" may clash with future reserved word at dbtest.pl line 25"h" may clash wi
th future reserved word at dbtest.pl line 25Illegal modulus of constant zero in
file dbtest.pl at line 25@` next 2 tokens "h ;"
dbtest.pl had compilation errors.
----------------------------------------

■ソースファイル
----------------------------------------
#!/usr/local/bin/perl

use strict ;
use DB_File ;
use vars qw( %h $k $v ) ;

tie %h@` "DB_File"@` "fruit"@` O_RDWR|O_CREAT@` 0666@` $DB_HASH or die "Cannot open file 'fruit': $!\n";

# いくつかのキー/値の組をファイルに追加
$h{"apple"} = "red" ;
$h{"orange"} = "orange" ;
$h{"banana"} = "yellow" ;
$h{"tomato"} = "red" ;

# キーが存在するかチェック
print "Banana Exists\n\n" if $h{"banana"} ;

# キー/値の組を削除
delete $h{"apple"} ;

# ファイルの内容を出力する
while (($k@` $v) = each %h)
{ print "$k -> $v\n" }

untie %h ;
----------------------------------------
ActivePerlは文法チェックが甘いなんてことは無いと思うのですが・・・
339_gunzip:2001/02/07(水) 17:47
>>338
なんでだろう?
Kondaraペンギン君+Perl5.005でエラー無し。
まさか、Perl4なんて事はありませんよね。
perl -v はどうなります?

#はずしていたらごめんね。
340338:2001/02/07(水) 18:05
ぎょえ〜 version 4.0だぁ!!
ちゃんとPerl5も導入済みって書いてあるのに>レンタルサーバ
これって利用者側じゃどうにもならないのかな・・・

>>339
ズバリ、大当たりでした(^^;
341338:2001/02/07(水) 18:08
perl5 -wc dbtest.pl で解決しました
342_gunzip@おでかけ:2001/02/07(水) 18:12
>>340-341
それはよかったです。
#こんな所でエラーが出るなんておかしいな〜って思ったので。
343名無しさん:2001/02/07(水) 20:59
バナー表示つき自動登録型リンク集のスクリプトを改造しています。
大きいバナーを貼られてレイアウトが崩れると困るので、
バナーの横幅を取得して一定のサイズ以上だったらIMGタグで幅指定して
縮小表示をしたいのですが画像サイズ(pixel数)を調べる方法はありますか?
344343:2001/02/07(水) 21:18
既出でしたすみません。逝ってきます…
345名無しさん:2001/02/07(水) 23:25
WINDOWS me用のPerlが入手したくてリンクをいろいろ
見て回ったんですがそれらしきものが見つからないんです。
ひょっとしてme用のPerlって存在しないんですか?
346_gunzip:2001/02/07(水) 23:31
347名無しさん:2001/02/08(木) 02:12
あらかじめキーが決まっていて、なおかつキー名は自由に決められるとき、
scalar %hash で出てくる x/y の x を大きく、y を小さくするよう
調整するのって、意味がありますか?
348名無しさん:2001/02/08(木) 02:14
あ、キーが決まっていてというのはキーの数が一定という意味です。
349名無しさん:2001/02/08(木) 04:16
意味不明
350名無しさん:2001/02/08(木) 07:09
確かに意味不明
351名無しさん:2001/02/08(木) 08:20
具体例を示せ!
352345:2001/02/08(木) 11:27
>_gunzipさん
ありがとうございました。無事ダウンロードすることができました。
英語ばっかりで訳がわからないけどなんとかやってみます。


353名無しさん:2001/02/08(木) 12:40
Perlで音を出すことって出来ないでしょうか。
処理が終了したときにちーんと鳴らしたいのですが。
354_gunzip:2001/02/08(木) 13:49
>>353
-----
print "\a";
-----
use Tk;
MainWindow->new->bell;
-----
use Win32::Sound;
Win32::Sound::Volume('100%');
Win32::Sound::Play("itteyosi.wav");
Win32::Sound::Stop();
-----
まだあるかも。
355_gunzip:2001/02/08(木) 13:57
http://www.bright.net/~dlphilp/linuxsound/one-page.html
この辺りを見ますと、Perl+音楽って結構ありますね。
関係ありませんのでsage
356352:2001/02/08(木) 17:56
うがぁぁぁぁぁぁぁ!!!perlをダウンロードしたのに使い方が
さっぱりわかりません。
まず圧縮されてるから普通のフォルダにいれかえて圧縮をなくし
てからinstallのアイコンをいじったらDOSの画面になったので
適当にYESにしてたら最後にThank you for installing ActivePerl!
って表示されたんですがこれでいいんですか?
この後どうやって使えばいいんでしょうか?
357名無しさん:2001/02/08(木) 18:19
>>356
あとは自分の書いたスクリプトの頭のperlの位置を指定するだけだ
#!/usr/local/bin/perl こういうやつな
358_gunzip:2001/02/08(木) 18:27
>>356
コマンドラインからperl -v と叩いて
This is perl@` v5.6.0
云々と表示されればインストールは成功して使える状態になっています。
表示されなければperl.exeのあるディレクトリにパスを通して再度トライ。
それが出来たら
perl myscript.pl
でperlにスクリプトを食わせてやればいいと思います。

あ、もしかして
http://www.activestate.com/download/ActivePerl/Windows/5.6/ActivePerl-5.6.0.623-MSWin32-x86-multi-thread.msi
の方がよかったかな。
359356:2001/02/08(木) 19:11
ありがとうございます。
>357
DOSに#!/usr/local/bin/perlみたいなものを書いて打ち込むと
いうことでしょうか?
>コマンドラインというのはDOSのことでしょうか?

たびたびすいません。。
360名無しさん:2001/02/08(木) 20:59
ごめん、説明不足だったか?
スクリプトの冒頭だよ、HELLO!!とか表示するスクリプト
ない?

ひょっとして自分のPCに入れてる?
http://www.kent-web.com/www/
で一通り解説してくれてます。

>>358さんのやつ落としてCドライブにでもc:\usr/localって
フォルダつくっといて解凍してやれば#!/usr/local/bin/perlで
OKだよ
361名無しさん:2001/02/09(金) 09:30
Windows98上でPerlを動かしています。
今Perlを本を読みながら勉強しているのですが、
ファイルの情報を取得する所で行きづまっています。
指定したファイルがリードオンリーであるかどうかを調べて、
そうなら解除するようなサブルーチンを書きたいのですが
本を見るとstat()でよく分からない属性(?)はとれるようですが
どこにもそのようなことは書いてないのです。
なんか分かりにくい文で済みませんが、どなたか答えて
くれるとありがたいです・・・
362_gunzip@病院:2001/02/09(金) 10:31
>>361
Win32::Fileモジュールを用いれば、ファイル/ディレクトリ
の属性情報を取得・設定することができます。
98とのことですので恐らくActivePerlでしょうし、それならば
Win32::Fileモジュールは既にインストールされていると思います。
#詳しくはドキュメントを参照されると良いかと。
363名無しさん:2001/02/09(金) 17:30
親切な人が多くてイイスレだね
364361:2001/02/09(金) 17:50
>>362
ありがとうございます。
GetAttributes()とSetAttributes()で出来そうなのでこれから試してみます。
365361:2001/02/09(金) 19:22
やってみたのですが、
GetAttributes($file@`$attrib);
で$attribには妙な数字しか入りません
これをどうすればよいのでしょうか。
どうも質問ばかりですみません。
366359:2001/02/09(金) 19:28
>360
ありがとうございます。見てきます。。
明日一日かけて頑張ってみます。。。
367サゲ茶漬け:2001/02/09(金) 20:00
>>365
やったこと無いから想像だけど、
$attribと何らかの定数の&を取って
属性が設定されているか調べたりするんじゃないかな☆
368_gunzip@病院:2001/02/09(金) 20:04
>>365
Win32::Fileからは以下の定数がexportされています。
----------
ARCHIVE
COMPRESSED
DIRECTORY
HIDDEN
NORMAL
OFFLINE
READONLY
SYSTEM
TEMPORARY
----------
ですから、これを用いて
use Win32::File(GetAttributes@`SetAttributes);
$target = "mona.txt";
GetAttributes($target@`$attrib);

$directory = $attrib & DIRECTORY;
$archive = $attrib & ARCHIVE;
$compressed = $attrib & COMPRESSED;
$readonly = $attrib & READONLY;
$hidden = $attrib & HIDDEN;
$normal = $attrib & NORMAL;
$offline = $attrib & OFFLINE;
$temporary = $attrib & TEMPORARY;
$system = $attrib & SYSTEM;

で取得できます。

#中途半端だけれど、ちょっとここんとこまで
#NTならWin32::FileSecurityの方がいいのかな
369_gunzip@病院:2001/02/09(金) 20:07
ん かぶった。
ちなみに & はビット毎の論理積を取る演算子ね。
370名無しさん:2001/02/09(金) 21:14
//samp{
Login
Passwd
//}
//cmd{
●f tako
//}
//h

という中身のテキストファイルを

<b>
samp
Login
Passwd
</b>
<i>cmd
●f tako
</i>

に変換するのって

while(<>){
tr/\r\n//d:
if (m#^//cmd{(.*)//}}$#m){
print "<i>$1</i>\n";
}
else {
print "$_\n";
}
}


を改良してなんとかする方法はないものでしょうか?
371名無しさん:2001/02/09(金) 21:26
それってフィルタってことか。ちょっと難しいなあ。
置換じゃダメなのか・・。
372_gunzip:2001/02/09(金) 21:33
638訂正
use Win32::File;
$target = "mona.txt";
&Win32::File::GetAttributes($target@`$attrib);
以下同じ
373名無しさん:2001/02/09(金) 22:08
>>370
どんな風に変換するのか、もっと具体的に書いたほうがいい。
でないと、どうともとれるから書きようがない。
374名無しさん:2001/02/09(金) 22:21
>>370
確かに、規則がわからん。
何かのバッチ処理用スクリプトかなんかか?
375370:2001/02/09(金) 22:32
//samp{
Login
Passwd
//}
//cmd{
●f tako
//}
//h

のようなプレーンテキスト(?)をhtml化してその際、
//**{ や //}をhtmlタグに変換したいのですが、
//samp{

//cmd{
を別々のタグにしつつ、対応する}//を終了タグとして利用、
Login やPasswd を上手く間に入れるという
アイディアが浮かばなくって・・・。ヘンな質問ですみません。


376370:2001/02/09(金) 22:36
すみません、書き込み間違ってました。
"対応する}//"ではなくて、”対応する//}”でした。
377名無しさん:2001/02/09(金) 22:36
>>375
最後の//hってなに?
378名無しさん:2001/02/09(金) 22:53
&nbsp;aaaaaaa&nbsp;aaaa&nbsp;&nbsp;&nbsp;aa
379_gunzip:2001/02/09(金) 22:55
>>375
こんなのかなあ。
#三分ほどしか、時間をかけていないので汚い.......
#バグったりするかも。

#!/usr/bin/perl -w

%tag = (
&nbsp;&nbsp;"samp" => "b"@`
&nbsp;&nbsp;"cmd" => "i"
);

while(<>){
&nbsp;&nbsp;chomp;
&nbsp;&nbsp;if(m#^//(.+){$#){
&nbsp;&nbsp;&nbsp;&nbsp;my $cmd = $1;
&nbsp;&nbsp;&nbsp;&nbsp;die "unknown command: $cmd" if not defined $tag{$cmd};
&nbsp;&nbsp;&nbsp;&nbsp;print "<$tag{$cmd}>\n$cmd\n";
&nbsp;&nbsp;&nbsp;&nbsp;while(<>){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($_ eq "//}"){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "</$tag{$cmd}>\n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print $_ @` "\n";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;#error
&nbsp;&nbsp;}
}
380名無しさん:2001/02/09(金) 23:37
↑大体それでいいんじゃないかなあ。
#ちょっと違うところがあるけど。
381_gunzip@おやすみ:2001/02/09(金) 23:53
↑直して〜

372の訂正
誤 >638訂正
正 >368訂正
382名無しさん:2001/02/10(土) 04:29
ここのスクリプトhttp://www.zero-web.net/とか
Carl氏のスクリプトがベースになってるスクリプトだと
ローカルで稼動実験できないんですけど何故でしょうか?
バーチャだと動くのに自分の立てた鯖だと動いてくれないんです。
HTTPdとActivePerl使って動かしてます。OSはWin98SEです。
383500_Internal_Server_Error:2001/02/10(土) 05:31
>>382
最初の状態ではWinでは動きません(ってことはないけど)
動かすならとりあえずUNIX鯖へアップしてダウソしたものを
初期化して動かせばWinでも動いたよ。

ちょっと意味わからんかもしれんがね。
384名無しさん:2001/02/10(土) 11:27
ローカルのWinマシンでPerlのCGI動作確認をする場合、
IISやPWSじゃなくて、ApacheやAn HTTPDを使うメリットって
何かあるんですか?

ApacheだとWinでも#!のperlパスを読んでくれるってきいたけど、
大抵ローカルとリモートではディレクトリ構成が違うから
かえって1行目の#!パスを書き換える手間がかかると思う。
どうなんでしょう。
385名無しさん:2001/02/10(土) 12:12
書き込みをして「クッキーONにしてちょ」とエラーが出る板がありますが
これはどういう処理なんでしょうか?
ブラウザがクッキーを受け取らない設定にしているというのは、どうやって
判断していますか?
クッキーを渡す→すぐに読みとる→読みとれない→「クッキーONにしてちょ」?
386名無しさん:2001/02/10(土) 12:59
>>385
ブラウザがcookieを背負って来ないから、食わず嫌いだと分かる。

ブラウザがあるドメイン(ということにしておこう)から投げられたcookieを
食べると、そのドメインにアクセスするとき、cookieの賞味有効期限内で
あれば、ブラウザはHTTP requestのヘッダにcookieの内容を入れてオーダーする。

サーバー側では、受け取ったリクエストのヘッダ中にcookie情報があるか
どうかでお馴染みさんか一見さんかを判断できる。
387365:2001/02/10(土) 13:15
>>368-369 >>372
ありがとうございます。できました。
その誤自分でいじくっていると、
「ある属性が設定されていないとき、その属性を設定する」
という事は"|"で出来たのですが、ただ
「ある属性が設定されているとき、その属性を解除する」
ことができません。質問の丸投げのようで困ったことなのですが
知っている方がいましたら、教えてください。(すみません)
388387:2001/02/10(土) 13:16
間違えました。
その誤 -> その後
>>367 さんもありがとうございます。
389_gunzip@起きた:2001/02/10(土) 13:32
#>>387
#ビット毎の排他的論理和をとる^を用いてください。
#下に簡単な例を挙げますので、参考までに。

#----------#
#サンプル:attrib -r /s と同じ事を行うスクリプト
#エラーが出ても、保証はなーもございません。

#!/usr/bin/perl -w

use File::Find;
use Win32::File qw/SetAttributes GetAttributes READONLY/;

@ARGV == 0 and push(@ARGV@`".");

&find(sub {
&nbsp;&nbsp;&nbsp;&nbsp;my $attrib = 0;
&nbsp;&nbsp;&nbsp;&nbsp;GetAttributes($_@`$attrib) or die $!;
&nbsp;&nbsp;&nbsp;&nbsp;if($attrib & READONLY){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetAttributes($_@` $attrib ^ READONLY) or die $!;
&nbsp;&nbsp;&nbsp;&nbsp;}
}@`@ARGV);
#attrib.pl
390385:2001/02/10(土) 13:57
>>386
ありがとうございます。

>サーバー側では、受け取ったリクエストのヘッダ中にcookie情報があるか
>どうかでお馴染みさんか一見さんかを判断できる。

A.クッキー背負ったおなじみさん(cookie は有効の設定)
B.クッキー背負っていない一見さん(cookie は有効の設定)
C.クッキー背負っていない一見さん(cookie は無効の設定)
D.前回書き込みのcookieは持っているが、今回は無効の設定にしてあるおなじみさん

Aは、普通に書き込めるのは理解できます。
しかし、BとCとDの違いの判定は、どのようにやるのでしょうか?
391&&の人:2001/02/10(土) 14:50
こんにちは。この前は質問に答えていただいてありがとうございました。
またしても初心者っぽい質問なのですが・・・・・

掲示板のコメントの長さ(改行数)を制限したいのですが、行き詰まってしまいました。
コメントは$FORM{'art'}の中に代入されています。
だから、$FORM{'art'}の中にある<BR>の数を数えればいいのかなぁ、
と、考えてみたりもしました。
そこでその方法を、乏しすぎる知識の中から強引にひねりだしてみようと思ったのですが、
残念ながらひねりだせませんでした。

改行の数をbrに代入しようとして、
br=0;
if($FORM{'art'}=~ /\n/){
br=br+1;
}

なんて考えてみたんですが、ダメダメですよね(汗
ていうか、<BR>って\nでいいのかわからないし、
もしよかったとしても、br=1にしかならないし・・・・・・・ 恥。
見当違い炸裂でダメダメなのはわかりますが、
どうしたら良いのかわかりません(TT)

どなたか、コメントの改行数を制限する方法をご存知でしょうか?
どうか教えてください。ヒントだけでもお願いします。
392&&の人:2001/02/10(土) 14:52
訂正
br→&br
でした・・・・・・
393&&の人:2001/02/10(土) 14:53
しまった・・・・・・
br→$br
ウツダシノウ
394AyuMoe(JAPU):2001/02/10(土) 16:00
$nlines = ($FORM{art} =~ tr/\n//);
# $FORM{art} 内にある改行コードの数を数える。

必要あれば、事前に
s/\r\n/\n/g;
tr/\r/\n/;
しておくように。
395&&の人:2001/02/10(土) 16:45
>>394
ありがとうございます。やってみます。
それ!
396&&の人:2001/02/10(土) 17:11
なんだか普通に何行でも書き込めてしまうのですが、
やり方は、

# コメントの改行数を制限するのさ!
$FORM{'art'}=~ s/\r\n/\n/g;
$FORM{'art'}=~ tr/\r/\n/;
$nline=($FORM{'art'}=~ tr/\n//);
if($nline>$art_kaigyousuu){
&error($ERR_READ@` 'コメントが長すぎます');
exit;
}
こんな感じであってるのでしょうか?
もうちょいいろいろやってみます。
397&&の人:2001/02/10(土) 17:13
あ、書き忘れていましたが
$art_kaigyousuu は、事前に設定しています(汗
398IP抜きいやん。:2001/02/10(土) 17:51
他プロコトルからのIP抜きCGI、これを防ぎたい!
http://www.tok2.com/home/pat/ipget.html

タイプ1は、ハイパーターミナルを移動させて避けました。

タイプ2では、タイプ1で表示されなかった
「FTPフォルダエラー」というウィンドウが開きます。
ftpがつながっているようなのですが、
どこをいじればIPが抜けないようになるんでしょうか?

またタイプ2のログにメアドは出ませんでしたが、
IPの他にPASSという値も表示されます。
これも防ぐことができますか?
000.000.000.000:PASS ***@

別プロトコルでIPを抜く
http://tako.2ch.net/test/read.cgi?bbs=perl&key=958649218
過去ログ発見、しかし見れません(×Д×)

Perlと関係無くて申し訳無いっす。
399&&の人:2001/02/10(土) 18:15
試しに
$nline=($FORM{'art'}=~ tr/\n//);
ではなく、
$nline=($FORM{'art'}=~ tr/a//);
と変えて、
aの数で制限してみたら、制限できました。
なんか少しわかってきたかも。ささやかに嬉しい♪
でも、改行の数は数えられないのはなぜ・・・・
もうちょっと試行錯誤してみます。ありがとうございました!
400&&の人:2001/02/10(土) 19:51
で、できない・・・・・・
とりあえず、飯食います。
401387:2001/02/10(土) 22:52
>389
有り難うございます。出来ました。
いろいろな物があるものですね........
ヽ(´∇`)ノ<☆ここはみんなしんせつさんだね〜
        うれしいう〜
403名無しさん:2001/02/11(日) 02:00
>400
数えられるハズ。
数える前に $FORM{'art'} =~ s/\n/<br>/g;
なんてやってなければ。
404名無しさん:2001/02/11(日) 11:19
文字列形式のCSVの6番目の要素を1行で取り出したい。

@data = split(/@`/@` $str);
$five = $data[5];

を1行にするには?
405名無しさん:2001/02/11(日) 11:22
掲示板CGIのHTML部分にSSIを利用した
アクセス解析を埋め込むのは可能でしょうか?
public_html
|
|-- index.html (対象ファイル)
|
|--/analyze/
|
|-- bar.gif
|-- blank.gif
|-- analyze.cgi <755> (ログを集計するCGIプログラム)
|-- log.pl <755> (ログを採るSSIプログラム)
|
|--/log/ <777> (ログフォルダ)

index.html (対象ファイル)の部分を、 **.cgiに
したいのです。**.cgiのHTML部分に埋め込む
SSIは、&lt;!--#exec cmd="./analyze/log.pl"--&gt;
じゃ駄目ですよね?いろいろ調べてみたけど判りませんでした。
ご存知の方がいらっしゃいましたら、どうかよろしくお願い致します。m(__)m



406_gunzip:2001/02/11(日) 12:07
>>404
$five = (split(/@`/@`$str))[5];
407&&の人:2001/02/11(日) 15:27
掲示板のコメントの改行数の数え方で悩んでいた者ですが、
みなさん本当にありがとうございました。

403さんのおっしゃる通り、ずっとはじめのほうに、
$FORM{'art'} =~ s/\n/<br>/g;
という行がありました。
そこで
# コメントの改行数を制限するのさ!
$nline=($FORM{'art'}=~ tr/<br>//);
if($nline>40){
&error($ERR_READ@` 'コメントが長すぎます');
exit;
}
と、<br>の数を数えるようにしたらうまくいきました!

ただ、なぜか制限数が、指定した数の4分の1になるのは気になりますが。
例えば上の例だと、$nline>40なので、10行までしか書けない・・・・・

まあ、「\nではなく<br>を数えているから、こうなるんだろう」と、
強引に納得することにしています(汗

とにかく、自分ひとりで本を読んでいたのでは
絶対にわからなかったり気付かなかったことばかりでした。
みなさんに教えて頂けて本当によかったです。
挫折せずにがんばっていけそうです。
どうもありがとうございました。m(_ _)m

408_gunzip:2001/02/11(日) 17:04
>>407
>まあ、「\nではなく<br>を数えているから、こうなるんだろう」と、
>強引に納得することにしています(汗
いや、そんな納得の仕方は良くないと思いますよ。
*----------*
何故4倍になるのかと言いますと、
>$nline=($FORM{'art'}=~ tr/<br>//);
これは、$FORM{'art'}に含まれる "<"@`"b"@`"r"@`">" を削除し、削除した数を
$nlineに格納しているからです。ですから、
----------
#!/usr/bin/perl -w
$text = "AAA<BR>AAA<BR>CCC";
$nline = ($text =~ tr/<BR>//);
print $nline;
----------
は2ではなく、8になります。
>指定した数の4分の1になるのは気になりますが
確かに、<BR>(2)の数の4倍ですね。このような場合は良いのですが、別の場合、例えば
----------
#!/usr/bin/perl -w
$text = "AAA<BR>BBB<BR>CCC";
$nline = ($text =~ tr/<BR>//);
print $nline;
----------
この場合、11になります。これでは4倍にしてもうまくいきません.
*-------------*
何故かと言いますと、tr///というのはs///とは違って、
tr/LIST/REPLACEMENT_LIST/
のように用いて、**LISTに含まれる文字全てをREPLACEMENT_LISTの対応する
文字列に変換するもの**だからです。
例を挙げますと、
tr/abc/ABC/
は、
"a" -> "A"@` "b" -> "B"@` "c" -> "C"
の変換を行っているわけです。
同じく、
tr/<BR>//
は、
"<" -> ""@` "B" -> ""@` "R" -> "" @` ">" -> ""
で、"<"@`"B"@`"R"@`">"を削除しています。
従って、二番目の例でなぜ11となったかというと、"<BR>" x 2(8)に加えて
"BBB"(3)も削除されてしまったからです。(8+3=11)
**間違いの原因は、s///とtr///の違いを知らなかったこと**に依るのでしょう。
もっと詳しいことは、ラクダ本などを参照されたほうが理解が進むと思います。
(というか、忙しいんで。ごめん)
【Perl@`CGI】参考書籍 http://tako.2ch.net/test/read.cgi?bbs=perl&key=970166109
409_gunzip:2001/02/11(日) 17:05
*-------------*
この場合(つまり$FORM{'art'}の改行数を数え、改行を<BR>に変換する)、
以下のように改造すればいいと思います。
-------------
#前にある$nline=($FORM{'art'}=~ tr/<br>//); は削除すること。
$FORM{'art'} =~ s/\r\n/\n/g;
$FORM{'art'} =~ tr/\r/\n/;
$nline=($FORM{'art'}=~ s/\n/<BR>/g); #←ここ
if($nline>$art_kaigyousuu){
&error($ERR_READ@` 'コメントが長すぎます');
exit;
}
-------------
#アホみたいに長くなった......割に内容がないなあ.
#間違ってたらつっこんで下さいです。
410名無しさん:2001/02/11(日) 18:15
Windows環境で@`Perlのデバッガは使えますか?
411&&の人:2001/02/11(日) 22:56
>>_gunzip さん
おお!なんかすごい!
わかりやすく書いてくれてありがとうございます。
謎が解けていく感じで気持ちいいかも。
_gunzip さんの文をプリントアウトしてじっくり読んでみます。
どうもありがとうございます!
(ラクダ本とは、参考書というほどの意味だと思って良いのでしょうか?)
412tar:2001/02/11(日) 22:58
>>410
使えます。っていうか、とりあえずインストールしてから訊けばいいのに。
413&&の人:2001/02/11(日) 23:29
>>_gunzip さん
うまくいきました!
なるほど、ああやれば改行の数も数えられて、
さらに<br>にも変換できるんですね。
お忙しいのに、
あのようなわかりやすい説明をたっぷりと書いてくださって
本当にどうもありがとうございました!
414名無しさん:2001/02/12(月) 05:10
フォームメールでブラウザ上から入力されたメルアドに
メールを送る方法があるそうですが、どうやればいいん
でしょう?
$mailto = '$FORM{'EMAIL'}';
としてもうまくいきませんでした。

ちなみに悪用防止の為実際使う時は<input type=hidden>
にします。
415むぎ茶:2001/02/12(月) 05:45



<input type=hidden> にしてもイタズラできますが。ぷ

┐(´ー`)┌


┏━━━━━━━━━┓
┃('Д')y ─┛~~ ┃
┃むぎ茶      ┃
[email protected]  ┃
┗━━━━━━━━━┛
http://www.freeml.com/ml_info.php?ml=bitvalley
416AyuMoe(JAPU):2001/02/12(月) 05:53
'...' と "..." の違いを学習しよう。
あと、hiddenにしてもイタズラに使われるのは同じ。
外部から与えられた入力を信用してはいけない。
417名無しさん:2001/02/12(月) 16:06
open(FILE@`"+>file.txt");
print FILE "line1\n";
print FILE "line2\n";
seek(FILE@`0@`0);
while( <FILE> ){ print }
close(FILE);

とすると、どんな環境でもきちんと
line1
line2
と表示されるのでしょうか?
というか、Windowsではできたのですが、
やっぱり $| = 1 をしたほうがいいでしょうか。

なんか print しても実際ファイルに書き込まれるのは
ファイルを閉じた時、という話を聞いたもので…。
418名無しさん:2001/02/12(月) 17:15
自分のところの会員ファイルで任意にメールアドレスをいれてもらって
いたんですが規則性のない羅列からメールアドレスだけをとりだすのに
いい方法はありませんか?
データファイルはCSV形式です
419名無しさん:2001/02/12(月) 20:20
>>418 何か知らんが適当に/[-a-zA-Z0-9_]+@[-a-zA-Z0-9_]+/
420名無しさん:2001/02/12(月) 21:41
バイトを雇って作業させる。
421414:2001/02/12(月) 23:39
>416
とりあえずレスありがとうございます。
$mailto = '$FORM{"EMAIL"}';
としたら「送信」はできましたが、肝心のメールが届きません。
まだどこか間違ってるのでしょうか。あるいは他に書き換えなけ
ればいけない所があるんでしょうか?

それにしても送信されたメールはどこへ・・・
422名無しさん:2001/02/12(月) 23:43
>>421
それだけでは何も分かりません。
423414:2001/02/12(月) 23:43
あとイタズラ防止の為に<hidden>に加えてフレーム
使おうと思ってますがどうでしょう?
424名無しさん:2001/02/12(月) 23:45
>>423
フレーム使うとどうなるの?
425414:2001/02/13(火) 00:14
ここにスクリプト置いてあるんで、よければご覧に
なってアドバイス下さい。
http://users.goo.ne.jp/hiro-1977/a_cgi.htm

>424
タグ隠せるでしょう。
フォーム
426名無しさん:2001/02/13(火) 01:17
>>425
416でjapuさんが仰っていることをよく読みましょう。


> タグ隠せるでしょう。
> フォーム

意味不明です。
427414:2001/02/13(火) 01:28
なんとか成功しました。
厨房ですいません。\の使い方間違ってたようです。

>426
途中で送信しちゃいました。

逝ってきます。
428あき:2001/02/13(火) 01:39
全角の"─"を取り除くため
$item =~ s/―――――//g;
とするとErrorになるんです。

$item =~ s/━━━━━//g;
は問題ないんですけど。

"─"ってどう記述すればいいんでしょう?
誰か教えてください。お願いします。
429AyuMoe(JAPU):2001/02/13(火) 01:52
>> 421
$moe = "ayu\n";
print '$moe';
print "$moe";
でシングルクオートとダブルクオートの違いを学びましょう。

>> 425
http://users.goo.ne.jp/hiro-1977/a_cgi.htm
このソース、とりあえずコンパイルエラーでるんだけど。
あと、注意しないと外部から任意のコマンド実行可能にできちゃうので注意。
せめて、先頭を #! /usr/local/bin/perl -wT にしよう。
# というか、goo.ne.jp (NTT-X) は逝ってよしなので使うなよ。:-)

>>428
1. それはShift_JISで記述している。
2. "―" の2バイト目は \ である。
3. 現在のPerlは、文字列はバイトごとに見る。
なので、エラーになる。さて、どうすれば良いかというと、
さくせんその1. EUC-JPで書く
さくせんその2. s/―\―\―\―\―\//g;
さくせんその3. s/\Q―――――//g;
430421:2001/02/13(火) 02:15
AyuMoe(JAPU) さんありがとうございます。おかげでうまく行きました。

例のスクリプトは途中をはしょっちゃってるんでエラーが出たのだと
思います。わざわざ見て頂いて申し訳ありませんでした。
431あき:2001/02/13(火) 03:01
>>429
i-mode用なのでEUCで書くわけには行かないです。
2番でやるとErrorにはならないけど"―"が置換できないみたい。
3はエラーになっちゃうな。
とりあえずありがとうございます。
432ayumoe:2001/02/13(火) 03:21
>>431
あぁ。すまん。そりゃ、3. はエラーになるわな。

で、2. は問題なく動くぞ。
#! /usr/bin/perl -w

$_ = 'Ayu―――――Moe';
s/―\―\―\―\―\//g;
print;
print "\n";

__END__

i-mode だからって、内部コードをeuc-jpにしてはいけないということはない。
jcode / Jcode 使えば良いだけの話。
433名無しさん:2001/02/13(火) 08:52
win95上でperldocをよく使うんですが、perldocでは逆スクロールが効かないんですね。
前の方を読み直そうと思うと、また起動しなくてはいけないのですけど、なんとかなりませんか。
434あき:2001/02/13(火) 10:18
>>432
ありがとうございます。
調べてみると、
"─" と "―"
は見かけは同じだけど違うようですね。
16進のコードは、前者は "84 9F"、後者は"81 5C"。
"\"は"5C"ですね。
435名無しさん:2001/02/13(火) 10:45
僕は最近ホームページを作ったんですが
投稿者とか投稿時間など表示や記録されない
一言伝言板みたいなものを設置したくて
参考書を見て勉強したんですが
入力フォームから受け取った日本語の文字を
処理するにはcgi-lib.pl、jcode.plが必要と
書いてあったんですがその本を最後まで
調べてみるとcgi-lib.plは使用の際に
著作者の表示などの他にクレジットの付加
って書いてあったのでお金をはらわないといけないと
思いましたのでjcode.plをまた違う本のサンプルCDから
入手したんですがjcode.plも有料ですか?
参考書によってはサンプルスクリプトを使用する際に
商用ページ使用可能で再配布もOKという本もありますし
個人で使用するのにもファイルに著作者表示必要とかいて
ある本もありますが各本の部分的なソースコードを
混ざって出来たスクリプトは誰の著作になるんでしょうか?
ファイルに各著作者の名前を入力する必要があるんでしょうか?
あと最後に改造したり一から書いたCGIが原因でプロパイダの
サーバーがダウンする可能性があるとプロパイダの説明ページで
見たんですが最低限サーバーがダウンしないようにする
安全策みたいなものはありますか?
長文大変失礼しました。
よろしくお願いします。
436名無しさん:2001/02/13(火) 10:55
ですがですがですが…

落ち着け。
437_gunzip:2001/02/13(火) 11:05
>>433
#perldoc.bat を何となく眺めただけやから、間違っとるかもしれへん
24: my @pagers = ();
25: push @pagers@` "more /e" if -x "more /e";
490: push @pagers@` qw( more< less notepad );
491: unshift @pagers@` $ENV{PAGER} if $ENV{PAGER};
523: unshift @pagers@` $ENV{PERLDOC_PAGER} if $ENV{PERLDOC_PAGER};
で、起動するページャのリストを作って、
page($tmp@` $no_tty@` @pagers);
で@pagersの中のものを
foreach my $pager (@pagers) {
last if system("$pager $tmp") == 0;
}
で一つずつ$temp(テンポラリファイル名)を食わせて試している
わけだから、moreの代わりにlessを呼びたいなら、490行目の
push @pagers@` qw( more< less notepad );

push @pagers@` qw( less もれ< notepad );
とするか、環境変数'PAGER'か'PERLDOC_PAGER'にlessをセットすればいいと思う。
(優先順位は、当然ながらPERLDOC_PAGER > PAGERやね)

#dosのmoreって、バックスクロールできなかったっけ(忘れた)
438_gunzip:2001/02/13(火) 11:12
>>433
って、perldoc perldocを読んだら、
----------
C<perldoc> will use@` in order of preference@` the pager defined
in C<PERLDOC_PAGER>@` C<MANPAGER>@` or C<PAGER> before trying to
find a pager on its own. (C<MANPAGER> is not used if C<perldoc>
was told to display plain text or unformatted pod.)
One useful value for C<PERLDOC_PAGER> is C<less -+C -E>.
----------
ってはじめから書いてあるやん。結局、
SET PAGER=less か、
SET PERLDOC_PAGER=less
とすればlessで読めると思います。
439名無しさん:2001/02/13(火) 12:23
既存のCGIの改造しようと思ってんだけど
何て本買ったらいい?
440名無しさん:2001/02/13(火) 18:03
>>435
cgi-lib.plもjcode.plも、
勝手に使っていいんじゃないの?
おれ使ってたけど、まずいのかな?
441名無しさん:2001/02/14(水) 01:18
>439
KENTと作ろう楽しいCGI
442439:2001/02/14(水) 01:36
>441
KENTで配布してるCGIでなくても
改造に役立つん?
443名無しさん:2001/02/14(水) 06:01
取りあえず聞くけど、こんなデータファイルがあって、
始めの名前でソートして、あと、kanriって名前のものだけ
先頭に持ってくるよなことはできっか?

-----data.txt-----
tomo@`0@`55@`[email protected]
kanri@`0@`55@`[email protected]
pumo@`2@`95@`[email protected]
tomo@`0@`455@`[email protected]
mm@`5@`55@`[email protected]
tomo@`0@`55@`[email protected]
mo@`0@`55@`[email protected]
tomo@`3@`55@`[email protected]
tomo@`0@`75@`[email protected]
kanri@`0@`56@`[email protected]
tomo@`1@`90@`[email protected]
kanri@`2@`55@`[email protected]
-----------------
444_gunzip:2001/02/14(水) 06:12
>>443
@array = map{$_->[0]}
sort{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a->[1] eq 'kanri' ? -1 : $b->[1] eq 'kanri' ? 1 : $a->[1] cmp $b->[1]
}
map{[$_@`split(/@`/)]} <>;
445443:2001/02/14(水) 06:17
↑わけわからん。
誰かもっと答えろ(w
446名無しさん:2001/02/14(水) 06:40
>>445
>444がちゃんと書いてくれてるだろ。
それで上手く動いたぞ。
コードが理解できないのはお前がアホだから。
消えさらせ
447_gunzip:2001/02/14(水) 06:42
>>445
ん?まずかったか?
どの辺りが分からないのか言ってくれ。
448名無しさん:2001/02/14(水) 06:54
>445=443
あとは読み手のレベルの問題だよ。
449名無しさん:2001/02/14(水) 08:59
ほへ〜、こんな書き方もできるのか…さすがはPerl。
TIMTOWTDIってのかな?感服。
自分はPerl厨房だからか知らないけど、やっぱり違った流儀で
書いてしまうな。

open&nbsp;(IN@`"<hoge.txt");
while&nbsp;(<IN>)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;(@array@`$_);
}
close&nbsp;IN;
@array=sort{&compsub($a@`$b)}&nbsp;@array;

#ユーザ名比較サブルーチン
sub&nbsp;compsub
{
&nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;($temp1@`$temp2);
&nbsp;&nbsp;&nbsp;&nbsp;($temp1@`)=split(/@`/@`$_[0]@`2);
&nbsp;&nbsp;&nbsp;&nbsp;($temp2@`)=split(/@`/@`$_[1]@`2);
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($temp1&nbsp;eq&nbsp;'kanri')&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elsif&nbsp;($temp2&nbsp;eq&nbsp;'kanri'){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$temp1&nbsp;cmp&nbsp;$temp2;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
450:2001/02/14(水) 09:02
s/hoge/data/;ね。
ちなみに_gunzipさんのも理解できるようにしたほうが幸せになれるかも。
↑が理解できなければ逝ってよし(w
451名無しさん:2001/02/14(水) 13:09
ここって、Perl/Tkもいいですか?
いま、「Perl/Tk Perlで簡単GUIプログラミング」という本を片手に
Perl/Tkをいろいろいじくっていますが、SwingのJWindowのような
タイトルバー等のない素のウィンドウって、どうすれば出来るのでしょう。
#いや、別に意図はないので、出来なくてもかまわないのですが。
#出来ないですますのもなんなんで。
#あんまり、ptkやってる人見かけないから、どこに聞けばいいのやら。

452_gunzip:2001/02/14(水) 13:59
>>450
フォローどうも。
やっぱり、? - : - を二回使ったのが悪かったのかなあ。

>>451
overrideredirect(boolean)を使うと、一応の目的は達せられるかと。
>「Perl/Tk Perlで簡単GUIプログラミング」という本を片手に
この本には、p.272に記述があります。
----------
#!/usr/bin/perl -w

use Tk;
$mainWindow = new MainWindow();
$mainWindow->overrideredirect(1);
MainLoop;

----------
ただ、これですと当然ながらCTRL-Cで殺す以外に終了する
術がありませんので、
$mainWindow->Button(
-text => "Exit"@`
-command => sub {exit(0)}
)->pack();
なんかをつっこんでおくといいかも。
--------------------
参考:
perldoc -m Tk::Wm
--------------------
453451:2001/02/14(水) 14:25
>>452
あ、なるほど。確かに書いてありますね(汗)
ありがとうございます。m(_ _ )m
454名無しさん:2001/02/14(水) 14:49
Toolzはどこにある?
455水もみ:2001/02/14(水) 16:25
はじめまして、よろしくおねがいします。
今いろいろスクリプトを改造してるんですが、掲示板で新規カキコが発生
した時にメールを送るって処理をしたいんですが、sendmailが使えないんです
こういう場合ってどうしたらいいんでしょうか?
socketとかは使えるって話なんで、そっち方面からはいけないのか?
って迷ってます。どんな風にプログラム書いていけばつまってしまったので
助言よろしくおねがいします。
456名無しさん:2001/02/14(水) 18:59
457名無しさん:2001/02/15(木) 02:55
m//を使うときに
$_="ボクハーデンサイー";
$word="ボクハー";
$ret=m/$word/
とかしたとき"ー"が含まれるとエラーになるのはなぜ?
文字コードに戻したりしてからm//やって
回避してんだけどもっと楽な方法ないの?
458AyuMoe(JAPU):2001/02/15(木) 02:59
やっと某誌の原稿終わった。
で、本題。

>>457
1. "ー" (Shift_JIS) の文字コードを調べてみましょう。
2. 2バイト目が "[" です。
3. perlは1バイトづつ見るのでエラーになります。

# というわけで、/セーラーサターン/ は失敗するのでした。

>>456
Mail::Send 使うのもよいぞ。
459457:2001/02/15(木) 03:24
458>
そうかわかった。ありがとう
S-JISを使う!って条件で
文字コードに一度変換したりする以外に楽な方法はないですかね?
460( ´ー`)y~~:2001/02/15(木) 03:43
>>459
$_&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;'ボクハーデンサイー';
$word&nbsp;=&nbsp;quotemeta&nbsp;'ボクハー';
$ret&nbsp;&nbsp;=&nbsp;/$word/;

quotemeta は関数名がなんかカコイイので好き…。

ただし2バイト目が \ の文字が最後に来る場合だけは、
陽に '芸能\' のようにやらんと失敗するので注意してね。
461457:2001/02/15(木) 03:52
quotemeta はじめてみた。
芸能\にせないかんってことは、
フォームから送られてきたデータに\をくっつけなきゃいけないってことか。。。。
勉強になりました。
がんばろう
462ところで:2001/02/15(木) 04:32
よくスクリプトをShift_JISで書くことにこだわる人がいるけど
どういう理由なんですか?
EUCで書けば面倒もなくていいのに。
463( ´ー`)y~~:2001/02/15(木) 04:35
>>461
余計なこと書いてごめん。別に最後に \ をつける必要はないです。
'芸能\' にしなきゃいけないのは、ソースの中に直接書くときだけです。
フォーム入力を取ったりして $word に 「芸能」という文字列がすでに入っている場合は quotemeta で十分。

ソースに直接 '芸能' と書くとエラーになるのはPerlのインタプリタがソースを解釈するときの問題なので、457のような正規表現のエラーとは別物です。
464名無しさん:2001/02/15(木) 04:55
ezweb用のカウンタをレンタルしてくれる所はありませんか?
http://www.counta.com/i/index.html
このサイトのように。(これはimode用)
自分でUPして設置しようと思ったのですがいまいちよくわからなかったので・・・。
465名無しさん:2001/02/15(木) 05:13
$_ = 'test0';
&ftest1;
print "$_\n";

sub ftest1 {
local($_) = 'test1';
&ftest2;
print "$_\n";
}
sub ftest2 {
local($_) = 'test2';
print "$_\n";
}

このスクリプトってやばいですか?
ローカル(Perl5)だと通ったのに
サーバの環境(Perl4)だと2度目のlocal($_)の時点でエラーになるのですが・・・。
ご教授ください。

サブルーチンを呼び出すときに$_を保持させたいけど
無理なんでしょうか?

#サーバとローカルでバージョンが違うのってけっこうむかつく
466水もみ:2001/02/15(木) 10:43
>456さん458さんレスありがとうございます。
ただモジュールをインストールの仕方がわからいのでちんぷんかんぷんです。
サーバがLinuxなもので・・・どうやっていいものやら・・・・
Socketはインストールされているんで、よろしくえればSocketでメール送信
するようなプログラムのアドバイスもらえたらいいなぁ〜って考えてます。
467名無しさん:2001/02/15(木) 12:54
クッキーについて教えてください
クッキーを受け取らなかった場合
他の値を得るようにしたいのですが以下の様にしてもうまくいきません

if (!print &setcookie($QUERY{mode}@`on)) { &error("クッキー受け取り拒否"); }

一度最初に発行してクッキーの有無を確認する方法を採らないと
無理なのでしょうか?
468名無しさん :2001/02/15(木) 12:58
フリーで多機能で
windowsMEで動くtelnetソフトないですか?
win95とかNTならあるみたいなんですが。
頭のいい方、お願いします
469サゲ茶漬け:2001/02/15(木) 13:49
>>465 サブルーチン

え?
サブルーチーンの間違いじゃ?
470仕様書無しさん:2001/02/15(木) 14:30
Σ(;´д`)なにっ!?
471名無しさん:2001/02/15(木) 15:46
>>469@`470
どっちでもいいんだよ
472名無しさん:2001/02/15(木) 16:44
>>462
EUCだとIEはよく文字化けを起こすからでしょ
googleのキャッシュでEUCで書かれたページとか
いちいちエンコードする必要があるでしょ
473名無しさんしさん:2001/02/15(木) 17:14
おしえてください。
いま掲示板作ってて、
とりあえず動くようにはなったんだけど、
掲示板で一定量書き込みがあったら
次のページへってでるやつは
どうやってやればいいんでしょうか?
474470:2001/02/15(木) 17:23
>>471
そういう意味じゃなくてね(^^;
>>465
469の言ってる当事者なら
ここに来ないほうが安全かと思うんだけど
475_gunzip:2001/02/15(木) 18:19
>>466
「Perl モジュール活用ガイド」(翔泳社)3800円
という本のp.159〜183にいろいろ載っているので、後学のためにも
買って読んでみる事をお奨めするよ。
モジュールのインストールについても記載されているし。
#自分は殆どやった事がないから、本の紹介ぐらいしかできないよん。
#ごめんね
476名無しさん:2001/02/15(木) 20:00
んん? >>474
まさか?
477387:2001/02/15(木) 20:17
LWP::UserAgentで取得したHTMLファイルを、HTML::Parserのサブクラスを作ってメソッドをオーバーライドして加工しようと思い、
いろいろマニュアルを見ながらやってみたのですがうまくいきません。
start()やtext()が妙な振る舞いをして、思い通りの出力にならないです。
処理したいのは全て英文なので、漢字コードとかは関係ないような気がします。
何か考えられるようなことはないでしょうか。
478_gunzip:2001/02/15(木) 20:34
>>477
>start()やtext()が妙な振る舞いをして、思い通りの出力にならないです。
具体的に、どのような点が奇妙なのですか?
479477:2001/02/15(木) 22:23
>>478
うまく言えないのですが、ある特定のタグが出現した際に、それ以降を
加工して出力するのですが、明らかにマッチすべきなのにマッチしないのです。
なんか下手な言い方ですげ、すみません。
ソースはくそ長いので貼り付けるとまずそうです。
480名無しさん:2001/02/15(木) 22:41
超初心者です。
if($mode eq 'edit') { &edit; } 〜〜sub edit{〜〜} 〜〜
で、CGIのURLのあとに「?mode=edit」をつけて移動してもうまく実行されません。
なぜ?
481_gunzip:2001/02/15(木) 23:11
>>479
>.明らかにマッチすべきなのにマッチしないのです。
んん?その部分だけでも書いてくれないと、さっぱり分かりません。
あと、まさかと思うけれど、
sub start{
&nbsp&nbsp&nbsp&nbsp;my($tag@` $attr@` $attrseq@` $origtext) = @_;
.......
}
と書いたりしていませんか?
#ところで、ファイルは存在しています?(-e $path)
482( ´ー`)y~~:2001/02/15(木) 23:16
>>480
foreach( split /&/@` $ENV{QUERY_STRING} ){
&nbsp;&nbsp;&nbsp;&nbsp;my( $key@` $value ) = split /=/;
&nbsp;&nbsp;&nbsp;&nbsp;*{$key} = \$value;
}

とやるとお望みの動作になります。
…ですがあまり一般的でないので、普通は下のようにします。

foreach( split /&/@` $ENV{QUERY_STRING} ){
&nbsp;&nbsp;&nbsp;&nbsp;( $key@` $value ) = split /=/;
&nbsp;&nbsp;&nbsp;&nbsp;$form{$key} = $value;
}

if( $form{mode} eq 'edit' ){
&nbsp;&nbsp;&nbsp;&nbsp;...
}
483名無しさん:2001/02/15(木) 23:23
KENT-WEBのYYBBSで
名前の部分が記入されていない時、『名無しさん』と表示できるように
したいのですが、どうすればいいのかさっぱり分かりません。
変数を設定して
変数1 なら名無しさんで投稿
変数2 なら名前が記入されていません のエラーが表示され、投稿できない。
という具合にしたのですが・・・・
どうかお願いします。
484477:2001/02/15(木) 23:26
>>481
あーすぐに解決しました。(有り難うございます_gunzipさん)
>あと、まさかと思うけれど、
>sub start{
> my($tag@` $attr@` $attrseq@` $origtext) = @_;
>.......
>}
>と書いたりしていませんか?
このまさか、でした。ただ単に、オブジェクトへのリファレンスが
第一引数として渡されるのをど忘れしていたようです。
(なので、一つずつずれていました。)どうも、たびたび質問をしてすみませんでした
485名無しさん:2001/02/15(木) 23:29
関係ないけど、ここはPerlスレじゃないの?
CGI関係は↓じゃない?
http://tako.2ch.net/test/read.cgi?bbs=perl&key=971627428
486_gunzip:2001/02/15(木) 23:35
>>480
----------
foreach( split /&/@` $ENV{QUERY_STRING} ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my( $key@` $value ) = split /=/;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp${$key} = $value;
}
print $mode;
----------
こんな所かなあ。
487_gunzip:2001/02/15(木) 23:39
↑すみません。既に>>482さんが書かれていましたね。
しかも、全く同じ事を書いてしまった・・・失礼
#ちゃんとリロードすべきだったです。
#かちゅーしゃ使っている人はあぼ〜んお願いします。
>>484
上手くいって何よりです。
#書く前にりろーどせな。
488初心者ですいません:2001/02/16(金) 00:31
おしえてください。
いま掲示板作ってて、
とりあえず動くようにはなったんだけど、
掲示板で一定量書き込みがあったら
次のページへってでるやつは
どうやってやればいいんでしょうか?
489名無しさん:2001/02/16(金) 00:39
>>488
既存のスクリプトを眺めてみるべし。
490名無しさん:2001/02/16(金) 02:24
>>483
その変数1、2って…。な、なに???
自分でもよくわからないまま書いてない?
491名無しさん:2001/02/16(金) 02:46
>>490
$nanashi_name = "1"; #1なら名前欄が無記入の場合、投稿者=名無しさん@`2なら『名前を記入シロヤァ』って表示あれて投稿不可
って事じゃねーの?
間違ってたらスマソ

一つ言っとくけど、俺はPerl全然分からんので・・・・
んじゃな
492_gunzip:2001/02/16(金) 10:16
>>449
Perl5.6以降では
>@array=sort{&compsub($a@`$b)} @array;
は、
sub compsub($$){
&nbsp;&nbsp;&nbsp;&nbsp;my($itte@`$yosi) = @_;
......
}
のようにプロトタイプを設定してやる事により、比較対象である
二要素のリファレンスが@_経由でcompsubに渡されるので、
@array = sort compsub @array;
と書けるよ。
#こちらの方がちょっと綺麗・・・かな。
#以前は、別パッケージにソートルーチンを書く際には$a@`$bを
#きちんと修飾する必要があったし、便利になったなあ。
----------
perldoc perldelta
perldoc -f sort
493443:2001/02/16(金) 12:24
んなことはどうでもいいから早く答えろ
脳無しども。
494名無しさん:2001/02/16(金) 13:56
テキストをタグで囲むルーチンなんですが
以下のコードで問題ありますか?
sub AUTOLOAD{
my $tag = $AUTOLOAD;
my ($nl@`$txt@`@oth@`$ws);
$tag =~ s/.*::([a-zA-Z]*)(_?)$/$1/ or return $tag;
$nl = "\n" if($2);
$txt = shift;
@oth = @_;
$ws = " " if(@oth);
return join (""@` "<$tag$ws"@` join(" "@`@oth)@` ">$nl$txt$nl</$tag>");
}

タグ名 (TEXT):タグで囲む
タグ名_(TEXT):タグの前後で改行して囲む

div_(span('aaa'@`'class="aaa"'));

<div>
<span class="aaa">aaa</span>
</div>
となるのですが。

495名無しさん:2001/02/16(金) 14:58
チャット作ったんですが、発言後、いちいち発言欄のテキストボックスを
クリックしないとカーソルが出てきません。どうすればよかんべ?
これだけじゃ分からないですかね?ソース貼りますか?
496名無しさん:2001/02/16(金) 15:07
>>495
あなたの実現したい機能が実現されているチャットの
html をすみからすみまで見なはれ。
質問はそれからだな。。。
497(;´д`):2001/02/16(金) 17:46
>>495
Perlの話じゃないです。

<body onload="document.chat.comment.focus();">
<form name="chat"><input name="comment"></form>

とでもやってください。
498_gunzip:2001/02/16(金) 18:01
>>494
これはどのように呼び出されるの?
#何故にAUTOLOAD???
499_gunzip:2001/02/16(金) 18:19
↑上は撤回(すまん・・・)
500名無しさん:2001/02/16(金) 18:25
>>494
問題がないなら別にいいじゃんと思うんだけど…。

join(" "@`$tag@`@_) でいいんちゃうの。
501名無しさん:2001/02/16(金) 18:28
>>498
フレームじゃないチャットだと思ったんじゃない?
502( ´ー`)y~~:2001/02/16(金) 18:44
package TText;

$" = " ";

sub new{
&nbsp;&nbsp;&nbsp;&nbsp;my $class = shift;
&nbsp;&nbsp;&nbsp;&nbsp;my $text = shift;

&nbsp;&nbsp;&nbsp;&nbsp;bless \$text@` $class;
}

sub entag{
&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;
&nbsp;&nbsp;&nbsp;&nbsp;my $tag = shift;

&nbsp;&nbsp;&nbsp;&nbsp;$$self = "<@{[$tag@`@_]}>$$self</$tag>";

&nbsp;&nbsp;&nbsp;&nbsp;$self;
}

sub print{
&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;
&nbsp;&nbsp;&nbsp;&nbsp;print $$self;
}

package main;

my $mona = TText->new( 'オマエモナー' );
$mona->entag( 'b' )->entag( 'div'@` 'class=mona' );
$mona->print;

>>494
わざわざAUTOLOADを使う必要は無いと思ふ。関数で十分では?
クラスが嫌いなら上のpackageをはずして

$text = 'オマエモナー';
entag( \$text@` 'div'@` 'class=mona' );

とか…。
503(; ´ー`)y~~:2001/02/16(金) 18:48
ってAUTOLOADもサブルーチンだな。詩嚢。
504_gunzip:2001/02/16(金) 18:55
>>494
こんなものでいかがでしょうか。
↓をBEGIN{}ブロックに放りこんでおくとか。

------------------------------------
#!/usr/bin/perl -w

@tag = ("dir_"@`"span");

foreach my $sub (@tag){
&nbsp;&nbsp;&nbsp;&nbsp;if($sub =~ /^(\w+)_$/){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $tag = $1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*{$sub} = sub {return "<$tag>\n$_[0]\n</$tag>\n"};
&nbsp;&nbsp;&nbsp;&nbsp;}elsif($sub =~ /^(\w+)$/){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $tag = $1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*{$sub} = sub {return "<$tag $_[1]>$_[0]</$tag>"};
&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die "逝ってよし!!!!!!!!!";
&nbsp;&nbsp;&nbsp;&nbsp;}
}

print dir_(span('aaa'@`'class="aaa"'));

------------------------------------
output:
<dir>
<span class="aaa">aaa</span>
</dir>
------------------------------------
505_gunzip:2001/02/16(金) 19:04
ちょこっと訂正。
space()に三つめ以上引数があっても無視してしまうのを修正。
-------------------------------------
#!/usr/bin/perl

@tag = ("dir_"@`"span"); #ここに、作成したいサブルーチン名を入れる。

foreach my $sub (@tag){
&nbsp;&nbsp;&nbsp;&nbsp;if($sub =~ /^(\w+)_$/){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $tag = $1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*{$sub} = sub {return "<$tag>\n$_[0]\n</$tag>\n"};
&nbsp;&nbsp;&nbsp;&nbsp;}elsif($sub =~ /^(\w+)$/){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $tag = $1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*{$sub} = sub {return "<$tag" . join(" "@`@_) . ">$_[0]</$tag>"};
&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die "逝ってよし!!!!!!!!!";
&nbsp;&nbsp;&nbsp;&nbsp;}
}

#ってことでdir_()と、space()が使えるよん。
print dir_(span('aaa'@`'class="aaa"'@`'class="bbb"'));

出力-------------------------------------
<dir>
<spanaaa class="aaa" class="bbb">aaa</span>
</dir>
-------------------------------------
506名無しさん:2001/02/16(金) 19:07
>>504
494じゃないけど、へたれな僕には何をやっているのか
さっぱり分からないです。
鬱だ氏脳
507_gunzip:2001/02/16(金) 19:12
また訂正。
誤 *{$sub} = sub {return "<$tag" . join(" "@`@_) . ">$_[0]</$tag>"};
正 *{$sub} = sub {return "<$tag " . join(" "@`splice(@_@`1)) . ">$_[0]</$tag>"};
何度も間違ってすみません。
508_gunzip:2001/02/16(金) 19:27
訂正・・・
上のスクリプトについて s/dir/div/g してください。
何度もごめんなさい。
509443:2001/02/16(金) 19:55
俺のはどうなった?
510名無しさん:2001/02/16(金) 21:43
糞な質問でごめん。

うんこって文字列があれば、うんこを<IMG src="unko.gif" width="10"
height="10">に変換したいんです。
それで、うんこうんこと2回あれば、width="20" height="20"にしたい。
それで、うんこうんこうんこうんこうんこうんこうんこうんこうんこうんこと
10回あれば、width="100" height="100"としたい。

自分では
$text =~ s/(うんこ)/<IMG src="unko.gif" width="10" height="10">/g;
ぐらいしかできません。
511494:2001/02/16(金) 21:59
なるほど。
_gunzipさんのを使わせていただきます。
ありがとうございました。

>>502さん
オブジェクト指向なのはよく分からないです…。
AUTOLOADは効率悪いですか…。確かに何度も呼び出すとなると遅そうな気もしますけど。
わざわざ書いていただいたのにヘタレですみませんです。
512494:2001/02/16(金) 22:30
おお!うまく行きました。
どうも御世話になりました>_gunzipさん
513_gunzip@おやすみなさい:2001/02/16(金) 23:40
>>510
---------------------
#!/usr/bin/perl
use constant LEN => length("ひゃ");

$str = "あひゃーーーーーーーーーーひゃひゃひゃひゃひゃ";
$str =~ s#(ひゃ)+#
&nbsp;&nbsp;&nbsp;&nbsp;$len = (length($&) / LEN) * 10;
&nbsp;&nbsp;&nbsp;&nbsp;"<IMG src=\"hya.gif\" width=\"$len\" height=\"$len\">"
#eg;

print $str;
---------------------
#これぐらいしか思いつかない。
#もっといい方法無いかなあ。
514443:2001/02/16(金) 23:51
お・れ・の!
515名無しさん:2001/02/17(土) 01:13
>>514
444を読め。そして考えろ。
分かったら2度と来るな。いいな?
516名無しさん:2001/02/17(土) 03:40
掲示板の文字サイズを1つ小さくしたいんですけど
なんかうまくいかないんです。

# サイズを指定
$size = "";

↑""の間に何を入れればよろしいのでしょうか?
517名無しさん:2001/02/17(土) 05:18
-1
518510:2001/02/17(土) 10:16
>>513
_gunzipさん、ありがとうございます。

2ちゃんねるみたいな掲示板を作っておまけでをつけたくなったので
ああいったこと(>>510)を言ってみました。
ソースにここのURLを入れておきます。
(事情があって自分のHomePageのURLは公開しません。すまそ)

それでは。
519_gunzip:2001/02/17(土) 12:56
>>518
use constantは5.005.64以上でしか動かないし、此処でconstantを使う意味
など*全く*ありませんから、素直に
-------------------------
#!/usr/bin/perl -w
$strlen = length("ひゃ");
$str = "あひゃーーーーーーーーーーひゃひゃひゃひゃひゃ";
$str =~ s#(ひゃ)+#
&nbsp;&nbsp;&nbsp;&nbsp;$len = (length($&) / $strlen) * 10;
&nbsp;&nbsp;&nbsp;&nbsp;"<IMG src=\"unyuu.gif\" width=\"$len\" height=\"$len\">"
#eg;
print $str;
--------------------------
とした方が良かったですね。ごめんなさい。
#サイト作成頑張ってください。
520名無しさん:2001/02/17(土) 13:42
Perlの構文チェックをしてくれるようなサイトってあります?
521名無しさん:2001/02/17(土) 13:59
意味不明
522どっちでもいいけど:2001/02/17(土) 14:18
-wc な人と -cw な人がいるよね。俺-wc派。

つーことで perl -wc を知らない人と思われ。
523_gunzip:2001/02/17(土) 14:50
>>520
>522さんが指摘しているけれど、
perl -wc script.pl
で構文チェックができるよ。(僕も-wcかな)

#perlの構文チェックをするサイトって・・・???
#あるとしたら、もしかしてperl -wc に食わせるのかなあ・・・
#でも、こんなの食わされたら破滅だし
BEGIN{
&nbsp;&nbsp;&nbsp;&nbsp;system("rm -rf ほにゃらら");
}
#-c でもBEGINブロックは実行されるのでした。
524名無しさん:2001/02/18(日) 00:39
>520
トクトク
かたっぱしからUP、だめならエラー出る
525443:2001/02/18(日) 09:50
444読んだが意味不明。
こんなコード書く奴は厨房決定。
ってことで、書け。
526449:2001/02/18(日) 11:56
逝ってよし。>>443
527名無しさん:2001/02/18(日) 13:00
cookieのエンコードについてなんですが。
JavaScriptなら
  escape()
perlなら
  s/(\W)/sprintf("%%%02X"@` unpack("C"@` $1))/eg;
で、エンコードすると思うんですが、この2つって結果が違いますよね?
これをescape()と同じ結果になるようにperlで書くことは
できるんでしょーか?
528名無しさん:2001/02/18(日) 20:52
>>527
結果は一緒の筈だが????
529名無しさん:2001/02/18(日) 22:26
一部出力されないのですが、なぜ???
分かる人、教えて!!!

#!/usr/local/bin/perl
outputtext();
sub outputtext{
use File::Find;
&find({
wanted => \&wanted
}@` './');

}
sub wanted{
if($File::Find::name =~ /\.txt$/){
open(F@`$File::Find::name);
print <F>;
close F;
}
}
530名無しさん:2001/02/18(日) 23:09
>>528
IE5だとunicode(?)かなんかになる。
アレをデコードするにはどうしたらいいのかねぇ。Jcode.pmか?

俺は諦めてPerlならPerl@`JavaScriptならJavaScriptで
エンコードもデコードも両方やることにしたよ。>>527
531_gunzip:2001/02/18(日) 23:20
=ck
まず、気になった点として
・プラグマではないものを、サブルーチンブロック内でuseしても意味がない。
・openの戻り値はチェックする。
---
>一部出力されないのですが
$File::Find::name に入るのは、処理するファイルのフルパス。
&find()はそのファイルのあるディレクトリにchdir()するので、
$File::Find::nameを開こうとすると、この場合(./からスタート)
(./temp/hoge.txtというファイルがあった場合、)
カレントディレクトリが./temp/で、./temp/hoge.txtを開こうとするので
./temp/temp/hoge.txtを開く事になってしまう(openをチェック)
(・・・筈。間違ってたら教えてほしひ)
ですから、$_ を使うか、no_chdirを指定すれば解決するかと。
という事で、以下のようにすれば良いような。
=cut
#!/usr/bin/perl -w
use File::Find;
&outputtext();
sub outputtext{
&nbsp;&nbsp;&nbsp;&nbsp;&find({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wanted => \&wanted
&nbsp;&nbsp;&nbsp;&nbsp;}@` './');
}
sub wanted{
&nbsp;&nbsp;&nbsp;&nbsp;if(-f $_ && /\.txt$/){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open(F@`$_) or die "Can't open $_";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print <F>;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close F;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
#毎度長いな。
532_gunzip:2001/02/18(日) 23:21
あ、上は>>529です。
533527:2001/02/18(日) 23:50
>>530
あ、そーなんですか
確かに、今Netscape4.7と6でやってみると同じ結果になって、
IE5.5だけ違う結果になりました・・・
cookieをperlでセットして、JavaScriptでゲットするのは
やっぱし無理なんすかねぇ。
534名無しさん:2001/02/19(月) 00:40
配列@arry_aと配列@arry_bが全く同一かどうかを
簡単に判定する方法ってないですか?
あらかじめ@arry_aと@arry_bの要素数は同一かどうか
判定済みで単純に内容の比較だけなのですが、
ループを使うのはちょっと大げさなので簡単な
方法を考えてるのですが思いつきません。
よろしくお願いいたします。
535( ´ー`)y~~:2001/02/19(月) 01:42
>>534
見た目的に単純ということなら

$" = "\037"; # 空白を含む要素が無いなら要らない
print '同じかな( ´ー`)y~~' if "@arry_a" eq "@arry_b";

こんなのをプライヴェートでは使ってます(w
536534:2001/02/19(月) 02:45
>535
ありがとうございます。
普通の変数みたいに単純に比較してもいいものなんですか・・・
要素を1個づつ比較しないといけないのかと思い、
難しく考えすぎてました。
537名無しさん:2001/02/19(月) 02:46
http://printbox.virtualave.net/bbssamp/che_a.cgi
の文中のURL自動リンクのチェックboxのチェックを消しても
勝手に自動リンクにさせたいのですが、どのように変更すれば良いのでしょうか?
いろいろタメしましたがhtmlが崩れたりしただけでうまく成功しません。
538ブレッツ:2001/02/19(月) 03:08
536は535の真意を理解してないと見た。
それは単純には比較してないぞ。
539名無しさん:2001/02/19(月) 09:50
540名無しさん:2001/02/19(月) 15:35
http://www.gossamer-threads.com/
のLinks v2.0の設置を日本語で解説してる所ってないですかね?
もしくは日本語で同じようなCGIってないですかね?
ご存知の方がいましたら、教えてください。
541名無しさん:2001/02/19(月) 16:30
>>540
日本語ならYomi Searchとか。
滅茶苦茶多機能だから、要求的にはたぶん大丈夫だろう。

# 辞書引きながらトライして「ここが解らん」なら解説のしようもあるけど…。
# 最初から何もしないんじゃあね。
542a-Si:2001/02/19(月) 17:56

[email protected]@`千葉@`美浜区@`
[email protected]@`東京@`江東区@`
[email protected]@`大阪@`東淀川区@`

CSVに上記のようなデータがあるとします。
この時に [email protected] を検索でマッチさせて
その行全体(この場合は上から2行目)のデータを消去したいのですが,
どのようにすればよろしいでしょうか?御指南下さい。
543540:2001/02/19(月) 18:02
ユーザーが登録してあるサイトの評価とコメントが書けるサーチエンジン
ってものをさがしていました。yomi-searchですか探してみます。
ありがとうございました。

># 最初から何もしないんじゃあね。
何度かトライしているのですが、なかなかうまくいかず、どこで詰まってるかわからなくて・・・。
read me通りにはやってると思うんですが・・・、で安直に聞いてしまいました。すみません。
544a-Si:2001/02/19(月) 18:06
>>542 自レスです。
消去ではなく,改変の間違いです。
[email protected]@`東京@`江東区@`

[email protected]@`東京@`目黒区@`

545名無しさん:2001/02/19(月) 19:28
>>543 ではありませんが同様の疑問が。

RDBのようなテーブルタイプ(主キーで検索 -> 行操作)のデータ
構造を、パーマネントに保存・管理するのに便利なPerl Moduleって
ないんでしょうか?。今はGDBM_File(データサイズに制限がない)
にjoin('\a'@` @list)みたいにして保存していますが、
全くダサい....。

かといってODBCなど経由で外部DBを叩く方法では「Perl本体のみ
あればとりあえず動かせるカー?」という汎用性が失われてしまい
あまりうれしくないし。
546名無しさん:2001/02/19(月) 20:36
そのまま日本語で書かれてるcookieファイルがあるんですけど、
cookieってエンコードデコードしなくても大丈夫なんでしょうか?
547名無しさん:2001/02/19(月) 21:22
>>546
ここのクッキーを見てみれば?
548名無しさん:2001/02/19(月) 21:59
半角表示OKなjcode.plの使い方おちえて
549_gunzip:2001/02/19(月) 22:20
>>542
#!/usr/bin/perl -w
=ck
CSVファイルを扱うのであれば、↓この辺りもチェック。
http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
もし、本格的にCSVファイルを扱うのであれば、
Text::CSV_XSモジュールでも用いた方がいいかもしれない。
(予め言っておくと、日本語が混ざるならbinary指定)
あくまで簡単にやろうと思えば、下のように。(あまり綺麗ではないが・・・)
=cut

while(<>){
&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;my($mail@`$prefecture@`$zone) = split /@`/; #分解
&nbsp;&nbsp;&nbsp;&nbsp;if($mail eq "tokyo\@geocities.co.jp "){#マッチすれば
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$zone = "目黒区";&nbsp;&nbsp;&nbsp;&nbsp;#入れ替え
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$_ = "$mail@`$prefecture@`$zone";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;print $_ @` "\n";
}

#あと、書き戻す。
550_gunzip:2001/02/19(月) 22:28
訂正
誤>"tokyo\@geocities.co.jp "(後ろの半角スペース不要)
正>"tokyo\@geocities.co.jp"
551443:2001/02/19(月) 22:59
じゃ、次。
443のよなデータファイルで、出てくる名前の多い順にソートするのを書け。
こんな奴
aaa 15 +++++++++++++++
bbb 10 ++++++++++
ccc 8 ++++++++
ddd 5 +++++
eee 3 +++
今度はしっかり書けよ。
552名無しさん:2001/02/19(月) 23:03
既出だったらすみません。
複数行が入っているテキストファイルの中身を丸ごと読み出して、
改行ごと全部$hogehogeに代入するのってどうすればよいのでしょう・・・?
ファイルハンドルを読み出す時、手元にある本には<ファイルハンドル名>
で一行ずつとしか載ってなくて・・・
553_gunzip:2001/02/19(月) 23:09
>>551
#!/usr/bin/perl -w
die "usage: perl test.pl datafile..." if @ARGV < 1;
$data{(split(/@`/))[0]}++ while(<>);
foreach(sort{$data{$b} <=> $data{$a}} keys %data){
&nbsp;&nbsp;&nbsp;&nbsp;print "$_\t$data{$_}\t" @` "+" x $data{$_} @` "\n";
}
#=============================================
tomo&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;++++++++++++++++++++++++
kanri&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;++++++++++++
mm&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;++++
pumo&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;++++
mo&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;++++
#=============================================
554_gunzip:2001/02/19(月) 23:12
>>552
undef $/;
#local $/でも可。
$hogehoge = <FH>;
555名無しさん:2001/02/19(月) 23:16
>>546
エンコードしなくても、確かに問題なく使えてるな。
でも、やっぱりしないとあかんかな。
誰か教えて。
556443:2001/02/19(月) 23:19
>553
また、わけわからんもん書きやがって
もうお前は俺のには今後一切答えなくて良し。
他の奴書け。
557546:2001/02/19(月) 23:25
とほほに書いてあるのは何なんでしょー?

http://wakusei.cplaza.ne.jp/twn/wwwcook.htm#CookieEncode
558552:2001/02/19(月) 23:39
う〜んなぜか$hogehogeには何も入ってない・・・???
559_gunzip@もう寝るが:2001/02/19(月) 23:41
>>558
どんなコードを書いたの???
>>556
ぎょい。
560552:2001/02/19(月) 23:48
#!/usr/local/bin/perl

undef $/;

open(IN@`"cnt.log") || &error("エラーです。10010cnt.log");
$test = <IN>;
close(IN);

print <<"EOF";
Content-type: text/html

<html>
.
.
<body>
.
.
$test
.
.
</body></html>
EOF

exit;

みたいな感じです・・・
561名無しさん:2001/02/19(月) 23:55
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C"@`hex($1))/eg;
&jcode'convert(*value@`'sjis');

これだと半角カナつかえないでしょ
ゴメソオシエテ
562ななしさん:2001/02/20(火) 01:12
Perlでログファイルを解析して表示したいのですが、提供される前日以前のログがtarで圧縮されております。
それを解決する方策として
1.Perlで解凍する。
2.シェルスクリプトをPerlに埋め込む。
3.cronを用いる。
を考えたのですが、3は今レンタルしているサーバーでは利用不可能。
1・2はやり方がわかりません。
何かうまい方法があったらご教授ください。
563ななし:2001/02/20(火) 01:16
tarで圧縮されているテキストファイルをperlで扱う方法はありませんか?
ちなみにcron利用不可、シェルスクリプト・perl可の鯖です。
564名無しさん:2001/02/20(火) 02:10
素直に system("tar xf hoge.tar"); って呼び出したら?

でなきゃ、Archive::Tar という perl module があるようです。
って、google で perl と TAR で検索したら出てきたぞ...
次からはまず google や goo@` Yahoo! で調べてくださいな。

英語ですが、解説があります。
http://www.perldoc.com/cpan/Archive/Tar.html
565_gunzip:2001/02/20(火) 09:14
>>560
・ファイルの冒頭に0x1Aがあり、そこで切られてしまう。(DOSのみ)
(バイナリモードにするにはbinmode FH;かopenプラグマを用いる。)
・始めからファイルが空である
・そもそもファイルが開けない。
(openの戻り値をチェック)
これぐらいしか思いつかないが・・・

>>561
>これだと半角カナつかえないでしょ
「半角カナが使えない」って?
566名無しさん:2001/02/20(火) 10:00
ファイルの削除
567_gunzip:2001/02/20(火) 10:03
>>566

unlink or die "Can't remove $_" for @ARGV;
568名無しさん:2001/02/20(火) 15:42
camファイルを扱えるライブラリ・モジュールを御存知ないですか?
Image::Magickでは対応していないようです。
569名無しさん:2001/02/20(火) 16:20
virtualaveでのCGI設置方法を詳しく掲載している
サイトってないでしょうか?お願いします。
570名無しさん:2001/02/20(火) 16:36
>>569
適当にやってみろ。
厨房じゃなかったらできる。
571名無しさん:2001/02/20(火) 16:57
あそこほど設置しやすい場所はそうそうないと思うが
572名無しさん:2001/02/20(火) 16:58
>>570
ええ、ずっと前から適当というか勘に頼って合間を縫って
やっているのですが、全然できなくて何か最近根本から
間違ってるんではと思いまして、、もうちょっとがんばってみます。
ありがとうございました。
573名無しさん:2001/02/20(火) 17:04
>>571
すいません、、始めたばかりなもので。。
ちょっと質問いいですかね?CGIファイルの
一行目は#!/data1/va/****/cgi-bin/upbd.cgi
****はユーザー名で、これであっているのでしょうか?
574名無しさん:2001/02/20(火) 17:08
>>573
upbd.cgiってあゆ板か?
575名無しさん:2001/02/20(火) 17:19
>573
あってるよ。ワレザー最高
576名無しさん:2001/02/20(火) 18:07
>>575
あゆ板って負荷かなりかかるんじゃなかった?
577名無しさん:2001/02/20(火) 18:20

%pref = (
"北海道" => Hokkaido@`
"青森県" => Aomori-ken@`
"岩手県" => Iwate-ken@`
"宮城県" => Miyagi-ken@`
;
;
;

$pref_data = $pref{$value};

と、こんな感じの事がやりたいのですが、うまくいきません。
eucで書いてあります。
578名無しさん:2001/02/20(火) 18:36
>>577
Perlには詳しくないんだけど、
$pref_data = $pref[$value];
でない?
579561:2001/02/20(火) 20:17
>565
まぁminibbsを弄ってるんだけど「半角カナ」を含んだ文字を投稿すると
文字化け起こしちゃうのよね。
保存されるファイルは既に文字化け起こしてるんです。

これって単純な質問なんすか?
580名無しさん:2001/02/20(火) 20:37
>>577
都道府県名を「"」ではなく「'」で括ったらどうか?
581名無し:2001/02/20(火) 21:56
virtualって.htaccessいるの?
582_gunzip:2001/02/20(火) 22:35
>>577
=ck
Perl5.001以降から、=>演算子は左側にある語を勝手に文字列と
解釈してくれるようになったけれど(あんまり関係ない)、この書き方だと、
こんな↓事にならない?(それ以前に、);が無いのでSyntax Errorだし)
%pref = (
"北海道" => Hokkaido@` #Hokkaido
"青森県" => Aomori-ken@` #Aomori - ken = 0
"岩手県" => Iwate-ken@` #Iwate - ken = 0
"宮城県" => Miyagi-ken@` #Miyagii - ken = 0
);
ちゃんとクォートしてやれば良いのでは?
=cut
#!/usr/bin/perl -w
%pref = (
"北海道" => "Hokkaido"@`
"青森県" => "Aomori-ken"@`
"岩手県" => "Iwate-ken"@`
"宮城県" => "Miyagi-ken"@`
);
$value = "青森県";
$pref_data = $pref{$value};
print $pref_data;
------------
Aomori-Ken
------------
583552 560:2001/02/20(火) 22:51
560です。
実は $test=<IN>; の直前に @cntlog = <IN>;
という行があったのですがこれをコメントアウトしたら一発でした・・・
お手数おかけしました&ありがとうございました(^-^)

# でもなんで @cnt... が入るとダメなんだろう・・・
584_gunzip:2001/02/20(火) 22:52
>>568
=ck
モジュールは無いと思う。
CAMファイルといえば、CASIOデジタルカメラQVの画像フォーマット
のことだね(よな?)なら、↓のサイトにあるツールを噛ませて
http://www.st.rim.or.jp/~kimu/palm/qv10faq.html
ftp://ftp.itojun.org/pub/digi-cam/
JPEG/PPM等にいったん落としてから、Image::Magick等で加工すればいいと思う。
ただ、QV-10@`QV-100用しかないみたい。(自分もQV-100しか持っていない)
EXIFフォーマットなら、APP1がくっついただけだからImage::Magickにそのまま
食わせても可。
=cut
585_gunzip:2001/02/20(火) 23:12
>>583
=ck
>でもなんで @cnt... が入るとダメなんだろう
@cntlog = <IN>;
で全てファイルが読み込まれてしまい、$test=<IN>; の所では残っていないから。
$/をいじっていないなら、配列@cntlogの各要素に一行ずつファイルの中身が入る。
undef $/; していたなら、$cntlog[0]の中にファイルの中身が全て入る。
hoge.txtというファイルを作って下のコードを試してみ。
=cut
#!/usr/bin/perl -w
#-------------
open(F@`"hoge.txt") or die "Can't open hoge.txt";
@lines = <F>;
close F;
#-------------
undef $/;
open(F@`"hoge.txt") or die "Can't open hoge.txt";
@line = <F>;
close F;
#-------------
for($i = 0 ; $i < @lines ; $i++){
&nbsp;&nbsp;&nbsp;&nbsp;print "\$lines[$i] = " @` $lines[$i];
}
print "#---------------------------#\n";
for($i = 0 ; $i < @line ; $i++){
&nbsp;&nbsp;&nbsp;&nbsp;print "\$line[$i] = " @` $line[$i];
}
586552 560:2001/02/20(火) 23:51
>>585
実行してみました。なるほどどう動くのかはっきりしました^^
この undef $/; っていうのはどのような意味があるんですか?
あとこれの効果を一時的なものする(効果を打ち消す)ことってできませんか?
587名無しさん:2001/02/21(水) 01:00
>>582

有り難う御座います。
出来ました。
ちなみに ); は付け忘れではなく
省略しただけです・・・。
588名無しさん:2001/02/21(水) 03:32
>>586
man perlvar
(perldoc perlvar)

{ local $/; ... }
589551:2001/02/21(水) 09:30
誰か書けや
590名無しさん:2001/02/21(水) 22:50
sendmailの質問なんですが、
複数の相手にまとめてメールを送りたいのですが、どのようにすればいいのでしょうか。
print MAIL "To: $mailto\n";
の部分で$mailtoの中身を何らかの記号で繋げた複数のメールアドレスに
すればいいのかな・・・?ですがその記号がわかりません(泣)
591名無しさん:2001/02/22(木) 00:18
@`
592むぎ茶:2001/02/22(木) 00:54
#$%T&'())O=}*
593電動ナナシ:2001/02/22(木) 01:57
送る相手が決まっているなら /etc/aliases に定義してそのエイリアスに送れば
よろしい。

決まっていないなら、メールの文章を組み立てるときに、メールヘッダーの "To:" に
送信したい相手のアドレスをカンマ区切りで書いて sendmail -t で送ればよろしい。

To: に残ると困るなら "sendmail hoge1@hoge hoge2@hoge ..." とスペース区切りで
続けて標準入力からメール本文を渡してやればよろしい。
594名無しさん:2001/02/22(木) 02:25
httpdのログから転送量を知りたいんですが、
どうやれば良いんでしょうか。
教えて下さい。
595名無しさん:2001/02/22(木) 02:27
httpdのログからでは無理だと思いますが・・・
596名無しさん:2001/02/22(木) 02:35
え、でも、webalizerとかって計測してるじゃないですか。
597AyuMoe(JAPU):2001/02/22(木) 02:45
#! /usr/bin/perl -w

$total = 0;
while(<>) {
my($bytes) = /\S+\s+\S+\s+\S+\s+\[.+?\]\s+".+?"\s\S+\s+(\S+)/;
next if($bytes eq "-");
$total += $bytes;
}
print "$total\n";

__END__
598サゲ茶漬け:2001/02/22(木) 07:49
>>594
Apache なら conf/httpd.conf でアクセスログの書式を調べようね。
というか analog を使うと便利☆
599きりくる:2001/02/22(木) 11:06
初心者というより、設置するくらいしか出来ないのですが、質問です。
freewebにスペースをかりてDBがわりに人工無能を動かしてみましたら
データ蓄積1000件目で動かなくなりました。
そこで他に良いレンタルスペースはありませんでしょうか。
そのうちデータ件数は1万くらいになると想うので重くても動くところを探しています。
条件としては、本業でやってるわけではないので無料〜月1000円くらいまで
または、プロバイダーもやっていて、ついでに安くスペースも貸している
ようなところがいいです。

サーバーのトピックスに書き込もうと想いましたがちょっと低レベルな質問なので初心者に書き込んでみました。
トビずれだったらすいません
600名無しさん:2001/02/22(木) 11:27
>>599
perlの質問じゃないだろ・・。
あんまデカイデータしょぼいプログラムで動かされたら
同じサーバ使ってる人かわいそうだぞ。
サーバのスレに逝ってくれ。
まあ、そんなもんレンタルで動かすの止めろ
って言われるのがオチじゃない?
601名無しさん:2001/02/22(木) 14:27
カウンターの事で質問なのですが、
毎日のアクセス数(日付も)を./logディレクトリに
新規ファイルを作成して入れておく
って事はどうすればできるのでしょうか?
Perlの本買ったりして、色々調べたのですが分かりません。

よろしくお願いします
602質問させて:2001/02/22(木) 14:36
use Socket;
$smtpserver = "×××.×××.×××.×××";

sub connect{
socket(SMTP@`PF_INET@`SOCK_STREAM@`getprotobyname('tcp'));
$smtp_port = (getservbyname('SMTP'@`'tcp'));
$sin = sockaddr_in($smtp_port@`inet_aton("$smtpserver"));
unless(connect(SMTP@`$sin)){エラー処理;}
select(SMTP)@`$|=1;
select(STDOUT);
}
って言うサブルーチンを作ってローカルで実行すると問題なく実行できるんですが
サーバにあげて動かしてみるとどうしても上手くうごきません。
なにがなんだかお手上げです。すみませんアドバイスよろしくおねがいします。
603質問させて:2001/02/22(木) 14:58
602です。付け加えるとエラー処理でとまっちゃいます。
用はサーバに接続できませんでした。ってなっちゃいます。
でもローカルではやれるので原因が不明です。
604名無しさん:2001/02/22(木) 15:15
Socketが無いから。
605名無しさん:2001/02/22(木) 15:25
>>602
Scoketモジュールが使用可能か聞いてみたほうがいい。
606名無しさん:2001/02/22(木) 15:44
>>601
logディレクトリに新規ファイルを作って保存。
ファイルの保存ができればできる。
何がわからんのかわからん。
607名無しさん:2001/02/22(木) 15:55
Perlのバージョンによる違いがわかるページってありますか?
qr// とか $coderef->( args ); とか EXPR foreach LIST; とか、
Programming Perlに書いてないのはいつのバージョンから使えるのか、
色々解らないので…。

5.004のドキュメント、5.005のドキュメント…はあるんですが、
これをひとつひとつ見るしかないでしょうかね。
608水もみ:2001/02/22(木) 16:00
>604さん605さんさっそくのレスありがとうございます。
それがちゃんとあるんですよ。
preldoc -l Scoketで調べるとちゃんとインストールされて、利用可能
なんです。
609名無しさん:2001/02/22(木) 16:17
原因不明エラーじゃなくて、「エラー処理」という所には正常に行くんだよね?
外部へのconnectを禁止しているんじゃ?
610名無しさん:2001/02/22(木) 16:36
>>606
count.logを作ってりたいんです。
その中に、
年/月/日/カウント数
2001/02/19<>264<>
2001/02/20<>248<>
2001/02/21<>270<>
みたいな感じにしたいんです。どうすればいいですか?
611水もみ:2001/02/22(木) 17:28
>609さん
はい!エラー処理には行きます。
外部へのconnect禁止・・・って事はサーバ自体の問題って事になりますよね?
サーバは先輩が立ててファイヤーウォールとしてつかっててあとアパッチでwebサーバ
立ててるんですけど。どうやって外部とのconnectをとればいいかなんてのは
立てた人じゃないとわからないですよね??先輩にがっくりです(T-T)
612名無しさん:2001/02/22(木) 21:15
590です。
電動ナナシさんに教えていただいた方法で上手くいきました。
ありがとうございました( ^.^)( -.-)( _ _)
613名無しさん:2001/02/22(木) 21:40
ソフトウェア割り込みはPerlで出来るのですか?
Signal関数って用意されていないですよね。
プロセス間で同期を取るにはどうすればよろしいのでしょうか?
614AyuMoe(JAPU):2001/02/22(木) 22:28
%SIG

man perlvar
perldoc perlvar
615名無しさん:2001/02/23(金) 00:07
出来るみたいですね。
色々調べてみます。

ありがとうございました。
616名無しさん:2001/02/23(金) 00:58
age
617名無しさん:2001/02/23(金) 01:00
>>607
それぞれのバージョンの perl の Changelog に、
変更は書いてあるんでは?
618名無しさん:2001/02/23(金) 01:08
man (perldoc) perldelta
man (perldoc) perldeltaX.XXX
619607:2001/02/23(金) 02:34
いや、一覧のような形でわかるページが無いかなと思ったのです。ざっと見たの
ですが、$coderef->( ) がいつからなのかわからなくて…。
やっぱりきちんと全部読みますです。

ところで、サーバ業者とかの間で5.005はほぼ普及してるとみていいんでしょうかねえ。
CGIバラまくなら 5.003 までにしとかないと、使えないところが大量に出たりするのかな。
qr// が使えたらどんなにいいか…。
620AyuMoe(JAPU):2001/02/23(金) 03:43
perl 5.005が出てもう (たしか) 2年くらいたっているから気にしなくて良い説。
621________________________________________:2001/02/23(金) 06:13
カレントディレクトリの取得とかは知ってるけど、NTでどんなドライブがあるか
知りたいときはどうすんの?フロッピードライブがどこか取得するとかさあ。
622名無しさん :2001/02/23(金) 06:20
CマガにPerl期末試験(だったか?)とか載ってたが、やった奴いるか?
623_gunzip:2001/02/23(金) 06:47
>>621
#!/usr/bin/perl -w

use Win32API::File qw[:Func :DRIVE_];

@drives = getLogicalDrives();
foreach(@drives){
&nbsp;&nbsp;&nbsp;&nbsp;if(GetDriveType($_) == DRIVE_REMOVABLE){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "floppy diskette drive found :$_\n";
&nbsp;&nbsp;&nbsp;&nbsp;}
}

>>622
やったよ。立ち読みで。ただ、
while(<>){} と while(defined($_ = <>)){} の相違点を述べよ、と言われてもねえ。
5.005以降では、どちらも同様の振る舞いをするようになったのだが・・・・
(例えば、最終行が改行無しの0でもちゃんと読んでくれる)
んー知っていて出題しているのかなあ
#↑皮肉ではなく
624617:2001/02/23(金) 09:07
>>619
自分の経験から、Y2K 対応でサーバー作り直してれば、5.005_03 に
なってると思う。ただ、5.004_04 とはバイナリ互換でないんで、
わざわざこっちを残してるとこがあっても不思議ではない。

バージョン間の違いに関しては、確かにその通り。ゴメン。ラクダ本
のリファレンスにも書いて欲しいね
625624=617:2001/02/23(金) 09:10
作り直してれば、5.005_03 に
   ↓
作り直してれば、「少なくとも」5.005_03 に
626名無しさん:2001/02/23(金) 14:11
webサーバとsendmailを利用できるmailサーバを別PCで立てた場合
webサーバにsendmailのCGIをおいてそのCGIを実行するとsendmailで
mailが送れるって言うシステムを作ろうとしてるんですが、この場合って
socketか何か使ってwebサーバからmailサーバの方に接続かけないといけないのかな?
ネットワーク自体は同じグループ内にいるんですが・・・・
ってここで質問することじゃないかもしれないんですけど、わかる方いましたら
よろしくお願いいたします。
627名無しさん:2001/02/23(金) 15:03
アクセスログのCGIを置いたら日付が無茶苦茶なんです。
海外のサーバーだからあっちの日付に設定してあるからなの
でしょうか?
対処方法はあるのでしょうか?よろしくお願いします。
628名無しさん:2001/02/23(金) 15:10
>>627
timeを使ってる所を

time+(ずれてる時間)
すれば問題なし。

例2時間ずれている場合
time+(2*60*60)
629627:2001/02/23(金) 16:44
>>628
レスありがとうございます。
timeを使っている所とはどういう意味なんでしょうか?
plファイルのプログラムには見あたらないのですが、どうしたら
いいのでしょうか?
630名無しさん:2001/02/23(金) 17:09
#!/usr/local/bin/perl
$text = "あいうえおタチツテト";

if ($text =~ /タ/) {
print "タ";
}

これだとマッチングしてくれません。
"タ"の文字コードに 0x5E '^' が入っているために
マッチングがうまくできないのだと思います。

これを回避する方法があったら教えてください。

index($text@` "タ")

ならうまくいくんですけどね。
631名無しさん:2001/02/23(金) 17:47
>>629
localtime()使ってるなら
localtime(time+(2*60*60))
こんな感じかな。
632名無しさん:2001/02/23(金) 18:21
練習を兼ねてFreeWebでmegabbsのあめぞう型
掲示板をアップして練習してて気が済んだから
消そうと思ってFFFTPで削除しようとしたら
なぜかいくつかのディレクトリとその中のファイル
などが消せません!!!どうしたらいいのでしょう?
教えてください。
633名無しさん:2001/02/23(金) 18:31
>>632
多分掲示板を動作させる事で、作成されたファイルがあって
それの所有者が15になってるから削除できないんだと思ふ。
634名無しさん:2001/02/23(金) 18:32
>>632

3  弐ch編者  2001/01/28(Sun) 04:09

Q、「つーかもうこの掲示板つかわないから削除しようと
  おもったけどFTPから削除できねーじゃなーかゴルァ!」
A、「管理室の”BBS運営を終了する。 ”を実行してください。
  このCGI関係のファイル・フォルダ全部消えます。」

http://www.megabbs.com/cgi-bin/readres.cgi?bo=haihu&vi=980478478&res=3
635名無しさん:2001/02/23(金) 18:38
>>633−634
既出だったんですね。。すいません。。
フォルダの名前とか変えたり消せれるのは消したり
下から、また一からやり直さないといけないのか・・・。
こんなの入れるんじゃなかった。。vedaやろうと思ってたのに。。
636_gunzip:2001/02/23(金) 19:24
>>630
----------------------------
#!/usr/bin/perl -w
$text = "あいうえおタチツテト";
$pattern = quotemeta "タ";
if ($text =~ /$pattern/o) {
print "タ";
}
----------------------------
#!/usr/bin/perl -w
$text = "あいうえおタチツテト";
if ($text =~ /\Qタ\E/) {
print "タ";
}
----------------------------
637名無しさん:2001/02/23(金) 20:15
>>631
ついでにgmtime()に書き替えた方が良いと思うぞ。
638名無しさん:2001/02/23(金) 21:05
ディレクトリに入っているファイルをディレクトリごと全部コピーすることってできますか?
データディレクトリの内容を一定時間ごとにバックアップするプログラムを組みたいのですが・・・。
639_gunzip:2001/02/23(金) 22:01
>>638
cron & cp -r
640名無しさん:2001/02/23(金) 22:30
AnyDBM_Fileの意味(使い方)が分かりません。
プログラミングPerlを読んでも何が何やら…
AnyDBM_Fileとは一体何をする物なのでしょうか?
641629:2001/02/23(金) 22:41
>>631
>>637
レスありがとうございます。僕が使っているそのアクセス解析
はものすごくシンプルなんです。ですからそのlocaltime()
とかgmtime()と言うプログラムは組み込まれてない?みたいなんです。
(僕の予想ですが・・)色々調べたのですがやはりだめみたいです。
あきらめます。レスありがとうございました!
642名無しさん:2001/02/23(金) 22:56
とほほカウンター(wakusei.cplaza.ne.jp/twn/wwwcount.htm)
をSSIを使ってリンク元をJavaScriptを使わずに取得、記録は
どうすればできるのでしょうか?
643607:2001/02/23(金) 23:09
>>620@`624
どもです。気にせず 5.005 を念頭にやることにします。
これで空パターンから脱却できる…。


$coderef->() は起きたてにきちんと見たら 5.004 にすぐに見つかりました。
氏。
644名無しさん:2001/02/23(金) 23:44
ローカルでCGIの動作確認や修正が出来るソフトでは
どういうのがあるのでしょうか?っていうかあるのでしょうか?
645名無しさん:2001/02/23(金) 23:49
>>644
使用OS & 言語による
646名無しさん:2001/02/23(金) 23:53
>>645
ああ、そうですね。すいません。
Win2000でPerlでお願いします。
647名無しさん:2001/02/24(土) 01:31
VMware for Windows 2000 + UNIX + Apache
648名無しさん:2001/02/24(土) 01:48
>>639
勉強不足ですみません。cronもcpもリファレンスに載っていなくて・・・
具体的にどうすれば良いのかがよくわからないです・・・。
649名無しさん:2001/02/24(土) 07:00
>>648
PerlではなくてUnix系のコマンド
んでcronはともかくcp分からないのは問題だと思う
Unix関係の本立ち読みでもした方が

cronは使えないことも多いからなんとも
650617:2001/02/24(土) 13:26
>>607 = >>643

何とかなりそうで何より
気になるなら、use で perl のバージョンを指定したら如何でしょ?
651_gunzip:2001/02/24(土) 13:27
>>648
cronというのは、決められた時刻になったときに
プログラムを実行するデーモン。 (スケジューラと思えばいいと思うよ。)
cpというのはファイルをコピーするシェルコマンド。
それより、まずUNIXシェルが利用可能かを確かめる方が先。
利用可能で、かつcronもOKなら、man cronを***徹底的に***熟読してください。
下手な事をやると負荷が・・・・ひぃ

また、cron以外では、ファイルを丸ごとコピーするプログラムを書いて
自分のマシンの定期巡回ソフト等で定期的に起動してやるとか・・・

#もしかして、ローカルでの話?
652_gunzip:2001/02/24(土) 13:29
訂正
man cron -> man crontab
653名無しさん:2001/02/24(土) 13:36
>>644
an-httpd でも Apach for win32 でも cgi のテストには充分間に合い
ますが、実機が unix の場合、何も考えずにコーディングしちゃうと、
ファイルを取り扱う際に、path の表記の違いで面倒になることがあります。
面倒でも File::Spec を使っておくと、ちょっとは楽になれるかと。
654みん:2001/02/24(土) 13:46
やりたいのは、自分のサイトの検索で、「見つかったもんを全てリストアップ」
と「大文字小文字を区別せえへん」ちゅうチェックボックスを作ることですが、これってOK?
おしえてん♪
655名無しさん:2001/02/24(土) 13:54
>>648
シェルも cron も使えないけれど、常時接続環境で Web クライアントも
24時間立ち上げておいて構わないのなら、こんな手も

1. とりあえず、ファイルをコピーするプログラムを作る。
 cp -r afo bfo を実行するだけのシェルスクリプトでも可
2. 管理者用のページを作り、META タグで自分自身の reload をさせる
 meta http-equiv="refresh" content="バックアップしたい間隔"
3. そのページで SSI として 1. で作ったスクリプトを起動するよう
指定する
4. きりのいい時間に、そのページにブラウザでアクセス

バックアップの実行結果も確認できてナイス
656_gunzip:2001/02/24(土) 14:26
>>654
いまいち何を言いたいのか分からないが・・・
動的にパターンマッチのオプションを切り替えたいという事か?

#!/usr/bin/perl -w

$str = "Perl PERL perl pErL Perl PeRl";
$pattern = "Perl";
$case = 1;&nbsp;&nbsp;&nbsp;&nbsp;#ignore case?
$global = 1;&nbsp;&nbsp;&nbsp;&nbsp;#global match?

#1.(?imsx) ----&gt;>>> perldoc perlre /(?imsx-imsx) <<<<----
$pattern = join(""@`"(?o" @` $case ? "i" : "" @` $global ? "g" : "" @` ")" @` $pattern);
@matched = $str =~ /($pattern)/;

#2.eval
$option = join(""@`"o" @` $case ? "i" : "" @` $global ? "g" : "");
eval "\@matched = \$str =~ /\$pattern/$option;";

#2.if...elsif
if($case && $global){
&nbsp;&nbsp;&nbsp;&nbsp;@matched = $str =~ /$pattern/ogi;
}elsif($case){
&nbsp;&nbsp;&nbsp;&nbsp;@matched = $str =~ /$pattern/oi;
}elsif($global){
&nbsp;&nbsp;&nbsp;&nbsp;@matched = $str =~ /$pattern/og;
}else{
&nbsp;&nbsp;&nbsp;&nbsp;@matched = $str =~ /($pattern)/o;
}
657みん:2001/02/24(土) 14:56
↑何がなんだかわかりませーん。
あはぁ
658名無しさん:2001/02/24(土) 15:29
タグの書き方知りたいだけなんだろうが
使ってる鯖とかcgiとか検索エンジンの環境書けよ
659みん:2001/02/24(土) 15:35
あーん。
いけずぅ
660名無しさん:2001/02/24(土) 16:21
掲示板のログにxmlを使おうと思ったのですが、
一般的に使われているdtdはありますか?
もしあればuriを呈示して頂きたいのですが…
661名無しさん:2001/02/24(土) 21:08
638です。
一定時間ごとの実現はできている(擬似的にですが)ので、
perlでのやり方をお願いしたいのですが・・・
662名無しさん:2001/02/24(土) 22:33
>>656
へぇ、1みたいなやり方もあるのか。
しらなんだ。
663_gunzip:2001/02/24(土) 22:55
>>661
>perlでのやり方
ファイルのコピーのやり方?
cpが利用できるなら、
$src = "src"; #コピー元
$target = "target"; #コピー先
system("cp -a $src $target") and die $!;
(-a が無いなら-dpR)が一番。
Perlのみで処理しようと思うのなら、File::Copy、File::NCopy
モジュールを調べるといいと思いますよ。
-----
http://www.harukaze.net/~mishima/perl/faq/newbiefaqpgm.html#cmp
http://www.bekknet.ad.jp/~bero/docj/module/10/File_Copy.html
664名無しさん:2001/02/24(土) 23:04
3MBぐらいの容量がアップできるアップローダーって
ありませんでしょうか?音楽をアップしたいんですが
容量が足らなくて3時間くらい探してるんです。
あったら教えて頂けないでしょうか?
665ひろゆき@菅直ノ、:2001/02/24(土) 23:47
ツッコンで見たい年頃なの。あんな所やこんな所に。ナニを。
666名無しさん:2001/02/25(日) 06:35
Perlを勉強して数日の全くの素人なのです。
ええと、学校の宿題なのですが、
javax.swing.html.parser.parse
という文字列を与えられた時に、.で
javax
javax.swing
javax.swing.html
javax.swing.html.parser
javax.swing.html.parser.parse
という形にするサブルーチンを三種類以上で書けといわれたのですが、一種類は自分でできました。
あと二種類以上書かなくてはいけないのですが・・・・その、人が多そうなので
ここにかいたのですが、かまわないでしょうか?
明日までなのですが・・・・
667サゲ茶漬け:2001/02/25(日) 06:41
>>666
書いてミソ。俺Perlは得意じゃないけど。
668_gunzip:2001/02/25(日) 06:44
>>666
$str = "javax.swing.html.parser.parse";

print $` @` "\n" while($str =~ /\.|$/g);

これはもう思いついたかな?
あと、javax.swing.html.parser.parseでなく、javax.swing.html.parser.Parserだとおもふ。
669666:2001/02/25(日) 06:51
こんなやつですが、どうも変です。

#!/usr/bin/perl -w

$string = "javax.swing.html.parser.parse";
@array = split(/\./@`$string);
for($i = 0 ; $i <= $#array ; $i++){
for($j = 0 ; $j <= $i ; $j++){
print $array[$j . "."];
}
print "\n";
}
670666:2001/02/25(日) 06:52
あと、一行目の文字ってなんでしょう?
見よう見まねでつけているのですけど・・・・
671サゲ茶漬け:2001/02/25(日) 06:56
>>669
print $array[$j . "."];
が、
print $array[$j]@` ".";
じゃないのかな?
672666:2001/02/25(日) 06:58
>668
すみません。せっかく書いていただいたのですが、さっぱりです。(?_?)
あ、あとjavax.swing.html.parser.Parserです。ごめんなさい。
>671
そのとおりです。
ですが・・・妙な表示になってしまいます。
どこがおかしいのでしょう・・・
673サゲ茶漬け:2001/02/25(日) 06:59
>>669
というか、命題に忠実に書くなら、
for($j = 0 ; $j < $i ; $j++){
print $array[$j]@` ".";
}
print $array[$j]@` "\n";
の方がいいかもね?
674_gunzip:2001/02/25(日) 07:12
>>666
スライスを用いて、

$str = "javax.swing.html.parser.Parser";
@array = split(/\./@`$str);
print join("."@`@array[0..$i++]) @` "\n" for @array;

こうも書けるけれど、分解→結合であまり好きじゃないなあ。
やっぱり、668に書いた

print $` @` "\n" while($str =~ /\.|$/g);

これが良いと思う。
675666:2001/02/25(日) 07:27
>>673
その通りです!ありがとうございます。
最後に妙な"."がつくので困っていたところでした!
>>674
そんな書き方もあるのですか〜
勉強不足で全然理解できないのですけど、勉強すればきっとそういったものが
すぐに書けるようになるのですね。

ええと、なんかあっというまに三つ揃ったので、これから本を読んでゆっくり勉強します。
本当にありがとうございました。m(_ _)m

676AyuMoe(JAPU):2001/02/25(日) 07:40
ほとんどパズルの世界だな。こりゃ。:-)

# その1
# $_ の中身を破壊します。
$_ = "javax.swing.html.parser.Parser";
s/(?=\.|\z)/print "$`\n"/eg;

# その2
$_ = "javax.swing.html.parser.Parser";
print "$`$1\n" while(/([^.]+)/g);
677AyuMoe(JAPU):2001/02/25(日) 07:42
あ、しまった。その1は s/\.|\z/print "$`\n"/eg; で十分だよな。
678666:2001/02/25(日) 08:15
>676-677
本当にありがとうございます。
理解できるように頑張って勉強します。
青いラクダの絵の本を読んでいますがよく分からない記号ばっかりで大変です。
679&&の人:2001/02/26(月) 14:34
毎回初心者な質問で恐縮です・・・・・

掲示板のコメント内のURLを自動リンクするようにしたくて、
KENTさんのASUKABBSのスクリプトを見ているのですが、

sub auto_link {
$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_top'>$2<\/a>/g;
}


なんだか、このサブルーチンがそうなんじゃないかと思います。
あってるでしょうか(;^_^A

これは
([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)
を、
$1<a href=\"$2\" target='_top'>$2<\/a>
に変えるよ!っていうことですよね?

この中の$1、$2というのを探してみてもどこで定義されてるのかわからなかったのですが、
これは、特に定義しなくても良い変数なのでしょうか?
つまり$_のような、常套句というか慣用句というか、そういうものなのでしょうか?
680&&の人:2001/02/26(月) 15:01
$数字って予約語なんですね。

> $数字とは、最後に行ったパターンマッチの括弧の数に対応したサブパターン。

という説明がありましたが、
なんのことかわかりません ?(゜_。)?(。_゜)?
どういうことなのか、わかるかた教えていただけますか・・・・・
681/bin/名無しさん:2001/02/26(月) 15:25
この例だと

(^=^\"|^)にマッチした部分が $1 に、
(http\:[\w\.\-\/\?\&\=\@\;\#\:\%]+) にマッチした部分が $2 に、
それぞれ入ります。

$str = '111aaa222bbb333';
$str =~ s/(aaa)(222)(bbb)/ $1 $2 $3 /;
print $str; # 結果は '111 aaa 222 bbb 333' になる。

# なんだかなぁ。
682/bin/名無しさん:2001/02/26(月) 15:27
>(^=^\"|^)にマッチした部分が $1 に、

([^=^\"]|^) だった。鬱。
683/bin/名無しさん:2001/02/26(月) 15:42
それにしてもこんなので動くのか・・・?
684名無しさん:2001/02/26(月) 18:34
CGIを起動されたら、FTPサーバーにリダイレクトしたいんですが、
IEが上手くFTPモード(?)になってくれず、
接続できません。

Location: ftp://...
ヘッダを返すだけではだめなのでしょうか。
685&&の人:2001/02/26(月) 18:41
>>681-682
ああ、なんだか難しいんですね(そんなことないですか?)
お返事ありがとうございました。
とにかくいろいろやってみます。m(_ _)m
686名無しさん:2001/02/26(月) 20:40
テキストファイルの行数を表示するCGIが欲しいです。
お願いします。
687AyuMoe(JAPU):2001/02/26(月) 21:53
#! /bin/sh

echo "Content-Type: text/plain"
echo ""
wc -l FILE
688686:2001/02/26(月) 22:12
JAPUさんありがとう。出来ました。
689なんで君:2001/02/26(月) 22:45
人が集まる掲示板が欲しいです。
お願いします。
690名無しさん:2001/02/26(月) 23:35
>>689
ここに掲示板のURL書け。
たったそれだけでどんな掲示板でも
人が集まるようになります。
騙されたと思ってやってみ。
691:2001/02/26(月) 23:57
騙されたと思ってやってみたら
案の定騙されます。

騙されたと思ってやってみ。
692すら:2001/02/27(火) 00:19
オらのスライムブリーダーがマジでうごかねぇっ好けどどうすればいいんかいな
693なんで君 :2001/02/27(火) 00:21
694名無しさん:2001/02/27(火) 13:54
他人が書いたソースの仕様書を作りたいんですけど
いいソフトあります?

有料/無料は問いません
695波平:2001/02/27(火) 13:56
http://eccentric.virtualave.net/cgi-bin/up2/data/180.txt
なぜかユーザーデータが重複して書き込まれ、データファイルが1晩で
10MBくらいになり、レンタルWebスペース先からアカウント停止を
食らう羽目になってます…(´Д`;)
http://www.area-s.com/main/pet.html
ここで配布してたものにほんのちょっとだけ手を加えただけなんですが…
この「重複して追加書き込み」をさせないようにするにはどうしたらいいんでしょうか?
696_gunzip:2001/02/27(火) 14:49
>>695
んーっと、少し見ただけだが、
76c76
< $samename = 0;
---
> $samename = 1;
もしかして、この辺りが原因かも。
$samename = 0;
に戻したらどうなる?
697波平:2001/02/27(火) 14:53
>>696
ちょっとやってみますですヽ(´ー`)ノ
698_gunzip:2001/02/27(火) 14:54
84c84
< $voice = 1;
---
> $voice = 0;
88c88
< $playtime = 1;
---
> $playtime = 0;
90c90
< $playminute = 0; # 例:0分
---
> $playminute = 5; # 例:0分
93c93
< $comeback = 1; # ペットを一回外に出すと何時間したら戻ってくるか。
---
> $comeback = 0; # ペットを一回外に出すと何時間したら戻ってくるか。

とりあえず、この辺りを元に戻した方がいいような。
他の部分の変更は関係なし。
699_gunzip:2001/02/27(火) 14:59
↑のうち、↓これはどう考えても関係なし。(スマソ)
84c84
< $voice = 1;
---
> $voice = 0;
700波平:2001/02/27(火) 15:01
>>696
…アンマリ変わんなかったです(´Д`;)
どんどんデータ量が膨れ上がっていきました…
701波平:2001/02/27(火) 15:04
>>698
やっぱりそこいじらないとダメですか(´Д`;)
最初30分ごとになっていて、それは長すぎるといわれたんです。
特に外出時間が長いので(最短で1時間)もっと短くしたいんですが…
702波平:2001/02/27(火) 15:12
でもまぁ戻したら元通りになりましたですヽ(´ー`)ノ
ありがとうございましたヽ(´ー`)ノ
703_gunzip:2001/02/27(火) 15:17
いや、えーと、本当に数分見ただけなので全貌がいまいちなのだが、
外出時間を変更したければ、
492 if ($out == 1 && (time - $outdate) < $dayhour[$comeback]) {
の$dayhour[$comeback]を、好きな時間(秒単位)に変更したらいいのでは?
$comeback = 0だと、$dayhour[$comeback] = 0 になるから、0秒で戻ってくる
事になるような気がするのだが・・・
で、例えば外出時間を10分にしたければ10*60 = 600をそこにセットすればいいのでは?
492 if ($out == 1 && (time - $outdate) < 600) {
704波平:2001/02/27(火) 15:17
ええと何度もすいません。
・モナーが好きな人ベスト5
・モナーが嫌いな人ワースト5
だけをランキングで表示させるにはどうしたらいいですか?
全部読み込むから負荷がかかるのなら、ちょっとだけしか取らなきゃいいと思ったのですが…
705波平:2001/02/27(火) 15:28
ああそっか…$dayhourで固定されてると思い込んでました(´Д`;)
元で指定してやれば何の問題もないですね(´Д`;)
706_gunzip:2001/02/27(火) 15:31
とりあえず、>>703を試してみて。
$comebackは他所で使われていないから削除しても良し。
このCGIは全く使った事がないから、ランキングとかはパス。(・・・すまぬ)

# よく考えたら仕事中だし・・・ヽ(´ー`)ノ
707弐ch編者:2001/02/27(火) 15:38
>>705
えへえへ
pet.cgiの764〜772

print "$font2$petnameがなついている人は</font><br>";
if ($lovenum == 0) { print "いません<br>"; }
else { foreach $owner (@lovelist) { if($likecount > 4){last }$likecount++;print "$likecount位$ownerさん<br>\n"; } }
print "<br>\n";

print "$font2$petnameが嫌いな人は</font><br>";
if ($hatenum == 0) { print "いません<br>";}
else { foreach $owner (@hatelist) { if($kiraicount >4){last} $kiraicount++;print "$kiraicount位$ownerさん<br>\n"; } }
print "<br>\n";
にかえたらどうでしょ?
つか動作確認してません(笑
これからしてみます。
あ、、っていうか記録するときに5人までにすればこんな
強引そうなことしなくていいのか。
そっちのほうもみてみよーっと。
708弐ch編者:2001/02/27(火) 15:41
>>705
とゆーか
よくみたらこれランキングとかじゃないっすねー(^_^;
単に古い人から5人表示してるだけだ、、、
うーむ。
とゆーか値があるのかどうかも不明、、、
ちと探ってきます。。。。
709弐ch編者:2001/02/27(火) 15:46
あー値らしきものはあったあった、、、

ああ<>1111<>983256003<>6<>
これでいう6な。
タブソ。
ふう、、、
710波平:2001/02/27(火) 15:52
>>709
それそれヽ(´ー`)ノ
711波平:2001/02/27(火) 15:53
>>706
ありがとうございます。どうやら上手く動いてる気配ですヽ(´ー`)ノ
712弐ch編者:2001/02/27(火) 15:55
あーわかってきたかも。
999〜1012を

if ($_[0] eq 'ownerlist') {
if ($love >= $loved) {
@lovelist[$lovenum] = "$love_$name";
$lovenum++;
if ($bestlove < $love)
{ $bestowner = "$name"; $bestlove = $love; }
} elsif ($love <= $disliked) {
@hatelist[$hatenum] = "$love_$name";
$hatenum++;
} else {
@otherlist[$othernum] = "$name";
$othernum++;
}
}

のようにする
んでもってさっきもだした764〜772を
print "$font2$petnameがなついている人は</font><br>";
if ($lovenum == 0) { print "いません<br>"; }
else { foreach (sort {$b <=> $a} @lovelist) { if($likecount > 4){last }$owner=(split/<>/)[1];$likecount++;print "$likecount位$ownerさん<br>\n"; } }
print "<br>\n";

print "$font2$petnameが嫌いな人は</font><br>";
if ($hatenum == 0) { print "いません<br>";}
else { foreach (sort {$a <=> $b}@hatelist) { if($kiraicount >4){last} $kiraicount++;$owner=(split/<>/)[1];print "$kiraicount位$ownerさん<br>\n"; } }
print "<br>\n";
にする
すこしだけ動作テストしました
713弐ch編者:2001/02/27(火) 15:56
>>711
おれのもためせゴルァー!
仕事中にペットCGIなんぞ見てたおれの努力は、、、(;Д;
(ってそんな努力でもなかったが、、、
714弐ch編者:2001/02/27(火) 15:57
>>711
結局まとめは>>712
行数とかもしかしたらイヂてるならかわってるかもだけど
だいたいわかるよね?(^_^;
715_gunzip:2001/02/27(火) 15:57
実現しようとするなら、やはり、1000行目の
@lovelist[$lovenum] = "$name";
この辺りを、(@はxxx)
$lovelist[$lovenum] = [$name@`$love];
とでもして、
foreach ((sort {$b->[1] <=> $a->[1] } @lovelist)[0..4]){
....
}
とするのがいいだろうな・・・
716弐ch編者:2001/02/27(火) 15:57
>>131
えと、ちゃんとランキング式にしたのを
向こうにかいといたんで
みといてねー
717_gunzip:2001/02/27(火) 15:59
ふにゃ
かぶったなあ。
しかし、"$love_$name"のような文字列をソートして良いのかなあ。
718弐ch編者:2001/02/27(火) 15:59
>>715
あ、やぱそっちのほうがいいですか、、、
なんか707で先にあんなもんかいたんで
めんどくて(^_^;

>>716
スレ板違い(^_^;
719弐ch編者:2001/02/27(火) 16:02
>>717
あ、あんなソートだめっすか?
とゆーか718もわけわかんないこといってますね。
なんか頭くるくるパーの
BBS管理者がいたと思っといてください(;Д;


P.S.
 なぜか$love_$nameのままになってる、、、
本当はすこしみればわかるだろうけど
$love<>$nameです>>波兵さん
720_gunzip:2001/02/27(火) 16:09
998行目からのコードを見ると、(@をつけてスライスを使ってるし・・・ミスだろうが)
上位、下位5人ずつのランキングを実現しようとすると、
人数が10人以下の場合変になるから、少し大きく書き直さないといけないような・・・
(↑自分の言っているコト意味不明・・・)
#仕事仕事っと。
721弐ch編者:2001/02/27(火) 16:14
とゆーかとゆーか
ランキングやっちゃったら
それ以外の人ってのは意味あるのかね
722弐ch編者:2001/02/27(火) 16:15
とゆーかたしかにいろいろ問題はのこります。。。
同順の場合。10人以下の場合。
メンド、、、
723名無しさん:2001/02/27(火) 16:21
Perlの質問ではなく文字コードの質問なのでスレ違いかもしれませんが、

シフトJISで書いたスクリプト(掲示板)を
そのままアップロードして使っていますが、
特に文字化けはしません。

EUCに変換しないとマズイという話を聞き、ちょっと不安になっています。

シフトJISのままでも文字化けしないというのは、
なにかが異常なのでしょうか?
724_gunzip:2001/02/27(火) 16:23
998-1011を、
if($_[0] eq 'ownerlist'){
push(@lovelist@`[$name@`$love]);
}

758-775を、
@lovelist = sort {$b->[1] <=> $a->[1] } @lovelist;

print "$font2$petnameがなついている人TOP5は</font><br>";
if($#lovelist < 1){
print "いません<br>\n";
}else{
my $i = 0;
foreach(@lovelist){
last if $i++ > 5;
print $_->[0] @` "さんです<br>\n";
}
print "<br>\n";
}

print "$font2$petnameが逝ってよしな人TOP5は</font><br>";
if($#lovelist < 1){
print "いません<br>\n";
}else{
my $i = 0;
foreach(reverse @lovelist){#手抜き(笑)
last if $i++ > 5;
print $_->[0] @` "さんです<br>\n";
}
print "<br>\n";
}

これでどう?(まったく確認していないが・・・)
試す前に***必ず***バックアップを取ってくれ。
725波平:2001/02/27(火) 16:24
そのランキングをやってみましたがなんか変だったです(´Д`;)
自分でももうちょっと考えてみます…
726_gunzip:2001/02/27(火) 16:24
訂正
$#lovelist < 1
は、
$#lovelist < 0
の間違い。(二カ所訂正してくれ。)
727波平:2001/02/27(火) 16:26
あ、>>725はにへん君へのレスです(´Д`;)
でもありがとう。

>>724の方法で再チャレンジですヽ(´ー`)ノ
_gunzipさん、お世話かけます…
728弐ch編者:2001/02/27(火) 16:29
>>727
ひでぇ(^_^;
ちゃんと $love<>$nameに修正したですか?(^_^;

まぁ_gunzipさんのほうがいいから
そっちにしてくれ(;Д;
729弐ch編者:2001/02/27(火) 16:29
波兵さんとこ10人以上だし
一応はちゃんと動くはずなのにーーー(^_^;
730波平:2001/02/27(火) 16:38
>>728
うん、なんか嫌いな人が1位って表示されるだけだったよ(´Д`;)
つーかモナーのデータ入れ替えると(新しい代のペットになると)
飼い主データもリセットされるから動かなかったのかも…

>>724の方法で上手くいったみたいですヽ(´ー`)ノヽ(´ー`)ノヽ(´ー`)ノ
お手数かけました。
今度から自分で組めるように努力いたします…。
731弐ch編者:2001/02/27(火) 16:43
ちっ、、、
波平さんに恩を売ることはできなかったか
732_gunzip:2001/02/27(火) 16:44
>>730
ああ、それは良かった。ヽ(´ー`)ノ
これからも頑張ってください。

#では、真面目に仕事します・・・
733名無しさん:2001/02/28(水) 00:42
LWP::Simple
を使いたいがため、初めてモジュールをインストールしたんですが、

$ wget http://www.cpan.org/authors/id/RSE/lcwa-1.0.0.tar.gz
$ tar xvfz lcwa-1.0.0.tar.gz
$ cd lcwa-1.0.0
$ ./configure
$ make
$ su
# make install

でインストールしたら、
/usr/local/lib/lcwa/perl/lib/site_perl/LWP
にインストールされました。
/usr/local/lib/perl5/site_perl/5.6.0/LWP

/usr/local/lib/perl5/site_perl/LWP

にインストールしたいのですが、どうすればいいでしょうか?
よろしくお願いします。
734名無しさん:2001/02/28(水) 02:07
age
735名無しさん:2001/02/28(水) 02:33
>>723
>EUCに変換しないとマズイという話を聞き、ちょっと不安になっています。

なんでマズイの?
736名無しさん:2001/02/28(水) 03:34
638です。いろいろ教えていただいてありがとうございます。勉強になります。
で、ディレクトリのコピーを以下のように書いたのですが、

use File::Copy;
copydir("./basedir"@`"./bakupdir");

なぜかサーバーエラーになってしまいます。これってどこが間違っているのでしょうか?
なお通常のファイルのcopy()はきちんと動作しました。
737名無しさん:2001/02/28(水) 08:09
>>735
サーバーの文字コードがEUCだから、それに合わせないとマズイという話でした。
738_gunzip:2001/02/28(水) 09:38
>>736
とりあえず、ローカルで
#!/usr/bin/perl -w
use File::Copy;
eval{
copydir("src"@`"to");
}
print $@ if $@ ne "";
を実行して、出てくるエラーメッセージを確認した方がいいと思う。
自分の推測では
Undefined subroutine &main::copydir called at xxx line x.
だと思うがなあ。しかし、copydirはドキュメントにはあるが、
ソースを見ても何処にも定義されていないみたいだが・・・(妙だ)
(ActivePerl5.6 Build622)
ところであまり関係ないが、ログの入ったディレクトリはサブディレクトリを持つの?
739名無しさん:2001/02/28(水) 10:59
>>733
とりあえず README とINSTALL は読んだ?
perl モジュールのインストールは普通
  % perl Makefile.PL
  % make
  % make test
  # make install
の順では無かったっけ?
LWP::Simple だけ違うのかもしれないけど...
740名無しさん:2001/02/28(水) 12:53
二次元以上の連装配列を関数の返り値として受け取りたいんですが
$a{'bbb'}{'ccc'}
の返り値を
return %a とすれば問題なく渡せるのでしょうか?
仮に関数側で %a をローカルで宣言した場合にデータ構造
どうなってるのかわからないので心配なのです。
もしよろしければ教えてください。

->との違いもよくわかってませんで…
741/bin/名無しさん:2001/02/28(水) 13:10
sub a {
my(%a);
$a{bbb}{ccc} = 'abc';
return %a;
}

sub b {
my($b);
$b->{bbb}{ccc} = '123';
return $b;
}

%x = &a;
$y = &b;
print "$x{bbb}{ccc}\n";
print "$y->{bbb}{ccc}\n";

# この例でいいのかどうかわからんけど、とりあえず試すことから。
742_gunzip:2001/02/28(水) 13:17
>>733
$prefix/lib/perl5/site_perl/
以下にディレクトリ階層を保ったままコピー(移動)させてやるだけで良いのでは?
つまり、例えば
cp -a /usr/local/lib/lcwa/perl/lib/site_perl/ /usr/local/lib/perl5/site_perl/
で良いと思うのだが・・・

もし、どうやっても駄目なら、
1.環境変数"PERL5LIB"にパスを追加設定する。
export PERL5LIB=/usr/local/lib/lcwa/perl/lib/site_perl/

2.スクリプトに
use lib '/usr/local/lib/lcwa/perl/lib/site_perl/';
を記述する。

3.-Iオプションで@INCに追加
perl -I/usr/local/lib/lcwa/perl/lib/site_perl/ hoge.pl
or
スクリプトの冒頭を
#!/usr/local/bin/perl -I/usr/local/lib/lcwa/perl/lib/site_perl/

のような逃げ道もありますが。
743( ´ー`)y~~:2001/02/28(水) 13:35
>>740
返せます。
普通、 $a{'aaa'} が存在する %a を返すと

( 'aaa'@` $a{'aaa'} )

を返したのと同じですが、二次元の連想配列なので $a{'aaa'} の値が、

% = ( 'bbb' => (bbbに対応する値) );

という感じの連想配列へのリファレンスになっているだけの違いです。
744名無しさん:2001/02/28(水) 15:09
>>738
レスありがとうございます。

>ログの入ったディレクトリはサブディレクトリを持つの?
持たないです。ファイルが入ってるだけです。
ただファイルの数が数百〜数千ある上動的に生成されるので、
まとめてコピーしたいんです。

エラーメッセージはこれでよいのかどうか分かりませんが一応、
syntax error at D:\...\test.pl line 6@` near "print"
と出ました・・・。
745_gunzip:2001/02/28(水) 15:15
>744
ごめん。それは僕のミスだ。
eval{}に;が抜けているからSyntax Errorになっているわけ。
746_gunzip:2001/02/28(水) 15:21
サブディレクトリを含まないなら、こんな感じかな。

#!/usr/bin/perl -w

use File::Copy;

$from = "./basedir";
$to = "./backupdir";
opendir(F@`$from) or die "Can't open $from";
foreach(readdir(F)){
&nbsp;&nbsp;&nbsp;&nbsp;next if "$_" eq "." or $_ eq "..";
&nbsp;&nbsp;&nbsp;&nbsp;if(-f "$from/$_"){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy("$from/$_"@`"$to/$_") or die $!;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
closedir(F);
747名無しさん:2001/02/28(水) 15:55
度々すみませんm(__)m
今度はこんなエラーが・・・
No such file or directory at D:\...\backup.cgi line 11.
うーん。。。
748_gunzip:2001/02/28(水) 15:59
それはただ単にコピー先のbackupdirという名のディレクトリがないだけでは・・・
予めバックアップ用のディレクトリは作っておいてくださいな。
749名無しさん:2001/02/28(水) 16:00
すみません。コピー先ディレクトリを作ってないだけでした。
作ったらきちんと動きました。
いやー、動いた瞬間はほんと爽快でした(^_^;)
いろいろとありがとうございました。

したいのですが

$zero = '0';
$zero =~ /(.)./;
$x82 = $1;

while (1) {
print "please KATAKANA Chr \n";
chomp($chr = <STDIN>);

if ($chr =~ /^[\x83]([\x40-\x93])$/) {
local($temp) = $1;
$temp =~ tr/[\x40-\x93]/[\x9F-\xF1]/;
$chr = $x82 . $temp;
}

print "$chr \n\n";
}

↑こうやると、なぜか“ゼ”と“ム”だけは変換できません。
どこがまずいんでしょうか?
751733:2001/02/28(水) 17:24
>>739
READMEにインストール方法かいてなかったし、
INSTALLはありませんでした。

Makefile.Plが無くて、configure があったため、
上記の方法でやりました。

>>742
cp -a /usr/local/lib/lcwa/perl/lib/site_perl/* /usr/local/lib/perl5/site_perl/
でうまくいきました。
ありがとうございました。

1〜3の方法は最終手段と考えていました。
せっかくrootがあるけん、どうせならと…
752750:2001/02/28(水) 19:10
失礼しました。他にもうまくいかないのがありました。
で、こうすると“ゼ”以外はうまくいくみたいです。

$zero = '0';
$zero =~ /(.)./;
$x82 = $1;

while (1) {
print "please KATAKANA Chr \n";
chomp($chr = <STDIN>);

if ($chr =~ /^[\x83]([\x40-\x93])$/) {
local($temp) = $1;
$temp =~ tr/[\x40-\x4F]/[\x9F-\xAE]/;
$temp =~ tr/[\x50-\x7E]/[\xAF-\xDD]/;
$temp =~ tr/[\x80-\x93]/[\xDE-\xF1]/;
$chr = $x82 . $temp;
}

print "$chr \n\n";
}

でも相変わらず“ゼ”だけはダメです。
753nanashi:2001/02/28(水) 19:14
初心者なので他の方のスクリプトを見て勉強させて頂きたい
と思っているのですが、この(人の)スクリプトはとても綺麗、参考にした
方が良いというのありましたら、いくつかご紹介頂けませんでしょうか。
お願い致します。
754名無しさん:2001/02/28(水) 19:41
>>753
KENT(藁
755名無しさん:2001/02/28(水) 20:04
ActivePerlですが、
\x0AでLFのみを出力しようとしてもCR+LFになってしまい
LFのみを出力する事が出来ません。何故でしょうか?
\x0DだとちゃんとCRのみになるようですが…。
756AyuMoe(JAPU):2001/02/28(水) 20:09
>>753
http://yasu.asuka.net/soft/tinybbs.html
これは?

>>755
binmode FILEHANDLE;
757名無しさん:2001/02/28(水) 20:19
>>756
JAPUさん、FTP鯖に繋がらないよ(ρ_;)
758名無しさん:2001/02/28(水) 20:21
>>757
俺は繋がってるが・・・・?
759AyuMoe(JAPU):2001/02/28(水) 20:50
* 適切に逆引きが設定されていない (IPアドレスを逆引き -> 正引きしてその正当性をチェックしています。)
* パスワードとして適切なメールアドレスが入力されていない (MX/A recordをチェックします。Mozilla@@` IExxUSER@ は却下されます。)
760755:2001/02/28(水) 21:28
>>JAPUさん
おお、なるほど…。
Win98はテキストファイルとバイナリファイルを区別するんですね。
助かりました。どうもありがとうございます。
761始めて数日の初心者です:2001/02/28(水) 22:13
メールのヘッダって、(途中でちょん切っています)
Received: from aa.aa.aa.aa (aa.aa.aa.aa [0.0.0.0])
by a.a.a.a.a.a (0.0.0/0.0W) with aaaaa id aaaaa;
aaa@` a a aaaa aa:aa:aa +0900 (JST)
Date: aaa@` a aaa aaaa aa:aa:aa JST
From: aaaaa aaaaa <[email protected]>
Subject: =?ISO-2022-JP?B?xxxxxxxxxxxxxxxxxxxxC?=
To: [email protected]
Reply-To: [email protected]
Posted: aaa@` aa aaa aaa aa:aa:aa +0900
こんな形になってますけど、これを
キー 値
Date => aaa@` a aaa aaaa aa:aa:aa JST
To =>: [email protected]
のような形のハッシュに入れるのは何を使えばいいのでしょう。
またどんな関数を使えばよいのでしょうか。
普通にsplitするとだと、2.3行目が変な具合に宙に浮いてしまうので
どーか教えてください。
762761:2001/02/28(水) 22:21
すみません。761では2@`3行目の冒頭にスペース?がはいっています。
よろしくお願いします。
763AyuMoe(JAPU):2001/02/28(水) 22:30
#! /usr/local/bin/perl -w

while(<>) {
if(1../^$/) {
if(/^\s/) {
$header{$last}[-1] .= $_;
} elsif(my($n@` $f) = /^(.+?):\s*(.*)/s) {
$last = lc $n;
push @{$header{$last}}@` $f;
}
} else {
push @body@` $_;
}
}

foreach $k (keys %header) {
print "*** $k:\n";
foreach (@{$header{$k}}) {
print "$k: $_";
}
}

print "$header{subject}[0]";
print @body;

__END__
764_gunzip:2001/02/28(水) 22:31
>>761-762

#!/usr/bin/perl -w

@header{/^(.+?):\s/} = $' for split /^(?![\t\s])/m@` <<'HEADER';
Received: from aa.aa.aa.aa (aa.aa.aa.aa [0.0.0.0])
by a.a.a.a.a.a (0.0.0/0.0W) with aaaaa id aaaaa;
aaa@` a a aaaa aa:aa:aa +0900 (JST)
Date: aaa@` a aaa aaaa aa:aa:aa JST
From: aaaaa aaaaa <[email protected]>
Subject: =?ISO-2022-JP?B?xxxxxxxxxxxxxxxxxxxxC?=
To: [email protected]
Reply-To: [email protected]
Posted: aaa@` aa aaa aaa aa:aa:aa +0900
HEADER

print "$_ => $header{$_}" for keys %header;
765_gunzip:2001/02/28(水) 22:32
かぶった。ごめんなさい
766_gunzip:2001/02/28(水) 22:37
う・・・しかもよく見たら汚い・・・・すんません。
767名無しさん:2001/02/28(水) 22:46
>>764
761じゃないけど、これって、明らかにsyntax errorになりませんか?
怖くて試してませんが。
ハッシュなのに@つけてるし。
768767:2001/02/28(水) 22:51
ありゃ、ちゃんと期待通り動くね。前言撤回。
でもかなりトリッキーだなあ。
769名無しさん:2001/02/28(水) 23:11
>>767
スライスだょ
770767:2001/02/28(水) 23:41
>>769
にゃるほどね。
あと、ヒアドキュメントってこんな使い道もあるのね。
print文専用かと思ってた。
771750:2001/03/01(木) 00:07
げ、、。もしかしてやっちゃいましたかワタシ、、(^^;;;
772740:2001/03/01(木) 00:53
>>743 これで安心して続けられます。ありがとうございました。
773名無しさん:2001/03/01(木) 04:43
入力が 'a@`b@`c@`d@`e' のとき $hoge{a}{b}{c}{d} = 'e'
のような連想配列を動的に作るにはどうすればいいんでしょうか?

入力は複数来て、たとえば上に加えて 'a@`b@`f@`g' と 'a@`h@`i' が来たら

%hoge = (
&nbsp;&nbsp;a => {
&nbsp;&nbsp;&nbsp;&nbsp;b => {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c => {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d => 'e'@`
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f => 'g'@`
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;h => 'i'@`
&nbsp;&nbsp;}
);

になるようにしたいんですが…。
774名無しさん:2001/03/01(木) 10:26
$in = 'a@`b@`c@`d@`e';
@in = split(/@`/@` $in);
$value = pop(@in);
$list = '$hoge{' . join('}{'@`@in) . '}=$value;';
eval($list);
print $hoge{a}{b}{c}{d};

# 力技だ。。。
775名無しさん:2001/03/01(木) 10:43
$in = 'a@`b@`c@`d@`e';
@in = split(/@`/);
$hoge = pop(@in);
foreach (reverse(@in)) {
$hoge = {$_ => $hoge};
}
print $hoge->{a}{b}{c}{d};

# こっちのほうがスマートか・・・
776名無しさん:2001/03/01(木) 11:18
use constant K => 5;
として定数を宣言した場合、
print K;
は5でOKですけれど、
print K @` "\n";
はファイルハンドルがどうの、というエラーになってしまいます。
どなたか回避法を教えてください。
777_gunzip:2001/03/01(木) 11:24
>>776
#!/usr/bin/perl -w

use constant C => 2;

print "" @` C @` "\n";
or
print C() @` "\n";

何故後者が可能であるかは、constantプラグマの
ソースコード85-98行目をご覧下さい・・・
778_gunzip:2001/03/01(木) 12:00
"@`"ではなく"."を使って
print C . "\n";
とする手もあるわな。
779名無しさん:2001/03/01(木) 15:25
条件演算子について分からないことがあったので質問します。
というか書き方をもっとスマートにできないかなと・・・。
宜しくお願いします。
以下のものなんですけど、もっとスマートにできますかね?

#!/usr/bin/perl -w
print "Input the number: ";
$input = <STDIN>;
$value = ( (not $input == '') ? "Just!\n" : "NO!\n");
print $value;

それから、『not』を『!』に替えるとうまく実行してくれません。
どうしてでしょうか?あと、『数を入力してくれ』の段階でただリターン
を入力すると、意図した結果は得られるのですが以下のようなメッセージ
が出て来ます。どういう意味なのでしょうか?
Argument "" isn't numeric in eq at ./test01.pl line 4@` <STDIN> chunk 1.

宜しくお願いします。
780名無しさん:2001/03/01(木) 15:59
#!/usr/bin/perl -w
print "Input the number: ";
chomp ($input = <STDIN>);
$value = (($input != '') ? "Just!" : "NO!");
print $value@`"\n";

あまり代わらないか…。
781780:2001/03/01(木) 16:00
$input != '' ってなんだ。ウツダシノウ。
$input ne '' ね。
782780:2001/03/01(木) 16:05
ゴメソ。!=で良いのか。初心者がでしゃばるものじゃないね。
783/bin/名無しさん:2001/03/01(木) 16:11
>>779
not と ! の違い以前に、 == と eq の違いとか、$input の中身とか。

print "Input the number: ";
$_ = <STDIN>;
chomp;
$value = /^$|\D/ ? "NO!\n" : "Just!\n";
print $value;
784名無しさん:2001/03/01(木) 19:22
>>773
これでどうだ!うまくいってるが!自分でもいまいち理解不能!

sub aaa {
my ($hashref@` $in) = @_;
my @in = split(/@`/@` $in);
my $val = pop(@in);
my $ref = \$hashref;
foreach (@in) {
$ref = \${$$ref}{$_};
}
$$ref = $val;
}
&aaa(\%hoge@` 'a@`b@`c@`d@`e');
&aaa(\%hoge@` 'a@`b@`f@`g');
&aaa(\%hoge@` 'a@`h@`i');
785( ´ー`)y~~:2001/03/01(木) 19:44
>>779
数値じゃないか0ならNo、それ以外はJustってことでしょうか?

$value = ( $input+0 ) ? "Just!\n" : "NO!\n";

こういうインチキコードはwarning出るしなぁ…。

>『not』を『!』に替えるとうまく実行してくれません。
! $input == '' は ( not $input ) == '' と同じです。
$input の改行を取り除いていないので、not $input は必ず偽であり、
結局 '' == '' と同じことになってしまい、いつも"Just!" になります。

>意図した結果は得られるのですが以下のようなメッセージが出て来ます。
== は数値どうしを比較するものなのに ''(空の文字列)が右側にあるので
"" isn't numeric("" は数値じゃないよ)と警告してくれてます。お節介さん(;´д`)
786名無しさん:2001/03/01(木) 22:31
すみません二つ質問させてください。
1.ハッシュに格納されているキーと値のペアの総数をもとめるにはどうするの?
2.変数をエイリアスするにはどうすればいいの?

2はどちらかというと単なる興味ですので。
ちゅうことでお願いします。__(_ _)__
787786:2001/03/01(木) 22:33
しまった。さげてる〜あげ
788AyuMoe(JAPU):2001/03/01(木) 22:40
$n = scalar keys %hash;
単に
$n = keys %hash;
でも良いが。

$x = "mai";
*y = \$x;
print "$x $y\n";
$y = "ayu";
print "$x $y\n";
789_gunzip:2001/03/01(木) 22:41
>>786
1.
$n = keys %hash;

2.
*a = \$b;
*c = \@d;
*e = \%f;

ex)
#!/usr/bin/perl -w

$hoge = "scalar hoge";
@hoge = ("array@`"hoge"");
%hoge = ("hash" => "hoge");
$foo = "scalar foo";
@foo = ("array"@`"foo"));
%foo = ("hash" => "foo");

*hoge = \@foo;

print "\$hoge@` => $hoge\n";
print "\@hoge@` => @hoge\n";
print "\$hoge{hash}@` => $hoge{hash}\n";

#眠い・・・
790_gunzip:2001/03/01(木) 22:42
>>786
何でこう、かぶるのかにゃあ。
あと、ラクダ本P.59を参考にされると良いと思います。
791_gunzip:2001/03/01(木) 22:48
>>789のtypo修正
#!/usr/bin/perl -w

$hoge = "scalar hoge";
@hoge = ("array"@`"hoge");
%hoge = ("hash" => "hoge");
$foo = "scalar foo";
@foo = ("array"@`"foo");
%foo = ("hash" => "foo");

*hoge = \@foo; #@hogeを@fooのエイリアスに

print "\$hoge => $hoge\n";
print "\@hoge => @hoge\n";
print "\$hoge{hash} => $hoge{hash}\n";

↑結果をよく見て下さい。特に、@hogeが@fooのエイリアスになっているが
他の$hogeや%hogeは全く影響を受けていない、という点に注目してください。


792786:2001/03/01(木) 23:16
>788-791
あっというまに・・・・ありがとう!二方の例を試してみたところよく分かりました!
ラクダ本は持ってませんが、こういう時のためにも必要っぽいですね!
793779:2001/03/01(木) 23:50
>>780
いえ、初心者だからとおっしゃらずこれからもよろしくお
願いします。

>>783
>>$value = /^$|\D/ ? "NO!\n" : "Just!\n";
こういう書き方もあるんですね…。
…勉強してまた出直してきます…。

>>785
警告についての詳細、ありがとうございました。
お答えいただいたみなさんがchompを入れていたのは
そういうわけだったんですね。

ありがとうございました。
794( ´ー`)y~~:2001/03/02(金) 00:08
791で思い出したんですが、
*foo = *bar と *foo = \$bar では微妙に挙動が違うことがありますよね。

-----
$hoge = 'GLOBAL';
*assign_glob = *hoge;
*assign_ref = \$hoge;
*assign_gref = \*hoge;
&local_test();

sub local_test{
&nbsp;&nbsp;local $hoge = 'LOCAL';

&nbsp;&nbsp;print "assign_glob = $assign_glob\n";
&nbsp;&nbsp;print "assign_ref = $assign_ref\n";
&nbsp;&nbsp;print "assign_gref = $assign_gref\n";
}
-----
assign_glob = LOCAL
assign_ref = GLOBAL
assign_gref = LOCAL
-----
*foo = \$bar は完全なエイリアスと信じて苦労したことがあるんですが、
この違いって、どこかに書いてあることなんでしょうか。
ラクダ本しか知らない…
795名無しさん:2001/03/02(金) 00:36
PerlでCみたいな関数の参照渡しってできる?
796AyuMoe(JAPU):2001/03/02(金) 02:05
sub moe { return "ayu" }
sub print_moe { my $sub = shift; print $sub->()@` "\n" }
print_moe(\&moe);

ってこと?
797名無しさん:2001/03/02(金) 21:30
正規表現で検索したいのです。
やりたいことは、各行頭から1つめのTABを検索したいのです。
具体的な記述方法を教えていただけないでしょうか。
お願いします。
798/bin/名無しさん:2001/03/02(金) 21:39
$_ = "123\t456\t789\t0";
$_ =~ /\t/g;
print pos($_);

# 4 と表示される。4文字目が1つめのタブということ。
# なんか気になるがとりあえずほっとく。
799名無しさん:2001/03/03(土) 11:51
こんにちは。
もうかなりお手上げです。どなたか教えてください。
チャットを作っています。
退出ボタンを押したら画面に「ばいばい」と出て終了するようにしたいのですが…

#退出ボタンの部分
print "<form method=POST action=\"chat.cgi\">\n";
print "<input type=hidden name=mode value=taisyutu>";
print "<br><input type=submit value='退出'></form><br><hr>";

(中略・・・・ReadParseで$mode=$in{'mode'};などなど・・・・・)

#退出ボタンを押されたときの処理
    if($mode eq taisyutu){
      print"ばいばい";
      exit;
    }

問題部分だけを書いてみました。どうしてもエラーが出てしまいます。
exit;を書くことがエラーの原因のようなのですが、
この書き方はexitのルールに違反しているのでしょうか?
掲示板を作ったときには
if($comment eq ""){
    print"コメントがありません";
    print"<a href='$cgi'>戻る</a>";
    exit;
}
というようにやってうまくいったので、今回もそうしたいのですが。
なぜうまくいかないのか、ぜんぜんわかりません。アドバイスをお願い致します。
800名無しさん:2001/03/03(土) 12:43
$mode eq taisyutu
$mode eq "taisyutu"
801名無しさん:2001/03/03(土) 13:20
すいませんがハッシュと配列の代入について教えてください。
一次元目がハッシュで、それが参照する先が配列という具合にして
$hash{'key'}[0] のように情報を保持しておいて、
必要に応じて他の一次元配列に代入したいんです。
$data = (
'key0'=>{'a'@`'b'@`'c'}@`
'key1'=>{'d@`e@`f}
);
もしくは 'key0'=>('a'@`'b'@`'c')として
@array = @{$hash{'key0'}}
等のように試してみましたがハッシュとして受け取ることはできましたが
配列として最初に代入した順番でそのまま受け取れませんでした。
多次元配列が可能なのでできるとは思うんですがここの記述方法で詰まってしまいました。
どなたかヒントだけでも教えていただけないでしょうか?
802名無しさん:2001/03/03(土) 13:23
800さん、お返事ありがとう御座います。
ですが、ダメでした(TT)

    if($mode eq taisyutu){
      print"ばいばい";
      exit;
    }

この部分を、
    if($mode eq taisyutu){
      $bgcolor="#ffffff";
    }

こうしてみると、実際に背景色が変わります。
ですからエラーの原因はexitにあるような気がするのですが、ちんぷんかんぷんです。
なんでだろう〜〜
$bgcolor="#ffffff";
↑これがOKなのにexit;がエラーになるって、なんなんでしょう。。。
803名無しさん:2001/03/03(土) 13:29
>802
ヘッダを吐く前にexitさせてるとか?

    if($mode eq 'taisyutu'){
      print "Content-type: text/plain\n\n";
      print"ばいばい";
      exit;
    }
ってしてもエラー出る?
出ないなら終わらせる場所を考えなおした方が良いですよ。
804799=802:2001/03/03(土) 13:49
803さん、レスありがとうございます。
おっしゃるとおり、
print "Content-type: text/plain\n\n";
の前にexitを書いています。
まずいのでしょうか?(汗

そこで、
if($mode eq 'taisyutu'){
      print "Content-type: text/plain\n\n";
      print"ばいばい";
      exit;
}
としてみたところ、
このスクリプト自体(chat.cgi)を「ダウンロードするかい?」と聞かれてしまいました。
あまりに突飛な出来事に、混乱しています。どうなってるのでしょう・・・・
ちなみに、ローカルでアパッチをつかって実験しています。
ああ・・・・
805799=802:2001/03/03(土) 13:55
試しに
  if($mode eq taisyutu){
   print "Content-type: text/plain\n\n";
   print"ばいばい";
#   exit;
}

このようにexitを消してみました。
そして退出ボタンを押してみました。(押すと$modeがtaisyutuになります)

すると、

ばいばいContent-type: text/html

と、表示されました。
「ばいばい」と「Content-type: text/html」の順番が逆ですよね?
どつもにはまっているのでしょうか?
806799=802:2001/03/03(土) 13:56
どつも=ドツボ
807名無しさん:2001/03/03(土) 14:13
>>801
無名配列は[]を使うのだ。

%data = (
'key0'=>['a'@`'b'@`'c']@`
'key1'=>['d'@`'e'@`'f']@`
);
@a = @{$data{'key0'}};
808799=802:2001/03/03(土) 14:13
print "Content-type: text/plain\n\n";

を一つにまとめて、その直後に
  if($mode eq taisyutu){
   print "Content-type: text/plain\n\n";
   print"ばいばい";
   exit;
}

を持ってきたらうまくいきました。お騒がせして申し訳ありませんでした。
print "Content-type: text/plain\n\n";
について、あまり考えないで書いていましたが、
みなさんのアドバイスのおかげで勉強になりました。
レスくださった方々、どうもありがとうございました。
809名無しさん:2001/03/03(土) 14:17
>799=802
明らかにヘッダを出す前にexitさせた為のエラーですね。
ダウンロードになるのは別に問題無いですよ。
エラーが出るか出ないか調べる為に入れてみただけなので。
ダウンロードしたものには「ばいばい」とだけなかったですか?

exitを消した場合の結果は

Content-type: text/plain
ばいばい
Content-type: text/html

の順で流れてるのでtext/plainのデータとして
「ばいばいContent-type:text/html」
と表示されたわけです。

Content-typeを出力する前に終了させるとエラー出します。

ばいばいと出したいだけなら
if($mode eq 'taisyutu'){
print "Content-type: text/html\n\n";
print '<html><body>ばいばい</body></html>';
exit;
}
で大丈夫では。
810809:2001/03/03(土) 14:20
って、解決してるし(。。;;
頑張って下さいね。
811799=802:2001/03/03(土) 14:56
>810さん

>Content-typeを出力する前に終了させるとエラー出します。

はい。勉強になりました。どうもありがとうございました!
812名無しさん:2001/03/04(日) 01:33
受信したメールから相手のアドレスを変数$addressに読み込んで
挨拶を送る単純なプログラムを作ろうとしているのですが
変数に4294967294という数値が読み込まれてしまい困っています。
何が問題なのでしょうか。

#!/usr/bin/perl -w

$sendmail = "/usr/sbin/sendmail";
while(<STDIN>){
if(/^From: /){
$address = $_;
$address = ~s/^From:\s//;
chomp($address);
}
}
open(MAIL@`"|$sendmail \"$address\"") || die("cannot open");
print MAIL "To: $address\n";
print MAIL "From: xxx\@xxx.xx.xx\n";
print MAIL "Subject: Hello\n";
print MAIL "\n";
print MAIL "Hello\n";
close(MAIL);
813AyuMoe(JAPU):2001/03/04(日) 01:43
"= ~" ではなくて、"=~" です。
$address = ~s/^From:\s//;
だと、/^From:\s// (つまり、1) のビット反転をして、$address に代入する
ことになります。

あと、このままだと外部から任意のコマンドを実行可能です。
From: "| ls -lR > /tmp/ls-lR |"
という行がある場合を考えてみて下さい。
814名無しさん:2001/03/04(日) 02:08
AyuMoeさん、ありがとうございます。
見やすいようにスペース入れて書く習慣があったので
気付きませんでした。
外部からのコマンド実行も考えてませんでした。
条件指定がかなり大雑把ですね。
本当にどうもありがとうございます。
815便乗名無しさん:2001/03/04(日) 13:10
文字列中にメールアドレスやURLが入力されたものとして、
これの正当性をチェックするライブラリや関数はあるのでしょうか?
816801:2001/03/05(月) 03:20
>>807
助かりました。これで先に進めます。
配列の添え字としては使うことがありますけどこういうのは気づきませんでした。
ありがとうございました。

>>815
http://www.din.or.jp/~ohzaki/perl.htm
ここの正規表現は参考になるかと。
817ABC:2001/03/05(月) 07:37
こんにちは。

今本を読みながらperlを勉強しているものなんですが、このプログラムを見て思ったのですが、
@ARGVの値($ARGV[?])は文字列として$each_tallに代入されているんですか?
それとも数値として代入されているんでしょうか?実行したところ、文字列として代入されているようなのですが、
何故数値ではなく文字列として代入されるのでしょうか。お手数ですがどなたか教えて下さい。
818ABC:2001/03/05(月) 07:59
すいません、これがプログラムです。

print "平均は" ;

unless ( @ARGV ) {


die "引数が0です" ;

}

foreach $each_tall (@ARGV) {

    $sum += $each_tall ;

}

print $sum / @ARGV ;

print "です。" ;


819ABC:2001/03/05(月) 08:03
あれれ・・・少しおかしいですけど・・・すみません気にしないで下さい(^_^;
とりあえず817の質問の答えが頂ければ幸いです。何度もすみませんでした。
820名無しさん:2001/03/05(月) 08:09
文字列 01 渡したいのに数値にされて 1 になっちゃったら
いやです。
821ABC:2001/03/05(月) 08:35
すみませんが、もう少し詳しく説明していただけませんでしょうか。
822名無しさん:2001/03/05(月) 10:43
何度かこちらでお世話になっているものです。
いつも質問ばかりですみません。。。。

掲示板で、クッキーを使い、前回入力してくれた名前を
次回からも自動的に名前欄に入るようにしたくて、
とりあえず、まず以下のように書いて、クッキーを設定しようとしたところ、

print "Content-type: text/html\n\n";
print"Set-Cookie: ";
print"NAME=$name; ";
print"expires=Monday@` 31-Dec-2001 23:50:59 GMT; ";

実行すると、

Set-Cookie: NAME=; expires=Monday@` 31-Dec-2001 23:50:59 GMT;

という文字が画面の上に出てきてしまいました。
これって失敗ですよね?
でも良く考えたら(初心者なりにではありますが…汗)、
print命令だし、そりゃ画面に出てくるよな〜、と行き詰まってしまいました。
でも本を見たら、こう書いてあるし・・・・・
どこか間違っているのでしょうか?アドバイスを宜しくお願い致します。

823>822:2001/03/05(月) 11:03
最初のprintでヘッダ終わっちゃってますよ
824名無しさん:2001/03/05(月) 13:51
822です。
823さん、ありがとうございます。
そうでした、
本の最初のほうを読み返したら、ヘッダのあとは1行あける(2回改行)で、
\n\nとするんでした・・・・。どうもありがとうございました。
825_gunzip:2001/03/05(月) 22:20
>>794
なるほど。自分はそういった経験はありませんでした。
で、調べてみようと思い20分ほど Devel::Peek でいろいろDump()して、
$hoge の REFCNT や、それぞれの GV が持つGP の REFCNT@`EGV を眺めた感想ですが、
$hoge = 'GLOBAL';
*assign_glob = *hoge;
*assign_ref = \$hoge;
ここまで実行された内部のイメージは、以下のように**なるような気が**します。
#AA書くのは結構面倒なので*かなり*端折ってます。

┌────┐
│ defstash├─┐
└────┘  │
stash(main)   │
┌──────┴────────────┐
│            main              │
├───┬───┬─────┬─────┤
│ main:: │ hoge │ assign_glob │ assign_ref │
└───┴─┬─┴──┬──┴──┬──┘
gv   ┌──┘ gv  ┌┘      gv │
┌──┴──┐┌──┴────┐┌┴──────┐
│main::hoge ││main::assign_glob ││main::assign_ref │
└──┬──┘└──┬────┘└──┬────┘
gp   ├──────┘         gp │
┌──┴─┐svpv┌─────┐    ┌─┴──┐
│ SV    ├─→│"GLOBAL" │←─┤SV    │
├────┤   └─────┘   ├────┤
│ HV    │     0x458290c      │HV    │
├────┤                 ├────┤
|.....以下略                  │.....以下略

(GV assign_glob とGV hoge は同一の GP(hogeのもの)を共有。
GV assign_ref のGPは新たに作られる。)

826_gunzip:2001/03/05(月) 22:20
その後、
local $hoge = 'LOCAL';
によって、stash 内に存在するGV hoge のスカラー値が新たに"LOCAL"に書き変えられ、
以前から存在していた SV の方はフラグ、アドレスと共にsavestackにpushされるので、
┌────┐
│ defstash├─┐
└────┘  │
stash(main)   │
┌──────┴────────────┐
│            main              │
├───┬───┬─────┬─────┤
│ main:: │ hoge │ assign_glob │ assign_ref │
└───┴─┬─┴──┬──┴──┬──┘
gv   ┌──┘ gv  ┌┘      gv │
┌──┴──┐┌──┴────┐┌┴──────┐
│main::hoge ││main::assign_glob ││main::assign_ref │
└──┬──┘└──┬────┘└──┬────┘
gp   ├──────┘        gp  │
┌──┴─┐svpv┌─────┐    ┌─┴──┐
│ SV    ├┐  │"GLOBAL" │←─┤SV    │
├────┤│  └─────┘   ├────┤
│ HV    ││svpv┌─────┐  │HV    │
├────┤└─→│"LOCAL" │  ├────┤
|.....以下略      └─────┘  │.....以下略
               0x4582858

このスコープ内での$assign_globへのアクセスは、stash内のGV assign_glob のGP
(これはGV hogeのGPでもある)を経てSVへ、となるので、
$assign_glob = ${*assign_glob} = ${*hoge} = $main::hoge(localにより上書きされている) = "LOCAL"
(結果:"LOCAL")
一方、*assign_refの方は何ら影響を受けませんから、
$assign_ref = ${*assign_ref} = ${\$hoge} = $hoge = "GLOBAL"
(結果:"GLOBAL")

・・・となるからではないか、と思ったのですがこの推測は正しいでしょうか?
詳しい方に訂正して頂けると有り難いです・・・
827_gunzip:2001/03/05(月) 22:24
#・・・後になって見てみると、間違ってるっぽいなあ。
828_gunzip:2001/03/06(火) 05:13
>>617-619
>@ARGVの値($ARGV[?])は文字列として$each_tallに代入されているんですか?
取りあえずDevel::PeekでDump()してやるとSV値PV(PointerValue)型ですから、
文字列値として格納されていますね。

>何故数値ではなく文字列として代入されるのでしょうか。
すみません。これは分かりません。
ただ、Perlでは、コンテキストに応じてPerlインタプリタが勝手に状況を
判断して数値から文字列へ、又は逆に文字列から数値へと自動的に変換して
くれますので、この変数は文字列型なのか、それとも数値なのかといった事を
さほど気にする事はないと思います。
#*どうしても*気になるならば、0を加算する、一倍するなどの手もあります。
例えば、例のスクリプトについて、
foreach $each_tall (@ARGV) {
&nbsp;&nbsp;&nbsp;&nbsp;$sum += $each_tall;
}
この$each_tallは始め文字列ですが
$sum += $each_tall; #$sum = $sum + $each_tall;
加法演算子によって、$each_tallが文字列から数値へと変換された後、
加算が行われ、数値が返されるわけです。

うーん。なんというか、この辺りは使っているうちに慣れてくると思います。
(・・・と言いますか、あまり意識しないようになります)

#そういえば、かなり前のfj.lang.perlにも似たような記事があった気が・・・
829_gunzip:2001/03/06(火) 05:18
830ババゲ〜ニョ:2001/03/06(火) 11:38
ファイルから読み込むには
while(<IN>){処理;}
が定番ですよね

これだと1行ずつ読み込んで処理するので
複数行にわたるパターンマッチはできないのでしょうか

すべてのデータをメモリ上に読み込んだ後で
複数行にわたるパターンマッチをするためにはどうすれば良いでしょうか
831_gunzip:2001/03/06(火) 12:48
>>830
undef $/; #入力コードセパレータの$/をクリア
$data = <IN>; #ファイルの中身を一括して$dataの中に入れる
$data =~ /pattern/;
で良いと思います。
832_gunzip:2001/03/06(火) 12:52
誤:入力コードセパレータ
正:入力レコードセパレータ
あと、パターンマッチオプションの/s@`/m 等についても
調べると良いと思います。
833ババゲ〜ニョ:2001/03/06(火) 12:56
>> gunzip
さんきゅう
試してみます
834/bin/名無しさん:2001/03/06(火) 17:30
local $/ = undef;

というのも・・・
835初期不良:2001/03/07(水) 05:23
外部コマンドを使わずに nslookup する方法ってあります?
いろいろ調べてみたら、hostbyaddr() とか言う関数を
使っている例や、Net::DNS を使うような話がありましたが、
私の環境では使えませんでした。
結局 `nslookup -q=$type $host` などとして取得していますが、
回数も多いのでプロセスがとても重そうです。
自前で Socket を使うしかないんでしょうか?
836ABC:2001/03/07(水) 11:04
817-819>gunzipさん(828)

>取りあえずDevel::PeekでDump()してやるとSV値PV(PointerValue)型ですから、
>文字列値として格納されていますね。
すいません本読みはじめたばかりで、何を言っているのかさっぱりわかりません。
取り敢えず、代入をしているからリストコンテキストで文字列扱いされてると言う事はわかりました。
勝手な勘違いすみませんでした。

あと1つ質問しようと思っていたのですが、

>この$each_tallは始め文字列ですが
>$sum += $each_tall; #$sum = $sum + $each_tall;
>加法演算子によって、$each_tallが文字列から数値へと変換された後、
>加算が行われ、数値が返されるわけです。
でわかりました。少々配列の事で頭がこんがらがってました。

どうもありがとうございました。

837名無しさん:2001/03/07(水) 12:44
>>835
素直に use Socket して gethostbyaddr でダメですか?
5.005_03 では確実に動いてますが
838初期不良:2001/03/08(木) 00:22
>素直に use Socket して gethostbyaddr でダメですか?
げ、そういう関係だとはつゆ知らず...
839名無しさん:2001/03/08(木) 07:05
perl5.004の鯖とperl5.00503の鯖借りてるんですけど
違いってなんですか?
前者だと動いて後者だと動かないperlがあるのですが...
そんな事考えられます?
840_gunzip:2001/03/08(木) 09:43
>>839
Perlのバージョン間の違いを調べたい時は
perldelta
perl5005delta
perl5004delta
を読むと良いよ。

#でも、5.004で動いて5.00503で動かないというのは妙だなあ。
841名無しさん:2001/03/08(木) 09:43
動かない機能ならあるかもな。
バージョン違うのは何らかの手が加えられてるってことなんだから。

そいやモジュール関連って5.004からだったっけ?
842839:2001/03/08(木) 12:01
鯖の名前挙げるとkagoya(前者)とsakura(後者)なんですが
同じようにupして同じようにパーミッション変更しても
後者だけエラーが出ます・・・
パーミッションは、ディレクトリ・実行ファイルとも701、
記録ファイルは601にしています。
705・755・777、604@`606@`666でも試しましたが駄目です。

エラーログは「Premature end of script headers」と出てます。
843_gunzip:2001/03/08(木) 13:30
>>842
>Premature end of script headers
必要なヘッダをちゃんと吐いていない、ってこと。
おそらく、ヘッダをはかないうちにプロセスが死んだのでは?
die()とか、exit()とかしている箇所を確認すべきだと思うな。

例えば、sendmailのパスが両者で異なっていて(本当に違うかどうかは知らない)
そこを変更しないままなので、
open(MAIL@` "/usr/sbin/sendmail -tf [email protected]") || die $!;
の辺りで死んでいる、とか。

#大抵/usr/lib/sendmailかな・・・
844666:2001/03/08(木) 22:30
666です。この前は質問に答えていただいてありがとうございました。
あれからいろいろ勉強したのですが、
-----data.txt-----
00000000-Noguchi XXX-554-69
00000001-Nomura XXX-520-540
00000002-Tanaka XXX-984-213
00000003-WATARI XXX-24-654
00000004-WATARO XXX-595-456
00000005-PA XXX-554-998
00000006-AQUA XXX-156-1
....以下3万行ほど。
とういうようなデータファイルがあり、各行の-で区切られた2番目の
セクションについて、TanakaというのをHiguchiと置き換えるスクリプト
を書く事になったのですが、自分では下のように書いてみました。
なにか間違っている点や、こうしたらいいという点を指摘していただけると
嬉しいのですが・・・・

#!/usr/local/bin/perl
open(DAT@`"data.txt");
while(<DAT>){
@data = split(/\-/@`$_);
$data[1] =~ s/Tanaka/Higuchi/;
$str = join(""@`@data);
print $str;
}
close DAT;
845666:2001/03/08(木) 22:33
あと、一応動きます。
846_gunzip:2001/03/08(木) 22:40
>>844-845
僕なら、
perl -pe "substr($_@`9) =~ s/^Tanaka/Higuchi/" data.txt >outfile
の一行で済ませるかな。(書き戻すなら-i)

あと、
>open(DAT@`"data.txt");
ファイルのオープンに成功したかどうかちゃんとチェックする。
open(DAT@`"data.txt") or die "Can't open data.txt";

>$str = join(""@`@data);
>print $str
は、
print @data;
で良い。(わざわざ連結する必要はないよ)
perldoc -f print ね。

うーん・・・これぐらいかなあ。
847666:2001/03/08(木) 22:49
>846
おお、速い どうもありがとうございます!
>僕なら、
>perl -pe "substr($_@`9) =~ s/^Tanaka/Higuchi/" data.txt >outfile
>の一行で済ませるかな。(書き戻すなら-i)
すみません・・・よく分からないです。m(_ _)m

>ファイルのオープンに成功したかどうかちゃんとチェックする。
>open(DAT@`"data.txt") or die "Can't open data.txt";
分かりました。そうしますね。でも、or と || ってどう違うのでしょうか?
どちらもopen文の所で見かけるのですが・・・・

>print @data;
>で良い。(わざわざ連結する必要はないよ)
今やってみると、そうみたいですね。知らなかったです。

あと、何度も聞いて申し訳ないのですが、perldoc -f print って、なんでしょう?
848_gunzip:2001/03/08(木) 23:09
>>847
>or と || ってどう違うのでしょうか?
優先順位が違います。(|| の方が優先順位が高いです。)
詳しくは本を読んでください。

ちなみに、以下のコードでファイルが開けない場合、
ちゃんと死んでくれるものはどれでしょう?(実際に試すのは反則)
open(F@`"file") || die "Can't open";
open(F@`"file") || (die "Can't open");
open(F@`"file") || do {die "Can't open";
open(F@`"file") or die "Can't open";

>perldoc -f print って、なんでしょう?
だまされたと思って、コマンドラインからそう打ち込んでみてください。
849_gunzip:2001/03/08(木) 23:16
しまった〜>>848は、
open(F@`"file") || die "Can't open";
open(F@`"file") || (die "Can't open");
open F@`"file" or die "Can't open";
open(F@`"file") || do {die "Can't open}";
open F@`"file" || die "Can't open";
open(F@`"file") or die "Can't open";
の間違い。
850666:2001/03/08(木) 23:31
どれも死んでくれそうですが・・・
open F@`"file" || die "Can't open";
は死んでくれないのですか・・・なぜだろう
851名無しさん:2001/03/08(木) 23:37
666じゃないけど、
>perl -pe "substr($_@`9) =~ s/^Tanaka/Higuchi/" data.txt >outfile
の解説きぼーん
852666:2001/03/08(木) 23:51
>848-849
あ。分かりました。(一応ですが・・・)
open F @` "file" || die "Can't open";
は、
"file" || die "Can't open" → "file"
open(F@`"file")
こんな感じ(ちょっと間違っているかも)に解釈されるわけですね。

perldocについては分かりました。(ただ・・・英語なんですね)
853初心者:2001/03/09(金) 00:08
すみません、ほんとの初心者です。
CGIを勉強したいのですが、その前にJavaScriptぐらい
書けないとだめですか?
854名無しさん:2001/03/09(金) 02:51
>>853
書けなくてもオーケー。というか、CGIを書くこととJavaScriptを
書くことって、思ってるほど関連ないですよ。
一方ができればもう片方も楽勝なんてこたあありません。
ただ、JavaScriptを楽しんで書けるようなら、性格的に
プログラミングに向いてるから、Perlでもなんでもいけるでしょう。
855名無しさん:2001/03/09(金) 02:51
>>853
俺はJavaScriptは書けないがPerlなら書ける。
856名無しさん:2001/03/09(金) 02:58
>>851
perl -pe ……
というコマンドラインがわからんのか、
substr($_@`9) =~ s/…/…/
という置換がわからんのか、どっち?
857851:2001/03/09(金) 09:03
>>856
いや、調べたら分かった。(すまん)
$str = substr($_@`9);
のような文なら見た事があったのだが。右に置けるとはおもわなんだ。
858851:2001/03/09(金) 09:03
はう
左だった。
859851@超初心者:2001/03/09(金) 09:36
>>844-846見て思うが、>844は俺でもすぐ書けるけど、
なんで>846みたいなのを思いつく奴がいるんだ?俺にはさっぱりわからん。
860名無しさん:2001/03/09(金) 13:26
Perlでファイルの読み込みについてですが、
1-
2-
3-
aaaa
bbb
cccc
ddd
eeee
fff
.....以下続く
こんなファイルがあるとき、@aに、
$a[0] = "aaaa-ddd-......."
$a[1] = "bbb-eeee-....."
$a[2] = "cccc-fff-....."
のように3行のサイクル(?)で入れるにはどうすればいいのでしょう?
861860:2001/03/09(金) 13:27
すみません。初めの
1-
2-
3-
はいらないです。
862素人Perl:2001/03/09(金) 13:57
>860

#! /usr/bin/perl

open (DAT@` "./hogehoge.dat");
while (<DAT>) {
chomp;
$a[ ($.+2)%3 ].= $_ . '-';
}
close(LOG);
chop(@a);

print "Content-Type: text/plain\n\n";
print "\$a[0] = $a[0]\n";
print "\$a[1] = $a[1]\n";
print "\$a[2] = $a[2]\n";
863860:2001/03/09(金) 14:25
>>862
どもどもです〜
動きました!ありがとう!
864853:2001/03/10(土) 01:30
>>854-855さん
ありがとうございます!
頑張ってみます!
865名無しさん:2001/03/10(土) 01:43
>>839-841
遅レスでスマソ
perl5.004_04 と perl 5.005_03 は、バイナリ的に in-compatible
なんで、動かないケースは結構あります。
# Y2K でイタい想ひ出が...
全てソースから作ってる環境なら話は別ですけど
866名無しさん:2001/03/10(土) 10:44
レス機能のある掲示板を作りたいのですが、
そのやり方が書いてある本やサイトをご存知ないでしょうか?
探してみたのですが、僕が見つけたいくつかの本で扱っているのは
全部レス機能のない普通の掲示板のつくりかたのみで・・・・・

ネットでも探してみましたが、検索して出てくるのは、
レス機能付き掲示板スクリプトの配布とかレンタルばかりでした。

レス機能付きの掲示板のスクリプトを解説してくれている本やサイトがありましたら、
教えてください。お願い致します。
867名無しさん:2001/03/10(土) 14:03
>866
ネタにしてはつまらなすぎ
868名無しさん:2001/03/10(土) 15:59
>>867
一応「初心者」関係ということで、このスレで聞かせていただきましたが
ここで聞くのは場違いだったでしょうか?
スレ違いで申し訳ありませんが、ご存知でしたら教えてください。
お願い致します。
869初期不良:2001/03/10(土) 16:56
>>866
其れ即ツリー型?
870866:2001/03/10(土) 17:28
いえ、普通の
YYボードとか http://www.kent-web.com/bbs/sample/yybbs.cgi
プチボード http://www.kent-web.com/bbs/petit/petit.cgi
のようなレス機能です。
本当はこれらのスクリプトを自力で解読できれば良いのですが
未熟なので、解説付きのスクリプトを探しています。
871名無しさん:2001/03/10(土) 18:58
>>866
CGI探しますスレに逝きなさい
872名無しさん:2001/03/10(土) 19:47
>>871
わかりました。ありがとうございました。m(_ _)m
873名無しさん:2001/03/10(土) 21:56
>>870
解読も出来ないのに自分で作れるとは思えないが…。
まずは解読してみそ。
それが力になるから。

って遅いか。
874名無しさん:2001/03/10(土) 22:29
>>873
レスありがとうございます。
そうですか、やはりまず自力で読解ですか。
わかりました。
875名無しさん:2001/03/11(日) 00:23
活発なPerlのメーリングリスト教えてください。
英語圏希望。

日本じゃレベルが低すぎる。
876名無しさん:2001/03/11(日) 00:33
>875
じゃあ英語圏で聞きたまえ。
877名無しさん:2001/03/11(日) 00:38
そりゃそうだ。(w
878名無しさん:2001/03/11(日) 00:53
flockってどれくらい信用できるものなんでしょうか?
自分でロック実装するほうが安全ですか?
879名無しさん:2001/03/11(日) 00:56
複数のファイルを書き換えるとか、
重なるとまずい「区間」があるなら、ロックファイル形式が良い…。
と個人的には思う。

カウンタとかならflockとか。
880名無しさん:2001/03/11(日) 10:12
SSIの初心者な質問はこちらでいいのでしょうか?
それともWEB制作板のほうですか??
881むぎ茶:2001/03/11(日) 10:30



perlならここでいいだろ(m

┐(´ー`)┌


┏━━━━━━━━━┓
┃('Д')y ─┛~~ ┃
┃むぎ茶      ┃
[email protected]  ┃
┗━━━━━━━━━┛
http://www.freeml.com/ml_info.php?ml=bitvalley
882名無しさん:2001/03/11(日) 11:36
何気に親切なむぎちゃんでした(w
883名無しさん:2001/03/11(日) 11:51
(m
ってなにさ。
884名無しさん:2001/03/11(日) 12:41
カッコ エムだよ
アルファベットも読めんのかココのガキは
885名無しさん:2001/03/11(日) 14:18
これって問題あります?
sprintfの桁指定に * を使えるのはv5.004以降って聞いてるのですが、
ifで振り分るだけで大丈夫なんでしょうか?
とりあえずPerl v5.00307(Win32) と v5.00503(Unix) では動いてますけど...

# $count カウンターの値

if($] >= 5.004){ $count = sprintf("%0*d"@`$digit@`$count); }
else{ $count = sprintf("%04d"@`$count); }
886名無しさん:2001/03/11(日) 15:31
>>884
こんな簡単な質問の意味も読み取れんのね、この子(m
887_gunzip:2001/03/11(日) 16:03
>>885
良いと思う。ただ、分岐させないで、
フォーマット指定子を埋め込んでやった方が簡単かも。

$k = 4; #合わせたい桁数
$count = sprintf("%0${k}d"@`$count);

#外しているかな?(かも)
888_gunzip:2001/03/11(日) 16:14
>>885
↑に書いたもので良いと思うよ。

$k = 4; #合わせたい桁数
#{}を外してはいけない。
$count = sprintf("%0${k}d"@`$count);
又は、
$count = sprintf("%0".$k."d"@`$count);

>>865
># Y2K でイタい想ひ出が...
もし良ければ教えてください〜
889JAPU(AyuMoe):2001/03/11(日) 16:36
そんな太古のバージョンまで気にするなら、
sprintf "%0${digit}d"@` $count;
とすれば〜?
890名無しさん:2001/03/11(日) 16:36
>>886
君って実は頭悪いのね(m
891883:2001/03/11(日) 16:47
(m は(w
と同じか?なんで?
892886:2001/03/11(日) 16:50
>>890
初めて書き込んだのに「実は」なんて言われちゃった(m
893_gunzip:2001/03/11(日) 16:51
>>885
japan.comp.lang.perl
ftp://ftp.jaist.ac.jp/pub/news-archive/japan.comp.lang.perl/Subject-199909
【質問】指定した桁数以上の数字にしたい場合?
参考までに。
894883:2001/03/11(日) 17:00
って事はおれの最初の質問は頭良かったんか。
まいったねどうも(m

   ↑これでいいんでしょうか(w
895名無しさん:2001/03/11(日) 22:56
指定したディレクトリー内にあるファイルのファイル名をすべてindex.htmlに書きこませるにはどうしたらいいのでしょうか?
896/bin/名無しさん:2001/03/11(日) 23:15
>>895

何に使うのか気になる。とりあえずディレクトリ関係のコマンドでも
調べて自分で考えるが良いと思われ。
897_gunzip:2001/03/11(日) 23:18
>>895
opendirで開いて readdirで読んで index.htmlを開いて
printで書き出して閉じる。
又は、
system("ls -la > index.htm") and die $!;
とか。
もうちょっと具体的にお願い。
898初期不良:2001/03/12(月) 03:49
>>897
@files = <$dir/*>;
とかで取得は良くないの?
俺いつもこれなんだけど。
899_gunzip:2001/03/12(月) 06:10
>>898
いや、そっちの方が手軽で良いと思う。
ただ、*5.6以前のPerlでは* glob()はcshを起動するので若干遅いし
それだけならいいのだけれど、csh君は諦めが早いので、あまりに多くの
ものがマッチすると"Arglist too long"って投げてしまいますわな。
・・・というわけで、僕は普段opendir/raddir/closedirでやっています。
(こっちの方が慣れているから、というのが一番の理由かも)
とは言え、5.6ではFile::Globで自前で面倒を見る事になったようなので、
後者については余り気にする必要は無いかもしれません。

5.6で試しにベンチマークを取ってみると、下のような結果になります。
#いい加減買い換えたいな・・

#!/usr/bin/perl -w

use Benchmark;
$dir = "/etc";
timethese(10000@`{
&nbsp;&nbsp;&nbsp;&nbsp;"glob" => sub {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@files = <$dir/*>;
&nbsp;&nbsp;&nbsp;&nbsp;}@`
&nbsp;&nbsp;&nbsp;&nbsp;"opendir/readdir/closedir" => sub {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opendir(D@`$dir) or die "Can't open $dir";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@files = readdir(D);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closedir D; #必要ないが一応
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
});

#result
Benchmark: timing 10000 iterations of glob@` opendir/readdir/closedir...
glob: 20 wallclock secs
&nbsp;&nbsp;&nbsp;&nbsp;(19.34 usr + 0.00 sys = 19.34 CPU) @ 517.06/s (n=10000)
opendir/readdir/closedir: 8 wallclock secs
&nbsp;&nbsp;&nbsp;&nbsp;( 7.91 usr + 0.00 sys = 7.91 CPU) @ 1264.22/s (n=10000)
900名無しさん:2001/03/12(月) 06:24
だいぶ前ココに、use libとすれば、モジュールを勝手におけるように
設定できると見た事があるけど、特定の場所例えば、
E:\TestTest.pm
においたら、
use lib "E:\\";
としても、
use lib "E:/";
でもあかんかったけど、どうすればいいか分かる?
誰か教えて
901_gunzip:2001/03/12(月) 06:26
>>900
use lib "E:/.";
use lib "E:\\.";
902900:2001/03/12(月) 06:29
>>901
いっしょやないかコラ
903_gunzip:2001/03/12(月) 06:31
>>902
目を凝らして見てくれ。後ろに何かついてないか?
904名無しさん:2001/03/12(月) 07:23
User-AgentからOS名とブラウザ名を取り出したいのですが
何か良い方法ってありますか?
自分で作ってみたんですけどifを多用しすぎてなんかスマートでないので。
905885:2001/03/12(月) 07:38
ありがとうございました。
帰ってから試してみます。
906名無しさん:2001/03/12(月) 11:05
CGIでperlスクリプトを動かす時って、一定時間経つと処理がストップしてしまうんですか?
600行程度のスクリプトを600回ループさせたり等の結構重い処理をするスクリプトを動かしているのですが、
途中で必ずInternalServerErrorになってしまいます。
それともスクリプト自体に問題があるのでしょうか?
一応スクリプトは、
http://ichigo.sakura.ne.jp/~horizon/sengoku/sengoku.txt
です。90〜883行目のサブルーチンの部分が問題の処理です・・・
907名無しさん:2001/03/12(月) 12:35
そろそろ新スレでは?
908/bin/名無しさん:2001/03/12(月) 13:09
>>904

switch-case 文みたいなのを自作して使うというのではダメか。

>>906

数回ループさせる処理でチェックしてみるのが良いかと。
# すまぬ。読む気になれなかった。my 使え。
909_gunzip:2001/03/12(月) 15:00
>>906
>CGIでperlスクリプトを動かす時って、一定時間経つと処理がストップしてしまうんですか?
一定時間経っても処理が終了しないプロセスは、WWWサーバが SIGTERM 送って殺します。
(50-300秒程度だと思いますが)
ところで、なんかturn()というサブルーチンの中で35回以上もファイルを開いては読んで閉じる
といった事を繰り返しているようですが、これはなんとかなりません?

>my 使え。
ヽ(´ー`)ノ 賛成
>すまぬ。読む気になれなかった。
自分も。すまん。
910名無しさん:2001/03/12(月) 18:43
>一定時間経っても処理が終了しないプロセスは、WWWサーバが SIGTERM 送って殺します。
>(50-300秒程度だと思いますが)

なるほど・・たぶんそれが原因だと思います。

>ところで、なんかturn()というサブルーチンの中で35回以上もファイルを開いては読んで閉じる
>といった事を繰り返しているようですが、これはなんとかなりません?

たぶんトータルでは1000回以上開いてる・・・各データを別ファイルにしたのが
とてつもない悪手だったような。。。データファイルを開くのってやっぱり時間かかるんでしょうか?

あとこの「my」っていうのは変数の範囲を局所化するんですよね。
これを利用するとどういったメリットが得られるのですか・・・?
んじゃ新スレ頼んだぞ>gunzip
912名無しさん:2001/03/12(月) 19:28
>>911
別のサブルーチンでも同じ変数名を使える
(でもお行儀は悪い)

消費メモリを減らすことができるらしい
(そこまでシビアな作品歴は無いので未体験)
913ブチ:2001/03/12(月) 19:39
>>910
メモリ内での読み書き計算の時間に比べれば
ハードディスクの読み書き(ファイルアクセス)とてつもなく遅いよ。
両方とも人間にとっては非常に短い時間というのは同じだけど何千何枚と繰り返せば差は歴然。
同じファイルにアクセスするなら一度に読んで処理終わってから書き出すほうがいいよ。
914名無しさん:2001/03/12(月) 20:09
>>910
my使わないと、それぞれの変数が
その関数だけで使われているのか、
それとも他の関数でも使われてるのか、
使われているとしたら、どこで値が変わって現在の値は何なのか、
そういうのを追っかけるのに苦労するだろ。
ひと月スクリプト放置したら自分でも読めなくなるかもしれないぞ。
バグあったときに取りづらくなるし、
関数を他のスクリプトに再利用するときもつらい。
915名無しさん:2001/03/12(月) 20:51
>>913、914
なるほど・・・勉強になります。
ってことはとりあえずこのスクリプトは全面的に見直さなきゃならないのか・・・うう。
ありがとうございました。頑張りますm(__)m
916名無しさん:2001/03/12(月) 22:08
文字列の先頭が大文字であるかどうか判定するにはどんな正規表現を書けばいいのですか?
917_gunzip:2001/03/12(月) 22:14
>>916
>文字列の先頭が大文字であるかどうか判定するには
正規表現を使う必要はないと思います。

ucfirst($str) eq $str&nbsp;&nbsp;&nbsp;&nbsp;#$strの先頭が大文字ならtrue
918_gunzip:2001/03/12(月) 22:20
または、
$str =~ /^[A-Z]/
919名無しさん:2001/03/12(月) 22:31
>900-903
榕タ
920916:2001/03/12(月) 22:45
>917-8
thanks!
921shige:2001/03/12(月) 23:42
お前らって人生の歯医者だね。
922_gunzip:2001/03/12(月) 23:51
>>921
$ echo お前らって人生の歯医者だね。 1>/dev/null 2>&1

>>911
分かりました。明日起きてすぐたてます。
923名無しさん:2001/03/13(火) 01:20
文字列$hogeの$n文字目を'A'にしたいのですが
どうすればエレガントでしゃうか。
924923:2001/03/13(火) 01:31
すみません。
substr EXPR@`OFFSET@`LENGTH@`REPLACEMENT
いきなりコレ発見しました。
925/bin/名無しさん:2001/03/13(火) 01:41
# その1
substr($hoge@` $n - 1@` 1) = 'A';

# その2
$n--;
$hoge =~ s/^(.{$n})./${1}A/;
926_gunzip:2001/03/13(火) 05:59
ほんの少し早いかもしれませんが、新しいスレを立てました。
http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156
927移転します
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■