トップページ⇒php
1001コメント375KB

Perlコーディング初心者質問スレ Part 39

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0116nobodyさん04/12/03 11:49:21ID:???
配列内の最大値が配列の何番目であるか判別するためには、どのように書くのが簡潔でしょうか?

@list = qw(3 5 8 4 2 9 6 1 7);
#この例だと9が保存されている位置の5が欲しい

foreachで回しながら比較していくしかないのでしょうか?
0117nobodyさん04/12/03 11:53:46ID:25445hqZ
>>116
ソートして先頭か末尾取り出せば?
とスレの流れを見て言ってみる
0118nobodyさん04/12/03 11:54:48ID:25445hqZ
>>116
ごめん。よく読んでなかった。orz
0119nobodyさん04/12/03 11:56:11ID:???
>>114, >>115
use sortはプラグマ、おそらく perl のバージョンが古いと使えないはず。perl5.6以降だったかな。

>>82 のコードは、条件が多くなるとsliptの回数がすごい事になりそうなので、
これをキャッシュする様な仕組みを考えるといいと思う。参考までに、CPANより
http://search.cpan.org/~jnh/Sort-Fields-0.90/Fields.pm

0120nobodyさん04/12/03 12:17:33ID:???
HTMLに記述されたリンクを踏むと、そのページに飛んだりファイルを開いたりダウンロードを行ないますが、
ファイルを開いたりせずに強制的にダウンロードダイアログを表示させる事は可能でしょうか。

例えば、<A href="hoge.txt">hoge</A>などのリンクがあって、これをIEで踏むとIEがファイルを開いてしまいます。
これをダウンロードダイアログを出したいと思っています。
現在使っているサーバー(@nifty)ではCGI設置ディレクトリにあるログファイルなどへの直接のアクセスはできないので、
CGIを通してダウンロードを行ないたいと考えています。
多分出力するContent-typeの周辺をいじればいいのではと考えているんですが、
参考になるようなサイトをご存知の方はいらっしゃらないでしょうか。
0121nobodyさん04/12/03 12:23:42ID:???
>>115
119が紹介したモジュール使った方が便利だと思うが
テキトーに書いてみた。

sub datasort {
  my($spec, @list) = @_;

  return sort {
    my $r = eval {
      my @a = split(/,/, $a);
      my @b = split(/,/, $b);

      foreach (@$spec) {
        my($format, $order, $index) = @$_;
        my $r = ($format == 1)? (@a[$index] <=> @b[$index]):
            ($format == 2)? (@a[$index] cmp @b[$index]):
            die "型が変: @$_";
        next if $r == 0;
        return ($order == 1)? $r:
            ($order == 2)? (-$r):
            die "並べ順が変: @$_";
      }
      return 0;
    };
    if ($@) { die "$@" }
    return $r;
  } @list;
}
0122nobodyさん04/12/03 12:24:07ID:???
>120
http://www.google.com/
0123nobodyさん04/12/03 12:28:49ID:???
>>120
content-typeをapplication/octet-streamにしてやればたいてい
ダウンロードにいくとは思うが、ブラウザの類の挙動の話なので
perlとは関係ないからスレ違い。
0124nobodyさん04/12/03 12:35:07ID:???
>>116
List::Utilのreduce使って

