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

Perl コーディング初心者質問コーナー Part36

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/07/14 13:23ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
017513304/07/26 14:29ID:???
>>133です。
突っ込もうとしているログのデータが配列内に無かった場合のみ、という判定方法で正常に動作しました。
ありがとうございました。

$word =~ s/\x81\x40/\t/g;
@words = split (/\t/, $word);
foreach $temp (@line) {
 $temp =~ s/\s*$//;
 @data = split (/\t/, $temp);
 if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) {
  if (!grep $temp eq $_, @new) {
   push (@new, $temp);
  }
 }
}

017613304/07/26 14:35ID:???
正常に動作してなかった・・・。
ちとタンマ。
0177nobodyさん04/07/26 15:15ID:???
>>175
<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o">

$is_there = grep $_ eq $whatever, @array;

だとか

$is_there = grep /$whatever/, @array;

のようなやり方はしないでください。

これらのやり方は遅く(最初に対象が見つかったとしてもすべての要素を
検査していしまいます)、非効率(同じ理由です)で、バグの可能性を含んで
います ($whatheverに正規表現キャラクターがあったりしたら?)。
</q>
017813304/07/26 15:23ID:???
>>177
grepはNGですか、foreachに書き換えることにします。
ちなみに>>175のコードって、これはOR検索になってますね orz
017913304/07/26 18:16ID:???
ようやく動きました。アドバイスありがとうございました。

$word =~ s/ | /\t/g;         #  スペースで区切って入力されたフォームの検索ワードをタブ区切りにする
@words = split (/\t/, $word);    #  検索ワードをタブで区切って配列に入れる
if ($search eq "and") {        #  検索方法がAND形式である場合
  foreach $temp (@line) {      #  配列の数だけ繰り返す
    $temp =~ s/\s*$//;      #  行末の改行コードや空白を取り去る
    @data = split (/\t/, $temp); #  一行取り込んだ部分を分割して配列に格納する
    @check = ();           #  チェック用配列を初期化
    foreach (0 .. $#words) {    #  検索ワードの数だけ繰り返す
      if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) { #  配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在した場合
        push (@check, 1);   #  チェック用の配列に1を入れる
      } else { #  配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在しない場合
        push (@check, 0);   #  チェック用の配列に0を入れる
      }
    }
    $output_flg = 1;         #  データ出力用フラグを用意する
    foreach (@check) {       #  配列の数だけ繰り返す
      if (!$_) {            #  チェック用の配列に0がある場合
        $output_flg = 0;     #  データ出力用フラグを0にする
        last;            #  ループを抜ける
      }
    }
    if ($output_flg) {        #  データ出力用フラグが立っている場合
      push (@new, $temp);   #  検索ワードが存在するログの行を新しい配列に格納する
    }
  }
018013304/07/26 18:17ID:???
} else {                  #  検索方法がOR形式である場合
  foreach $temp (@line) {      #  配列の数だけ繰り返す
    $temp =~ s/\s*$//;      #  行末の改行コードや空白を取り去る
    @data = split (/\t/, $temp); #  一行取り込んだ部分を分割して配列に格納する
    foreach (0 .. $#words) {    #  検索ワードの数だけ繰り返す
      if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) { #  配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在した場合
        $exist_flg = 0;      #  データ存在フラグを用意する
        foreach $_ (@new) {  #  配列の数だけ繰り返す
          if ($_ eq $temp) {  #  ログから取り込んだ一行が新しい配列内にあるデータと一致する場合
            $exist_flg = 1;  #  データ存在フラグを立てる
            last;        #  ループを抜ける
          }
        }
        if (!$exist_flg) {     #  データ存在フラグが立っていない場合
          push (@new, $temp); #  検索ワードが存在するログの行を新しい配列に格納する
        }
      }
    }
  }
}