reduce { $list[$a]>$list[$b]? $a: $b } 0..$#list
0125nobodyさん04/12/03 13:54:20ID:???
フォームから0を入力してもらうとき、それを真として処理するにはどうしたらいいでしょうか?
例えば<OPTION>で、0 時として送信したときに偽として処理されてしまいます。
0126nobodyさん04/12/03 13:56:51ID:???
>125
if($input_data != ""){
}
0127nobodyさん04/12/03 13:57:35ID:???
if ($object ne ''){ 処理 }
0128nobodyさん04/12/03 13:57:48ID:???
ごめ、Perlでは違うんだった。
if($input_data ne ""){
}
012912504/12/03 14:00:11ID:???
そんな簡単なことだったんですね^^;
ありがとうございました
0130nobodyさん04/12/03 14:03:50ID:???
久しぶりにここ覘いたけど以前にも増してアレなスレになっちゃってますね
昔は参考になるスレだったのに残念です
0131nobodyさん04/12/03 14:18:51ID:???
ここが参考にならなくなったって事は>130が初心者じゃなくなったって事だろ。
めでたいことじゃないか。
0132nobodyさん04/12/03 14:26:10ID:OybfBlRl
>>82
sub datasort($$$$\@) {
my ($separator, $types, $orders, $keys, $data) = @_;
die "ERROR: datasort()の引数が間違っています。\n"
unless ($#types == $#orders and $#orders == $#keys);
my $keys_len = scalar @$keys;
my $data_len = scalar @$data;
my %data_index = map {
$_ => [(split($separator, $data->[$_]))[@$keys]]
} (0..$data_len-1);
my @sorted_index = sort {
my $ret;
for (0..$keys_len-1) {
my $n = $data_index{$a}[$_];
my $m = $data_index{$b}[$_];
my $type = $types->[$_];
my $order = $orders->[$_];
($ret = $order * ($type?($n cmp $m):($n <=> $m))) ? last : next ;
}
$ret;
} (0..$data_len-1);
return map {$data->[$_]} @sorted_index;
}
my @data = ("1,2,3,4,5", "0,0,0,0,5", "0,9,7,6,0", "1,3,5,7,9", "2,4,5,7,0");
for (datasort(qr/,/, [1,1], [-1, 1], [4,2], @data)) { print "$_\n"; }
0133nobodyさん04/12/03 14:26:46ID:???
今と昔は普及度が違う
0134nobodyさん04/12/03 14:28:39ID:???
>>131
いいこといった!
俺もここの内容が屁に見えるようになるまでがんばろう!

今は俺にとってここは宇宙です。
0135119,13204/12/03 14:31:31ID:OybfBlRl
# 行数が多くなったので、分割

132のdatasort関数の Usage:

# datasort(区切り文字, 型, 順序, キー, 配列)
#
# 区切り文字 ... splitの第一引数
# 型 ... true: cmp, false: <=>
# 順序 ... 降順 -1, 昇順 +1
# キー ... キーとなるフィールドのインデックス(0から数える)
# 配列 ... ソート対象のデータ
#

ベンチマーク取ってないけど、(テストも余りしてない)
データのsplitが(配列の数)回で済む為、少しは速くなると思う。
0136nobodyさん04/12/03 15:08:29ID:???
>>134
残念ながら屁は見えないと思う。
01378304/12/03 15:31:58ID:???
>>111
!?空になりますかそうですか。。。

>>115
>>my @new = bogosort([[1,1,0], [1,1,4]], @data);
>の後ろ側、[1,1,4]が効かず、前側の[1,1,0]だけが有効になってしまいます。。
古いPerlのsortは、比較関数が0を返した時に元の並び順が保障されないので
そのようになるです。

というわけでPerlをバージョンアップすべし。
0138nobodyさん04/12/03 15:37:24ID:???
HTML::Templateの質問なんですが。
file_cacheでキャッシュされるのは、何がキャッシュされるんでしょう?
templateの構造や内部的なtemplateの解析結果とかがキャッシュされるのだろうか?
ページそのものじゃないよね、たぶん。
0139nobodyさん04/12/03 16:13:56ID:???
man HTML::Template によれば、parsed template がキャッシュされるらしい
解析したデータ構造を Storable でシリアライズしてキャッシュしてるんだと思う
0140nobodyさん04/12/03 16:29:48ID:???
>>139
ありがとうございます。よく読んだらperldocに書いてありましたね・・・orz
これでおよそ50%パフォーマンス向上ってんだから、結構時間掛かるんですね。
01418204/12/03 17:47:58ID:???
もうだめぽ・・・自信喪失。

素直に
>●先頭から16個目のデータを1次キー、3つ目のデータを2次キーとしてソートする場合
>@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15] or (split(/,/,$a))[2] <=> (split(/,/,$b))[2]} @address;
のように繋げて書く(というか人に使わせる)ようにします。。くすん。。。

また何かありましたら質問させてください。
ありがとうございました。
0142nobodyさん04/12/03 20:25:23ID:???
$a = "&gt;&gt;&gt;&gt;あいうえお。";
このような文字列があるとして、先頭から連続してる&gt;の数を数える方法ってないでしょうか?
できるだけ簡潔に書きたいのですが・・・。
0143nobodyさん04/12/03 20:51:56ID:???
>先頭から連続してる&gt;の数
その例だと4つって数え方でいいのか?
0144nobodyさん04/12/03 21:11:40ID:???
>>142
こんなんでどう?
$num = $a =~ s/(?:^|(?<=&gt;))(&gt;)/$1/g;
print $num;  # 4
0145nobodyさん04/12/03 21:12:08ID:???
($n)= $a=~ /^((?:&gt;)+)/;
$n= length($n)/4;
0146nobodyさん04/12/03 21:14:43ID:???
>>142
my $count = 0;
$count++ while($a =~ /\G&gt;/g);
014714504/12/03 21:24:55ID:???
簡潔さで負けてるので1つにまとめて
$n= length(($a=~ /^((?:&gt;)+)/)[0])/4;

>>144
それだと、 &gt;の連続が後半に再びあったときに・・・
0148nobodyさん04/12/03 21:36:09ID:???
>>143
そうです。先頭から>が幾つ連続してるか、って言い方するべきでした。
>>144-147
ありがとうございます。>>146さんのやり方だとそのまま>を任意の文字列への
置換にも使えそうですね。
0149nobodyさん04/12/03 21:40:41ID:???
ああ、\G使うって手もあったか。
0150nobodyさん04/12/03 22:22:14ID:???
&gt;にワロタ
0151nobodyさん04/12/03 23:14:28ID:???
みんな凄いね。考えてたけどサパーリだった。
015214404/12/03 23:33:10ID:???
>>147
>それだと、 >の連続が後半に再びあったときに・・・
なるほろ、そうでつね。指摘サンQ
0153nobodyさん04/12/03 23:36:48ID:EsHuFZ1r
どうにかしてpackage名に日本語を使用することはできませんか?
0154nobodyさん04/12/04 00:02:39ID:orEKzBU3
>>153
はじめからutf8でソースを書いてuse utf8するか、
encodingプラグマのFilterオプション使えばいける。

後者の例はたとえば

use encoding 'euc-jp', Filter=>1;
package 日本語;
$変数 = 1;

とはいえ、あまり趣味は良くないね。
0155nobodyさん04/12/04 00:03:00ID:10+aOFQr
Perl内でSSIと同じ効果得るにはどうしたらいい?
<!--#include virtual="****.cgi" -->を使いたい。
015615504/12/04 00:04:57ID:10+aOFQr
多分、ものすごーく簡単なことなんだろうけど、ど忘れっぽい感じ。
015715304/12/04 00:17:56ID:U0vSojEF
>>154
ありがとうございます。utf8ですか。
OSもDBもeucなのでeuc以外では考えていません。ってことは無理なんですね(>_<)

"や'や{などで囲ったり色々してみましたが無理でした。あきらめます。
0158nobodyさん04/12/04 00:21:06ID:???
OSのキャラクタセットは別に考慮しなくてもいいんじゃないか?
0159nobodyさん04/12/04 00:21:40ID:???
>>157
別にDBへの書き出し時にEUCにすればいいんじゃないの?
0160nobodyさん04/12/04 01:35:43ID:???
むしろ重要なのは Perl のバージョンだ
0161nobodyさん04/12/04 15:38:15ID:???
ファイルを読みこんで、上の1行を消して下に現在の時間(time関数の返り値)を追記したいのですが、
配列を使うと行数の数だけメモリを確保してしまって無駄遣いしてしまいますよね。行数は不明です。
配列を使って、shift→pushってする場合と、以下のようにする場合ではどちらのほうが効率的でしょうか。

open(W, "> file2.txt");
open(R, "file.txt");
$i = 0;
while(<R>){
    next unless ($i++); # 先頭の行は除去
    print W $_;
}
close(R);

print W time;

close(W);

unlink("file.txt");
rename("file2.txt", "file.txt");

また、他に効率の良い方法などはありますでしょうか。
よろしくお願いします。