grepの部分も>>177が提案してくれた方法で書いてみました。
0181nobodyさん04/07/26 18:21ID:QB5gv79+
携帯用のサイトを作っているのですが、質問させてください。ある変数の中に
「DoCoMo 2.0 N900i(c100;TB;W24H12;ser***;icc***) 」 (***はランダムな英数字)
という文字列が入ってるとして、「(」以降を切り捨てて
「DoCoMo 2.0 N900i」だけにするにはどうすればよいのでしょうか?
substrで桁数を指定するしかない?
0182nobodyさん04/07/26 18:26ID:???
>>181
そこで正規表現ですよ。
というか、いろんな方法があるから好きなのを選べばいいと思う。
0183nobodyさん04/07/26 18:27ID:???
s/\(.+\)//
0184nobodyさん04/07/26 19:24ID:84cm3KM0
>>133
どうでもいいけど無駄多いな

@words = /([^ | ]+)/g;
foreach (@line) {
  s/\s+$//;
  @data = split(/\t/);

  $hit = 0;
  foreach $sword (@words) {
    $hit++ if index("$data[1]$data[2]$data[6]", $sword) > -1;
  }

  next if !$hit;

  push(@new,$_) if $search ne 'and' or $hit == $#words + 1;

}

じゃだめか?
0185nobodyさん04/07/26 19:26ID:???
@words = ($word =~ /([^ | ]+)/g);

こうか
018618104/07/26 20:14ID:QB5gv79+
>>182
携帯からでしか確認できないのと今手元に実機がないので
また失礼します。何度もすいません。
$data = s/.+(.+)//;
でいけますかね?これで「(」と「)」にはさまれた部分を削除できる・・・かな?
0187nobodyさん04/07/26 20:28ID:???
>>186
$data =~ s/(.+)\(.+\)/$1/;
018818104/07/26 20:47ID:QB5gv79+
>>187
レスありがとうです。
私はアホなので意味がさっぱりわからないんですが
これそのままコピペしてもいいのかな・・・。
ちょっと拝借して明日動作確認してみますね。
というか>>183さんも今見たらアドバイスくれてたっぽいですね。
こっちも私には難解だけどありがとうです。
0189nobodyさん04/07/26 23:50ID:???
>>133
どうでもいいが、and検索時にログに検索対象の文字列の有無を判定する時に、
配列に0やら1やらを突っ込んで後からチェックするってやり方が俺と同じだ。

わからないときはフリーのソースでも拾って参考にしなさい。
0190nobodyさん04/07/27 00:02ID:???
どうでもいいが、本7か?
019113304/07/27 00:11ID:???
>>133です。
>>184-185氏、そのような書き方もあるのですね。
自分はまだ色々と省略されると見直す際にワケわからなくなるので、
まどろっこしくても極力ああいったソースの書き方をするようにしています。
それらのソースも参考にして、もう少し改善してみようと思います。
とりあえずは動くので失礼します。
ありがとうございました。
0192nobodyさん04/07/27 00:23ID:???
>>191
184-185 は無視しておきましょう。
あと、検索部。
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1)
検索語が跨ぐ場合も考えられますのでご注意の程を。
ex.
$data[1] = '2004/07/27';
$data[2] = 'sage';
$data[6] = 'test test test';
@word = qw|27sa agete|;
0193nobodyさん04/07/27 00:26ID:???
>>181
($foo,$bar) = split(/(/,$aruhensuu);
で、$fooじゃダメか?
0194nobodyさん04/07/27 02:53ID:tzLxOAtQ
入出力ファイルフォーマットが変更になった場合、
関係部分のコーディングを全て修正するのは大変なのですが、
c言語のように、ファイルフォーマットのマクロ定義みたいなことは、perlでは
できないのでしょうか?
0195nobodyさん04/07/27 05:16ID:???
>>194
そういうのは OO 的アプローチで解決する方がスマートだが、
こういうものもある。
http://perldoc.com/perl5.8.4/pod/perlfilter.html
0196nobodyさん04/07/27 10:11ID:lcTiWytf
フォームCGIを、unicode 対応しようとしているのですが、うまくいきません。
Perl のバージョンは、Ver 5.8.0 なので、

フリーのCGIを利用して

�@ CGIにに、 use utf-8; 行を追加
�A CGI中の、 jcode.pl を利用している部分を削除
�B 送信用HTMLをutf-8 に変更

し、送信テストを試みるのですが、受信したメールが文字化けしてしまいます。

レス頂ければ幸いです。
0197nobodyさん04/07/27 10:27ID:???
>>196
レスしてやろう。

>>1-7
0198nobodyさん04/07/27 10:32ID:???
>>196
正直な話、スクリプト改造丸投げスレの方が君に合っていると思う
019918104/07/27 11:40ID:5fKcxtBP
遅くなりましたけど、>>187の方法でうまくいきました。
ありがとうでした。あと>>193さんもありがとう。まだ試してないけど
今後のために保存しておきます。皆様感謝感謝〜 m(_ _)m
0200nobodyさん04/07/27 12:14ID:q+Q9Gs/i
次のようなリストに行を追加するのに、通し番号を付けたいんだが
1111,データ1
1112,データ2
1115,データ5

最大値をとってそれに1を足そうとしたんだけれど
$noに1だけ入ってしまいます。どうも最大値が文字列
扱いされているようです。
どんな感じになおしたらいいだろうか。

while(<IN>){
chomp;
$record{(split(/,/,$_))[0]} = $_;
}
$no = ((((sort keys %record))[-1]));
$no++;
close (IN);
0201nobodyさん04/07/27 12:40ID:???
オレの手元でそのプログラムにそのデータを食わせると
1116になるので、その意味では直す必要はないよ。
ここに書いてない部分がおかしいか入力ファイルがおかしいか
というあたりだろう。もう一度良く見ろ。

特にwhileループ抜けたあとで%recordがどうなってるか、sortのあと
$no++する前の$noの値はどうなってるか、といったあたりを確認
することをオススメする。
0202nobodyさん04/07/27 12:41ID:???
ついでにもう1つ。番号の部分が4ケタ固定ならそれでもいいが、
そうでないならsortは文字列比較がデフォルトなので、<=>を
使った比較を明示しないとおかしくなるよ。
0203nobodyさん04/07/27 12:48ID:5NNnTCFI
从リ ゚д゚ノリ ハァ?
最大値取るだけで、意味不明なことやりすぎ。
↓で十分だろ

while(<IN>){
  if (m/^(\d+),/) {
    $max = $1 if $max < $1;
  }
close (IN);

0204nobodyさん04/07/27 13:20ID:YbDKdELb
再利用するんだろうよ
0205黒死犬 ◆EgxBlf8nvc 04/07/27 14:08ID:???
>>200
外の括弧が余計なのでは?
リストとしてスカラーに代入すると、そのリストの長さが入っちゃいます
0206nobodyさん04/07/27 14:10ID:???
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );

foreach(0..@hoge1 -1){
 if($hoge1[$_] ne $hoge1[1+$_] ){
  push(@hoge3,$hoge1[$_]);
 }
}

foreach(0..@hoge2 -1){
 foreach$wk(0..@hoge3 -1){
  if($hoge3[$wk] eq $_){
   push(@hoge4,$_);
  }
 }
}

結果
@hoge4の中身
"1"
"4"
"5"

質問させて頂きます。
@hoge1、@hoge2の要素を比較して同一だった要素を
@hoge4のように1つだけ取り出す為に上記のようにしてみましたが
効率が悪いような気がします。
もっとスマートに出来る方法はないでしょうか?

020720604/07/27 14:21ID:???
@hoge3はあとで使いますので別ループにしてあります。
0208nobodyさん04/07/27 14:27ID:???
hash使え。

foreach (@hoge1) { $h{$_} = 1; }
@hoge4 = grep {$h{$_}} @hoge2;

一例としてはこんなとこか?
0209黒死犬 ◆EgxBlf8nvc 04/07/27 14:30ID:???
@hoge2、@hoge3 は常にソートされていて、重複した値を含まないのなら

my $m = 0;
my $n = 0;

while($m <= $#hoge2 and $n <= $#hoge3) {
 if($hoge2[$m] < $hoge3[$n]) {
  push(@hoge4, $hoge2[$m++]);
 } else {
  $hoge2[$m] == $hoge3[$n] and $m++;
  push(@hoge4, $hoge3[$n++]);
 }
}

テストしてないので動作に保証出来ません(単にマージしただけだけど)
Perlだと、組み込みのハッシュ使った方が早いかも
0210nobodyさん04/07/27 16:02ID:???
>>206
後はこんなんとか、

@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print sort keys %{{map{($_ => 1)}@hoge1,@hoge2}};
0211nobodyさん04/07/27 16:33ID:???
>>210
それ動かしてみたけど12345になるぞ。
期待している結果は1,4,5だったはず。
021220604/07/27 17:35ID:???
>>208
grepを使って何とか出来ないかと思っていたのですが
hashを利用しての真偽判定でしたか。
大変参考になりました。どうもありがとうございました。
0213nobodyさん04/07/27 17:41ID:???
>>207
@hoge3みたいに重複した要素を取り除いた結果が欲しかったら

@hoge1 = grep(!$h{$_}++, @hoge1);

0214nobodyさん04/07/27 17:47ID:???
↑とperlメモのコピペを貼るやつ
0215nobodyさん04/07/27 17:53ID:???
perl でリモートデバッグやっている人います?
いるとしたらどんなツールを使っていますか
0216nobodyさん04/07/27 17:59ID:???
>>211
あ、そか、勘違い。
すません、じゃこれ

@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
0217nobodyさん04/07/27 18:03ID:???
>>213
重複した要素を取り除くなら、これ

@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{!exists ${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
0218nobodyさん04/07/27 18:08ID:???
>>217
重複した要素を取り除くんじゃなくて、
@hoge1にない@hoge2のみの抽出、だな
0219nobodyさん04/07/27 19:35ID:OzHvZIRF
ちょと質問です。

http://tech.millto.net/~pngnews/kndh/PngSpec1.2/PNG-CRCAppendix.html

リンク先のアルゴリズムを単純にPerlに書き換えてみたんですが
全然CRC32にならなくお手上げになってしまいました。
原因はどこにあるのでしょうか?
ご教授の程宜しくです。

一応ソース貼っておきます。
テストなんでいきなり文字列渡してsplitして、最後は整形して返してますが。

print &getCRC('string');

sub getCRC {
 my ($c, $n) = 0xffffffff;
 unless (defined @crcTable) {
  for (0..256) {
   $crcTable[$_] = $n = $_;
   $crcTable[$n] = $crcTable[$n] & 1 ? 0xedb88320 ^ ( $crcTable[$n] >> 1 ): $crcTable[$n] >> 1 for 0..7;
  }
 }
 $c = $crcTable[ ($c ^ $_) & 0xff ] ^ ($c >> 8) for split //, shift;
 return sprintf "%08x", $c ^ 0xffffffff;
}
022021904/07/27 19:39ID:???
s/ for (0..256) / for (0..255) /;
0221nobodyさん04/07/27 19:59ID:???
>>219-220

# やはり Pure Perl 実装に需要があるのかな…。

以前同じものを作ってたヤツ。動くかどうかは知らん。:p

my @crc = (0..255);
for my $c (@crc) {
  $c = $c & 1 ? 0xedb88320 ^ ($c >> 1) : $c >> 1 for 0..7;
}

sub crc {
  my $str = pop;
  my $len = length $str;
  my $pos = 0;
  my $crc = 0xffffffff;

  # CPU を食うが恐らく省メモリ
  $crc = $crc[ ($crc ^ ord(substr $str, $pos++, 1)) & 0xff ] ^ ($crc >> 8)
    while $len--;

  # メモリを食うが恐らく高速
  # $crc = $crc[ ($crc ^ $_) & 0xff ] ^ ($crc >> 8)
  #  for unpack 'C*', $str;

  pack 'N', ~$crc;
}
0222nobodyさん04/07/27 21:00ID:cIaHUHzz
>>203
すみません、最大値を取る参考にしようとしていますが、
コードがシンプルすぎて、私のような初心者には
どういう動作をしているのか、わからないので
少し解説していただけないでしょうか?

m/^(\d+),/ この部分がどういう動作をしているのかがまず、わからないのですが。

それからどういう仕組みで$1が出てきて、中に
何が入ってくるのでしょうか?

それから$maxに$1という変数の値を入れた後に
if で$max < $1という条件比較をしてますが、真
だったときの実行内容が省略されていてわかりません。何が省略されているのでしょうか?
0223nobodyさん04/07/27 21:10ID:AqRc0k7e
*.csv形式のファイルに書き込んで、Excelで開いた時について、質問です。

以前、ここのスレッドで教えて頂いた内容を参考に

open(LOGFILE,">>log.csv");
print LOGFILE "\"あああ\nいいい\"";
close LOGFILE;

と記述し、Excelで開いた場合にもセル内で
改行が行われるようになりました。
ですが、改行して保存されるようにはなったのですが、
-----------
あああ・
いいい
-----------
のように、改行の部分に「・」と言った
不要な文字が表示されてしまいます。

これを、表示させないようにするにはどのようにすれば良いのでしょうか?
0224nobodyさん04/07/27 21:14ID:???
>>222
> m/^(\d+),/
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm

> if で$max < $1
http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm#6-7
022520004/07/27 21:35ID:???
>>201
すみません、書いてない部分の問題みたいです。
$no++する前の中身は空でした。orz
022620004/07/27 21:48ID:cIaHUHzz
他のところも、書きますので変な部分があれば、ご指摘願えませんでしょうか?

$genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';# 会場データファイル名
$act = "edit";
###### 会場データの読み込み ######
  &lock;
  open KAIBA,"$kaibadata" or die &error("会場ファイルが開けません"); 
  @kaiba = <KAIBA>;
   my $n;
  $n = 0;
  foreach $kaiba(@kaiba) {
  chomp $kaiba;
  ($kai_id,$kai_name,$kai_tan,$kai_syoku,$kai_busyo,$kai_tel,$kai_fax) = split(/<>/,$kaiba);
  if ($kai_name eq $kaibamei){$act = ""; print "同一の会場名が存在します。<br>";
  print "既存会場名・・・$kai_name<br>\n";
  print "入力した会場名・・・$kaibamei<br>\n";
  print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
  &unlock;
  }
 $kai_tel =~ tr/0-9//cd;
  if ($kai_tel eq $kaibatelno){$act = ""; print "同一電話番号の会場がすでに存在します。<br>\n";
  print "既存会場電話番号・・・$kai_tel<br>\n";
  print "入力電話番号・・・$kaibatel<br>\n";
  print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
  &unlock;
  }
  }
 }
長いのでいったん切ります。
022720004/07/27 21:50ID:cIaHUHzz
次にこれがきます。

### 追加会場ID生成
while(<KAIBA>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
$new_kai_id = (((sort keys %record))[-1]);
$new_kai_id++;
close (KAIBA);

ここで、$new_kai_idの中身が1になってます。
022820004/07/27 21:51ID:cIaHUHzz
後、これがサブルーチンです。
###### ロックファイル処理 ######
sub lock {
 local($flag) = 0;
 foreach (1 .. 5) {
  # ロックファイルが存在すれば1秒待つ
  if (-e $lockfile){ sleep(1);}
  
  # ロックファイルが存在しなければ生成する
  else {
   open (LOCK,">$lockfile");
   close (LOCK);
   # ロックに成功したらフラグを立てループを抜ける
   $flag = 1;
   last;
   }
  }
 }
### --- ロックファイル処理 END --- ###

###### ロックの解除 ######
sub unlock {
  if (-e $lockfile) {unlink($lockfile);}
}
### --- ロックの解除 END --- ###
0229黒死犬 ◆EgxBlf8nvc 04/07/27 21:51ID:???
>>219
Perlのビット演算はちょっと特殊な様です
vec 関数とか使ってみると幸せになれるかも
023020004/07/27 21:52ID:cIaHUHzz
それから、サンプルデータの中は


100001<>○○ホール <>鈴木<>青 <>777<>0552-99-0000 <>0552-99-0000
100002<>○○公園 <>佐藤 <>黄 <>777<>044-999-0000 <>044-999-9999
100003<>○○○第2別館 <>田中 <>白 <>777<>03-9999-0000 <>03-9999-9999
1<>○○駅前広場<>テスト<>テスト<>777<><>
1<>test<>test<>test<>default_bumon<>111<>111
1<>テスト<>テスト<>テスト<>596<>1<>2

このような感じです。
0231nobodyさん04/07/27 21:55ID:???
>>224
ありがとうございます。
見てみます。
023221904/07/27 21:55ID:???
>>221
どーもです。
返り値を
unpack 'H*', $crc;
でバッチリでした;-)
ありがとです。

>>229
どーもです。
幸せを探してきます。
023320004/07/27 22:03ID:???
ちなみに、KAIBAとなっているのはKAIJOUだとちょっと長いのと、カイバの方が2ちゃんちっくな
読み方でおもろそうだったので。

別に日本語が不自由なわけじゃないですよ。
0234nobodyさん04/07/27 22:04ID:???
>>230
%recordの中身みたか? 多分からっぽだと思うのだが。
KAIBAファイルハンドルはopen直後の
  @kaiba = <KAIBA>;
で全部読み出されてしまっているハズ。

あとこの問題とは関係ないがそのロックは全くなってない
ので勉強して書き直すこと。
0235nobodyさん04/07/27 22:06ID:???
ロックどころか全部なってないと思うのは漏れだけか?
023620004/07/27 22:20ID:cIaHUHzz
>>234
ありがとうございます。
  @kaiba = <KAIBA> で
<KAIBA>の中身が@kaibaにコピーされると思って
おりました。取りだされていたのですね。

ロックの方はなんとか勉強しなおそうと思います。
0237nobodyさん04/07/27 22:32ID:AYL0W0ev
>>223

binmodeすればいいかな

>>102 のリンク先を参照
023820004/07/27 23:01ID:cIaHUHzz
while(@kaiba) だと
応答が返ってこなくなるんですね。
もう一度開きなおすしかないのでしょうか。
0239nobodyさん04/07/27 23:10ID:???
もっと基本的なところから勉強しなおせ。
実際に組むのはそれからだ。
無限ループ起こすような奴は一から出直せ。
0240nobodyさん04/07/27 23:12ID:???
>>238
お前全部なってない。本買って勉強してから来い。
0241nobodyさん04/07/27 23:48ID:5NNnTCFI
>>238

$genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';

とりあえず、cgiとdataは違うディレクトリに置いとけよ

ロックはお前みたいな初心者は素直にflock使っとけ。
XPならflock使えるし
0242nobodyさん04/07/28 06:05ID:GXYYbYLC
昨年の学校の夏休み中 親の店のHPを作りました。
CGIだけ詳しい友達に作ってもらったのだけど
この度HPリニューアルしたら、CGIだけがうまくいきません。
(アクセス権等は変更しました)
何かいじったわけではないし、その部分はそのままにしておいてはずなのに
(そこだけはそのままおいておいて新しいページとリンクしただけですが)
nobody@××.ne.jpという中身のない注文書がきます。
今ではHP注文もきて、傾いている店も繁盛してきたのに
どうしたらいいか・・・親の視線がいたいです
助けてください
0243nobodyさん04/07/28 06:15ID:???
>>1読め
0244nobodyさん04/07/28 06:17ID:???
その友人に聞け。
ここで聞くのは筋違い。
じゃなければ金出してプロに頼め。
0245nobodyさん04/07/28 14:36ID:???
>>244はきついい方だけど、ちゃんとした問題解決だよ
>>242はもう少しがんばれ
0246nobodyさん04/07/28 16:26ID:???
>>245
むしろ普通だと思うが
友達が作ってくれたんだからその友達に聞くというのが、普通の人間の行動だと思うが
0247nobodyさん04/07/28 18:30ID:+xurfTPE
perlでCGIを組んでいます。
そのCGIにアクセスがあったときに、
そのフォルダ内のHTMLファイルを返すにはどうしたらいいのでしょうか?
ググろうにも・・・どうキーワードを打ち込んでいいのか分からないのでここへ来ました。

# 今はprintでJavaScriptを含むHTMLを出力して、
# そのJavaScriptで目的のHTMLファイルを読み込ませているのですが、
# どうも・・・
0248nobodyさん04/07/28 18:40ID:???
>>247
3回ゆっくり読みましたが、
何言ってるかわかりませんでした。
0249nobodyさん04/07/28 18:43ID:???
>>247
ジャンプさせる
0250nobodyさん04/07/28 18:45ID:???
>>247
キーワード「open」
0251nobodyさん04/07/28 18:47ID:???
>>247
ここ書込んだときに「しばらくおまちください」みたいなページ出たよな?
それが答えの1つだ。
あとは。。。ロケーションヘッダでぐぐれ
0252nobodyさん04/07/28 19:00ID:???
>>249-251
と言うことは、>>248は日本語が読めないヴァカと言うことでつか?
0253nobodyさん04/07/28 19:23ID:H19oR7EL
perlで作成したCGIを10分事に自動実行させたいと考えています。
そこでcronを使って実現しようとしているのですがうまくいきません。

■動かしたいファイル:xxx.cgi
(4行目で require 'abcd.pl'; を記述してます)

■実行した手順
telnetでログイン
 ↓
crontab -e
 ↓
0-59/10 * * * * /home/www/●●●/public_html/xxx.cgi
 ↓
:x で終了

すると、line 4. (実行しているファイルの4行目)がエラーだと
いう記述のメールは届いてしまいます。
メールの原文は下記の通りです。
Can't locate ./abcd.pl
in @INC (@INC contains: /usr/local/lib/perl5/site_perl/5.005/i386-freebsd
/usr/local/lib/perl5/site_perl/5.005 . /usr/libdata/perl/5.00503/mach
/usr/libdata/perl/5.00503)
at /home/www/●●●/public_html/xxx.cgi line 4.

上記の通りなのですが、
うまく実行させるにあたりご教授願えればと思います。
025424704/07/28 20:05ID:???
ありがとうございます。

>>248
ごめんなさい。

>>249-250
それでググってみます。

>>251
しばらくお待ちくださいから飛ぶのはmetaタグのやつですよね。
JavaScriptでもmetaタグでも、どっちにしてもページを介さなければならないのが
ちょっと・・・

「ロケーションヘッダ」でもググってみます。
0255nobodyさん04/07/28 20:09ID:???
>>253

エラーの意味は分かるよな?
cronの実行ユーザーにパスがないんだよ
絶対パスで書くか、use libでパス通せ
0256nobodyさん04/07/28 20:10ID:???
つーかcronで動かしてる時点で、CGIじゃねーんだけどな
0257nobodyさん04/07/28 23:04ID:???
>>253
それのどこがperlのコーディングの質問なんだよ。
0258nobodyさん04/07/28 23:28ID:???
>>257
スレタイ読めない半島の人間なんだよ。許してやれよ。
0259nobodyさん04/07/29 07:52ID:Y1hnbGEZ
>>234
Whileの前でもう一度ファイルを開いたら
なんとか動きました。これでお客さんになんとか見せれそうです。

ありがとうございました
0260nobodyさん04/07/29 09:03ID:???
PERLのオブジェクト指向について

通販サイトの注文CGIをPERLで作っていて疑問。オブジェクト指向で書き上げたいんだけど、
とりあえずEcomという名前のモジュールを作って、それのコンストラクタで単価、商品名等の基本部分を
設定。Ecomのコンストラクタが返すオブジェクトの初期プロパティに商品名とかのハッシュリファレンスを持たせる。

で、疑問なのはこのオブジェクトは当然モジュールEcomのメソッドを全て使用できるわけだけど
一体この場合のメソッドって一体何?

クラスにおけるメソッドの役割みたいなものがはっきりしない(理解できない)
っていうかどういう意味合いで使えばいいのかというか;ちょっと例を出してみる。
1.コンストラクタが返すオブジェクトの強化、改造のため
2.コンストラクタが返すオブジェクトのプロパティを参照して何らかの処理をして、呼び出し元に値を返す。
3.?思いつかない

未完成であるオブジェクトを完成させるのがクラスのメソッドなのか?みたいにも思うけど、
イマイチ。どう捉えれば一番すんなりいくのかな?
0261nobodyさん04/07/29 09:44ID:???
コーディング 【coding】

プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)
0262nobodyさん04/07/29 14:11ID:???
>>260
http://www5a.biglobe.ne.jp/~n_rieko/perl/10.htm
0263nobodyさん04/07/29 14:34ID:???
>>260
http://perl.infoware.ne.jp/documents/perlboot.ja.html
http://perldoc.jp/docs/perl/5.8.0/perltoot.pod
http://perldoc.jp/docs/perl/5.8.0/perltooc.pod
http://www.melma.com/mag/85/m00014785/a00000001.html

あと駱駝と黒豹と Effective Perl 。
026426004/07/29 17:04ID:???
>>261
ごめんよ
>>262-263
ありがとう見てみるよ。

ところでperldocってperlの仕様書みたいなもの?和訳もあるの?
0265nobodyさん04/07/29 17:55ID:???
>>264
Perl の配布パッケージに含まれている公式な説明書。> perldoc
和訳は駱駝本がそうであるとも言えるし、perldoc.jp のように有志の
手による部分訳もある。
026652204/07/29 19:47ID:???
駱駝本って高いの?
0267nobodyさん04/07/29 19:50ID:???
>>266
>>6を1行ずつ声に出して三唱。
_| ̄|○
0268nobodyさん04/07/29 19:57ID:???
267 名前: nobodyさん [sage] 投稿日:04/07/29 19:50 ID:???
>>266
>>6を1行ずつ声に出して三唱。
_| ̄|○
0269nobodyさん04/07/29 20:38ID:???
>>259の客がもの凄く可哀想だ。
0270nobodyさん04/07/29 21:19ID:???
>>269
デモで見せるだけならまだいいが、ロックあのまま
で予約になんか使った日には...
0271nobodyさん04/07/29 21:31ID:???
このDBはロックだ。そしてこのデモを目にした客たちもロックだ。
0272nobodyさん04/07/30 12:42ID:As0li0gB
Perlで配列に入っている要素の数を知りたい場合ってどうやるんです?
[0]から順に数字が入っている事が前提でかまいませんので。
0273nobodyさん04/07/30 13:07ID:???
>>272
$n = $#array + 1;
か
$n = @array;
配列はスカラコンテキストだと要素数を返す。
0274nobodyさん04/07/30 15:59ID:???
>273
Thx.ありがとう。
■ このスレッドは過去ログ倉庫に格納されています