読み書き共用で開くということもできるらしいのですが、どのサイトを拝見しても詳しい内容が載っていません。
実用的だと思うのですがなぜなのでしょうか。
0162nobodyさん04/12/04 15:54:50ID:???
一行目を読み捨てたらあとは read で読んだほうが速いと思う。
で、rename するので unlink は不要かと。

<R>;
while (read(R, $buf, 10240)){
print W $buf;
}
print W time;
close(W) and rename("file2.txt", "file.txt");
0163nobodyさん04/12/04 17:32:44ID:???
>>160

perl -v
016416104/12/04 17:43:46ID:???
>>162
参考になりました、ありがとうございます!
0165nobodyさん04/12/05 14:39:51ID:hMog6IUx
lwp::simpleを使ってwebサイトの更新時間をしらべるスクリプトなんですが更新時間を取得できないページがあります
取得したいのですがどうしたらいいのでしょうか
use LWP::Simple;
($content_type, $document_length, $modified_time, $expires, $server) = head "URL";
($sec, $min, $hour, $day, $mon, $year) = localtime($modified_time);
$year += 1900;
$mon = sprintf( "%02d" , $mon+1 );
$day = sprintf( "%02d" , $day );
$hour = sprintf( "%02d" , $hour );
$min = sprintf( "%02d" , $min );
$sec = sprintf( "%02d" , $sec );
print "$year年$mon月$day日$hour時$min分$sec秒 更新
0166nobodyさん04/12/05 14:50:04ID:eDMBo65d
Perlを始めたばかりの初心者です。
Shift_JISで作っていこうと思います。

ダブルクォーテーションの中で一部の日本語(「表示」など)が文字化けする問題について
知りたいのですが、どういう時に文字化けするのかがよく分かりません。
なぜフォームから受け取る時には文字化けしないんですか?
分かりにくかったらすいません・・・。
0167nobodyさん04/12/05 14:50:45ID:???
>>165
> LWP::Simple
> head($url)
> Get document headers. Returns the following 5 values if successful:
> ($content_type, $document_length, $modified_time, $expires, $server)
> Returns an empty list if it fails. In scalar context returns TRUE if successful.
0168nobodyさん04/12/05 14:53:08ID:???
>>166
「文字化け 0x5c」 でググる。
0169nobodyさん04/12/05 15:22:25ID:???
フォームからはURLエンコードされて送られるでしょ。
017016604/12/05 15:49:18ID:???
何となく分かりました。
ありがとうございました。
0171nobodyさん04/12/05 17:40:20ID:???
HTMLファイルからフォームを使ってCGIにデータを渡したいのですが、
HTMLファイルをShift_JISで書いていれば送られるデータはShift_JISだと期待してもよいのでしょうか。
0172nobodyさん04/12/05 17:58:50ID:???
>>165
HEADメソッドでだめならGETメソッドを使ってヘッダから取得。
LWP::Simpleではヘッダ部が取れないから、
LWP::UserAgent使うことになると思う。

>>171
一部のブラウザにはeuc-jp固定で送信するものがあるという話。
0173nobodyさん04/12/05 19:37:19ID:???
>>165
全てのサイト/ページが更新時刻を返してくれるわけではない。
特にページがCGIなど動的に生成されていたりすると、
更新時刻という概念自体が無かったりして、Date も Last-Modified も返さないことが良くある。
そういうときは、諦めるしかない。
0174nobodyさん04/12/05 23:57:35ID:mQuG6gLO
馬鹿は100人集まると100倍馬鹿になる
0175nobodyさん04/12/06 06:14:11ID:???
10000倍では?
0176nobodyさん04/12/06 08:28:17ID:???
>>175は既に100倍(r
0177nobodyさん04/12/06 10:08:16ID:???
MLDBMを使ってデータの書込みを行っているのですが、データを書き込んでも
ファイルが生成されません。
サーバはRedhat9+Apacheで構成されているようなのですが
環境に依存して生成・書込みが出来ないことがあるのでしょうか。

以下のようなルーチンを使用しています。(パスは合っています。)

use MLDBM qw(DB_File Storable);

sub DbmWrite {
 my($data, $filename) = @_;
 my(%writehash);
  tie %writehash, MLDBM, $ini::path.$filename, O_CREAT|O_RDWR, 0666;
  %writehash = (%writehash, %$data);
  untie %writehash;
}
0178nobodyさん04/12/06 11:27:02ID:???
>>177
とりあえず、tieに or die $!つけてどうなるかみるのが基本じゃないかな
0179nobodyさん04/12/06 12:35:45ID:???
再帰処理でディレクトリ一覧を表示する処理について質問です。

# とりあえずお気に入りの一覧ということで
&showdir("C:\/Documents and Settings\/Administrator\/Favorites");
sub showdir {
  my($dir) = @_;
  opendir(DIR, $dir) || die $!;
  my(@files) = readdir(DIR);
  closedir(DIR);
  foreach (@files){
    if($_ ne '.' && $_ ne '..'){
      $path = $indir . "/" . $_;
      for($i=0; $i<$level; $i++){
       print " ";
      }
      print $_ . ((-d $path) ? "/" : "") . "\n";
      if(-d $path){
        $level++;
        &showdir($path);
      }
    }
  }
  $level--;
}

現在はこのように書いているのですが、このように書くとディレクトリやファイルなど関係なく、
名前順でソートされてしまうようです(Win2K SP4 ActivePerl 5.6.1)。
2レスに分けます、
0180nobodyさん04/12/06 12:36:24ID:???
要するに、

aaa.txt
bbb
 bbb.txt
ccc
 ccc.txt
ddd.txt

このように表示されてしまいます。
これを、まずはディレクトリとファイルでソートして、
そこからファイル名でソートさせたいと思っているのですが、
ディレクトリかファイルかでソートするにはどのように記述したらいいでしょうか。
上の例で言いますと、

bbb
 bbb.txt
ccc
 ccc.txt
aaa.txt
ddd.txt

このような表示順序にしたいと思っています。
0181nobodyさん04/12/06 13:04:43ID:???
>>178
有難うございます。
どうやらtieが死んでいるみたいです。
エラー内容はサーバ管理者不在で見れませんが、、、、
0182nobodyさん04/12/06 13:21:50ID:???
>>181
CGIならCGI::CarpのfatalsToBrowser使うとかいろいろやりようあるだろ
0183nobodyさん04/12/06 13:36:20ID:???
FILE::find使った方が楽そうな気が・・・
0184JAPU04/12/06 13:51:45ID:???
はにゃーん

>>171
無関係の文字コードで送ってくるブラウザもあるようなので注意。古い例で恐縮ですが,たとえばBSD/386版Mozilla/3.xではJIS固定で送信していました。

INPUTはHTMLの文字コードで送られるが,HIDDENは別のコードで送られるという実装もあるようです。(何となく内部処理が想像つきますが…)

いまどきの主要なブラウザをターゲットにするのであれば,HTMLの文字コードがそのまま利用されるという仮定でも問題無いようです。

(FYI) HTMLでは送信されるエンコードを指定することができるが,現状まともに利用されてはいない模様。
cf. http://www.w3.org/TR/html401/interact/forms.html#h-17.3
0185nobodyさん04/12/06 13:54:44ID:???
foreachの手前でそうなるようにソートしときゃいいんでねーの?
例えば:

my %file_or_dir;
@file_or_dir{@files} = map { (-d "$dir/$_")? 0: 1 } @files;
@files = sort { $file_or_dir{$a} <=> $file_or_dir{$b} || $a cmp $b } @files;



0186JAPU04/12/06 14:10:52ID:???
はにゃーん
>>132 で既に回答出てたの気づかずに >>82 用のコード書いてしまったよ… 悔しいのでとりあえず貼り付けておきます。(インデントずれるので http://www.japu.org/tmp/ayumoesort.pl にも置きました…) あ,手抜きなので注意して。
#! /usr/bin/perl -w
# This code is public domain; I never assert any rights.
# This code is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
use strict;
use constant COND_DTYPE_STR => 0;
use constant COND_DTYPE_NUM => 1;
use constant COND_ORDER_ASC => 0;
use constant COND_ORDER_DESC => 1;
MAIN: {
my @data = ("foo,bar,2,3,4",
"foo,bar,3,4,5",
"fog,bar,2,2,2",
"fgh,bar,3,4,2",
"foo,bar,4,5,6");
my @ordered = ayumoesort(\@data,
{dtype => COND_DTYPE_NUM,
order => COND_ORDER_ASC,
keyno => 2},
{dtype => COND_DTYPE_STR,
order => COND_ORDER_DESC,
keyno => 0});
print "$_\n" foreach @ordered
}
# つづく
0187JAPU04/12/06 14:11:27ID:???
# This code is public domain; I never assert any rights.
# This code is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sub ayumoesort
{
my $dref = shift;
my @cond = @_;
my @sgn = map { -($_->{order}*2 - 1) } @cond; # ASC: +1, DESC: -1
# Schwartz Transform; cf. Effective Perl or ask Google
# equivalent to:
# @tmp = map { ... } @$dref;
# @tmp = sort { ... } @tmp;
# @$dref = map { ... } @tmp;
@$dref = (map { $_->[-1] }
sort {
foreach my $i (0..$#cond) {
my $r;
if($cond[$i]{dtype} == COND_DTYPE_STR) {
$r = $sgn[$i]*($a->[$i] cmp $b->[$i]) and return $r;
} elsif($cond[$i]{dtype} == COND_DTYPE_NUM) {
$r = $sgn[$i]*($a->[$i] <=> $b->[$i]) and return $r;
} else {
die;
}
}
}
map { my $x = $_;
[(map { (split /,/, $x)[$cond[$_]{keyno}] } (0..$#cond)),
$_] } @$dref);
}
0188nobodyさん04/12/06 14:14:23ID:???
>>179-180
# コードは試してないけど、

まとめてソート
sort { (-d "$dir/$a" <=> -d "$dir/$b") or ($a cmp $b) } @files

ループをディレクトリとファイルに分ける
grep {-d"$dir/$_"}@files
grep {-f"$dir/$_"}@files

>>183
File::Find はソートしてくれないよ。
0189nobodyさん04/12/06 16:21:10ID:???
>>188
>>179-180です。<OPTION>で選択するファイル一覧を作っていました。
@files = sort { (-d "$dir/$b" <=> -d "$dir/$a") or ($a cmp $b) } @files; でやりたいことが出来ました。ありがとうございます。
0190nobodyさん04/12/06 16:57:38ID:kMJjfrXb
ぬるぽ
0191nobodyさん04/12/06 16:58:07ID:kMJjfrXb
誤爆ですた
0192nobodyさん04/12/06 17:03:05ID:adgUx9sV

ほれ。
http://himatsubu.fc2web.com/22/fir/ かなりシュールな心理テストでオモロイ。

0193nobodyさん04/12/06 17:26:45ID:???
>>190-192
スレタイ読めない文盲はお帰り下さい。
0194nobodyさん04/12/06 19:43:19ID:???
>>193の発言中に、一部不穏当な表現のあったことをお詫びいたします。
0195nobodyさん04/12/06 19:44:56ID:???
>>193の発言中に、一部不穏当な表現のあったことをお詫びいたします。
0196nobodyさん04/12/06 20:43:45ID:???
>>194-195
連稿はお帰り下さい。
0197nobodyさん04/12/06 21:59:43ID:???
>>194-196
援交はご遠慮下さい。
0198nobodyさん04/12/06 22:54:57ID:???
漏れが「phpがでたらビターーーン」スレと間違えたせいだ
正直スマンカッタ
今は反省している
0199nobodyさん04/12/06 23:45:58ID:PVGalzLM
テキストファイルをopenして表示させるのと
Socketにより他サーバーから読み込み表示させるのとでは
どの程度サーバー負荷は高まるものなのでしょうか?
0200nobodyさん04/12/07 00:27:16ID:J98ZOjsq
perlでプログラミングをしたときのデバッグの方法はコメントアウトして
実行して・・という風な方法しかないのでしょうか

一度perlでcgiの短いプログラム(50行ぐらい)を作ったことがあるんですが、
こんな短いのでもバグをとるのにすごく骨を折りました。
0201nobodyさん04/12/07 00:31:29ID:???
>>200
好きなのを選べ

っ【Google】
っ【検索ワード】
っ【Perl】
っ【デバッグ】
0202nobodyさん04/12/07 00:36:00ID:???
>200
二分検索法って知ってるかい?
アルゴリズムってのは、なにもプログラムを組む時にしか使えないものじゃないぞ。
0203nobodyさん04/12/07 05:39:36ID:???
>>200
そうか?エラーメッセージを読めばどこが悪いかなんてすぐ分かるが。
まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
020420004/12/07 15:33:29ID:???
>>201
文法チェックはブラウザ上でソースを入力するとやってくれる
サイトがあったんで、それを使っていました
(cygwin?がうまくインストールできなかったってのもあります)
コマンドでデバッグをするのと違いはあるんでしょうか

>>202
どんどんせばめていけばいいんですね

>>203
>まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
そのとおりです。なんで500エラーがでるのかが分からなくて
どこも修正してないに、何回も実行してみたりして・・
結局原因のひとつはcgiのファイルのパスをフルパスで書いてたのが
いけなかったんだと思います。ほかにもあったけど少し前なんで忘れてしまった。
0205nobodyさん04/12/07 15:51:02ID:???
>>204
マジレスしてやるから帰ってな。
Perlいれてローカルで動かせ
0206nobodyさん04/12/07 15:51:19ID:9tRllW3i
みなさん、唐突ではありますが、
きれいなコード書いて公開してる人のURL教えてください!
0207nobodyさん04/12/07 16:09:37ID:???
>>206
「perl excellent source code」でググった。
ttp://www.perl.com/pub/q/documentation
0208nobodyさん04/12/07 16:27:59ID:9tRllW3i
>206
んーと、コードが載ってませんね。
きれいなコード見て、学びたいので、
そういう感じでお願いします。
0209nobodyさん04/12/07 16:29:33ID:???
>>206
www.cpan.org。どれがきれいかは知らんがたくさんあるので
いくつかはあるだろ。
0210nobodyさん04/12/07 17:04:28ID:???
私もどれが綺麗か分からないのでご質問させて頂いているんです。。
021120004/12/07 17:38:09ID:???
>>205
コードはインフォシークの無料HPスペースにアップロードして
実行しています。最終的には動作させることができました。

>Perlいれてローカルで動かせ
意図がわからないのですが、これをするとどんな利点があるんでしょうか?
アップロードして実行するのも慣れてくると短時間でできるので。。。
0212nobodyさん04/12/07 17:49:02ID:???
>>211
ボケ防止
0213nobodyさん04/12/07 18:08:01ID:???
>>211
Perl の吐くエラーメッセージを読める

ひょっとして、Perl が行番号入りでエラーメッセージを吐いてくれる
ということを知らなかったりする?
0214nobodyさん04/12/07 18:11:19ID:???
>>211
もし仮に

while (@hoge) {
    処理
}

と書こうとして @hoge を $hoge と書き間違い、さらに $hoge に何かしら文字列やら入ってたら
無限ループ作っちゃうでしょう。

それを鯖にUPして実行したら鯖に負荷がかかりっぱなしになる。
鯖が落ちたら君の責任。共有鯖なら鯖会社だけでなく他の鯖利用者にも迷惑がかかる。

ローカルなら君のPCに負担かかる。君だけが被害を受けるが全て君の責任。

どっちがいいよ?
0215nobodyさん04/12/07 18:29:20ID:Oi1PFFsC
現在進行してるのとは違う話題になりますが、
フォームから受け取ったメールアドレスが携帯電話のメールアドレスかどうか
を判断したいのですが

$nb = $FORM{mail};

if($nb ne $nb !~ /(.*)\@docomo\.ne\.jp/
and $nb ne $nb !~ /(.*)\@ezweb\.ne\.jp/
and $nb ne $nb !~ /(.*)\@(.*)\.vodafone\.ne\.jp/){
   "携帯電話メールアドレスとして処理"
}else{
   "携帯電話以外のメールアドレスとして処理"
}

としてみたのですが、どうも上手くいきません。
(何のアドレスを入れても携帯以外のアドレスとして処理されてしまいます。)
何が間違っているかどなたか教えていただけますでしょうか。
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています