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

【Perl】初心者コーナーPart9

レス数が1000を超えています。これ以上書き込みはできません。
0001名無しさん@お腹いっぱい。01/12/28 23:21ID:SPLRvqQi
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
0930848402/02/21 21:36ID:39ejQiBa
どんなにスゴイんだ?
韓国でも翻訳して発売されるらしい。
http://www.puchiwara.com/hacking/
うにゅ。
0931名無しさん@お腹いっぱい。02/02/21 21:37ID:???
>>930
みんながっかりしてたよ。
0932名無しさん@お腹いっぱい。02/02/21 21:44ID:xFoRv15a
掲示板全部CGIをeucでつくって
そのままeucでhtmlを出力してるんですが、
エンコード自動選択でsjisになってしまいます。
metaタグでちゃんと宣言してるんですけど。
なんか他にすべきことありますか?
093393202/02/21 21:46ID:xFoRv15a
なんか日本語変だった。
掲示板CGIを関連ファイル全部EUCで作って...です。
0934名無しさん@お腹いっぱい。02/02/21 21:47ID:???
>930
うちで見るとこんな感じ

930 名前:8484 投稿日:2002/02/21(木) 21:36 ID:39ejQiBa
どんなにスゴイんだ?
韓国でも翻訳して発売されるらしい。
http://www.puchiwara.com/hacking/ [ブラクラ]
うにゅ。
0935名無しさん@お腹いっぱい。02/02/21 22:41ID:???
>>932
ttp://tohoho.wakusei.ne.jp/wwwxx005.htm

ここが参考になるかと。
でもいろんなブラウザで試しておかしくなるなら、metaタグか、CGIの出力も疑うべきです。
0936名無しさん@お腹いっぱい。02/02/21 22:58ID:???
>>927
>>925のいうように、スクリプトもデータもEUCにしときましょう。
ttp://tohoho.wakusei.ne.jp/wwwperl1.htm#Kanji
0937名無しさん@お腹いっぱい。02/02/22 00:18ID:Ednlkjpe
1Gくらいのtextfileを読み込んで処理しようとするとout of memoryになってしまいます。
何とか分割して処理できないでしょうか?読み込んだ後は単に文字列検索したいだけなんですけど・・・・
0938名無しさん@お腹いっぱい。02/02/22 00:20ID:???
>>937
>textfileを読み込んで処理しようとすると

どういう状態?
0939名無しさん@お腹いっぱい。02/02/22 00:29ID:???
>937
興味あるな。
どんなデータ?

繰り返し同じものが出てくる場合はKeyにして別DBにする、っていう
リレーショナル的な分割しかないと思うけどね。
094093702/02/22 00:45ID:Ednlkjpe
A、T、G、Cのランダムな繰り返しから構成される
遺伝子の配列データです。その中から特定の配列を検索して抽出するスクリプトを
書きたいのです。無理かな。。。
単純にfileをopenして配列変数にぶちこんで検索をかけ・・・を繰り返しているんですが
途中で止まってしまいます(当たり前か)。
0941名無しさん@お腹いっぱい。02/02/22 00:45ID:???
>>940
readで何バイトかごとに読めば?
0942名無しさん@お腹いっぱい。02/02/22 00:47ID:???
>940
Cで書くべきだと思うよ。
094393702/02/22 00:52ID:Ednlkjpe
>941
ありがとうございます。さっそくやってみます。
0944名無しさん@お腹いっぱい。02/02/22 01:22ID:???
>>932
print "Content-Type: text/html; charset=EUC-JP\r\n\r\n";
0945名無しさん@お腹いっぱい。02/02/22 01:31ID:???
ぷっ,遺伝子データをPerlで処理するのか。
そんな大きな規模なら別の言語で最適化しつつやっても3日ぐらいかかるのが普通じゃないの?
0946名無しさん@お腹いっぱい。02/02/22 01:38ID:???
$| = 1;
って必要あるんですか?よく意味が分かりません。
グーグルで調べようにも""囲みでもヒットできないので困ります。
0947名無しさん@お腹いっぱい。02/02/22 01:46ID:???
>>937
よく知らんのだけど、bioperlって使えないのかな?
0948名無しさん@お腹いっぱい。02/02/22 01:54ID:???
>>946
foreach(1..5) {
print "$_:";
sleep 1;
}

$|=1;

foreach(1..5) {
print "$_:";
sleep 1;
}
ってやってみ。
0949名無しさん@お腹いっぱい。02/02/22 02:02ID:???
>>946
$| の説明はperlvarに載ってる。
ぐぐーるする前に手元のperlマニュアル読もう。
095093702/02/22 02:05ID:Ednlkjpe
>941
どうやらうまくいったようです!!
ありがとうございました。
0951名無しさん@お腹いっぱい。02/02/22 04:49ID:???
(´-`).。oO(そろそろ次スレかな…)
0952_gunzip02/02/22 08:24ID:???
>>940
http://bioperl.org/
bioperlのBio::Tools::Blast, StandAloneBlast辺りのモジュールを使って
BLAST, FASTA辺りの吐くサーチ結果をパースするのが一番簡単&&高速だと思うな。

$in = new Bio::Seq(-id=>"test query", -seq=>"GAAG");
$blast_report = $factory->blastall($in);

詳しくは付属のドキュメント参照ね。
0953名無しさん@お腹いっぱい。02/02/22 18:07ID:???
_gunzipタン久しぶり〜
0954名無しさん@お腹いっぱい。02/02/23 11:46ID:???
デザインが似てるとパクリになるんですか?
0955848402/02/23 11:59ID:gBGRhxGb
         おにぎりワッショイ!!
     \\  おにぎりワッショイ!! //
 +   + \\ おにぎりワッショイ!!/+
                            +
.   +   /■\  /■\  /■\  +
      ( ´∀`∩(´∀`∩)( ´ー`)
 +  (( (つ   ノ(つ  丿(つ  つ ))  +
       ヽ  ( ノ ( ノ  ) ) )
       (_)し' し(_) (_)_)
http://www.puchiwara.com/hacking/
韓国版ってでるらしいけど、どんな内容になるんだ?
この手のものが韓国に翻訳されるなんて初めてでは?
0956名無しさん@お腹いっぱい。02/02/24 00:15ID:5vPUCqZK
日付から(2002/2/24)から、1970からのシリアル秒?を計算したいんすけど、
だれか知りませんか?
0957名無しさん@お腹いっぱい。02/02/24 00:17ID:???
>>956
ルーチンくまなきゃだめです。
シリウス歴か何かで検索。
095895602/02/24 00:28ID:5vPUCqZK
>>957
ルーチン組むって、
1970から、指定年数まで、閏年のチェックするって感じになります?
なんか、もっとスマートな方法あるかとなぁ〜と思って探してたんですけど、
どでしょ
0959名無しさん@お腹いっぱい。02/02/24 01:37ID:???
>>956
use Time::Local;
$time = timelocal($sec,$min,$hour,$mday,$mon,$year);
0960名無しさん@お腹いっぱい。02/02/24 02:07ID:???
>>959
Non Module派なんでねw。
0961名無しさん@お腹いっぱい。02/02/24 02:09ID:???
>960
モジュールのコード使えば?
0962名無しさん@お腹いっぱい。02/02/24 02:15ID:1IBSQesy
>>960
time::localは標準モジュールだよ?
0963名無しさん@お腹いっぱい。02/02/24 02:15ID:???
>>962
Non Module派なんでねw。
0964名無しさん@お腹いっぱい。02/02/24 02:50ID:???
>>963

>>961
096595602/02/24 03:57ID:5vPUCqZK
とりあえずこんなふうで、作ってみたけど、
ループに2個あんのが、どうもなぁ〜
こんなんしか無いかね?


sub date2Time
{
  local ( $year , $mon , $day , $hour , $min , $sec ) = @_ ;

  $days = $day - 1 ;

  foreach ( 0 .. $mon - 2 )
  {
    $days += (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[ $_ ] ;
  }

  foreach ( 1970 .. $year - 1 )
  {
    if ( ( $_ % 4 == 0 && $_ % 100 != 0 ) || $_ % 400 == 0 )
    {
      $days += 366 ;
    }
    else
    {
      $days += 365 ;
    }
  }

  $seconds = $days * 86400 ;
  $seconds += $hour * 3600 ;
  $seconds += $min * 60 ;
  $seconds += $sec ;
  $seconds -= 32400 ;

  return $seconds ;
}
0966---02/02/24 04:37ID:???
> 965 チョットこんぱくとにするとこんな感じかナー。
sub date2Time{
   local( $year, $mon, $day, $hour, $min, $sec )= @_ ;

   $days= $day - 1 ;

   for ( 0 .. $mon - 2 ){
       $days += (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$[+ $_] ;
   }

   for ( 1970 .. $year - 1 ){
       $days+= (( $_ % 4 == 0 && $_ % 100 != 0 ) || $_ % 400 == 0) ? 366 : 365;
   }

   $seconds = $days* 86400;
   $seconds+= $hour* 3600;
   $seconds+= $min * 60;
   $seconds+= $sec;
   $seconds-= 32400;

   $seconds;
}
0967名無しさん@お腹いっぱい。02/02/24 13:27ID:???
>>965-966
おしぃ〜。あとちょっと。$yearがうるう年だったとき、ちょびっとずれるみたい。

use POSIX;
srand();
foreach(1..100) {
  $y = 1970 + int(rand(40));
  $m = int(rand(12)) +1;
  $d = 1;

  $t = POSIX::mktime(0, 0, 0, $d, $m-1, $y-1900);
  $t2 = date2Time($y, $m, $d, 0, 0, 0);
  printf("%4s/%2s/%2s : $t %s= $t2\n",$y,$m,$d, $t==$t2 ? "=" : "!");
}
0968名無しさん@お腹いっぱい。02/02/24 17:04ID:KO+bj0za
正規表現で、質問があります。
<select name="hoge">
<option>
<option>
</select>

<select name="hoge">

</select>

にヒットする表現を知っている方がいましたらよろしくお願いします。
0969名無しさん@お腹いっぱい。02/02/24 17:29ID:???
>>968
格納されてるのは1変数?リスト?それによる。
0970名無しさん@お腹いっぱい。02/02/24 17:39ID:???
レスありがとうございます!

具体的には

HTML文を$bodyという変数に読み込んで、
<select name="hoge">
<option value="fuga">商品名1
<option value="fuga1">商品名2
</select>
で二つに切ろうとしているんですが、
($top,$bottom) = split '<select(.|\n)*</select>',$body;
とやってもうまくいきません。

$bodyに格納されているのはただのHTML文です。
よろしくお願いします。
0971名無しさん@お腹いっぱい。02/02/24 17:44ID:???
そもそも正規表現形式ではない。
他人の正規表現って解析面倒だから・・・。

/'<select.*?<\/select>'/

とか。
0972名無しさん@お腹いっぱい。02/02/24 17:53ID:???
ありがとうございます。
試してみました。
でもやっぱり$bottomの方に何も格納されません。

$topの方には<select が出てくる直前までの文が格納されるんですが・・

>そもそも正規表現・・
囲む記号は何でもいいらしいというのを本で読んだので、エスケープ
するのが面倒なんで、''でくくっていました。でも普通使わなさそうなので
素直に//でくくります。

もっと、試行錯誤してみます。アドバイスがありましたらよろしくお願いし
ます。
0973名無しさん@お腹いっぱい。02/02/24 18:27ID:???
自己解決しました。

/<select.*<\/select>/s,$body,2;
とやれば出来ました。

(.|\n)使っていたのがおかしくなる元だったのかな?
ひまになったら考えてみます。

ありがとうございました。
0974名無しさん@お腹いっぱい。02/02/24 18:44ID:oPNaAPLP
質問です。

Perlで書いたプログラムが遅いと言われた場合、
PHPに移植すれば高速化できるものなのでしょうか?
0975名無しさん@お腹いっぱい。02/02/24 18:56ID:???
当然処理の内容によります。
劇的な速度の変化など期待するだけ無駄です。
0976名無しさん@お腹いっぱい。02/02/24 19:02ID:???
>>973
> 囲む記号は何でもいい
区切り文字に//以外を使用するなら、m演算子が要る。
即ち、//が区切り文字の時のみm演算子省略可能。
0977名無しさん@お腹いっぱい。02/02/24 19:07ID:???
>>973
?外すと最大マッチするから気をつけてね。
0978名無しさん@お腹いっぱい。02/02/24 20:54ID:???
質問です.
バイナリとして読み込んだテキストファイルを処理して出来た文字列があります.
この文字列の末尾の改行を取り去りたい場合,
s/\x0D?\x0A?$// とする以外無いのでしょうか.
chompはどうも\x0Aしか消してくれないみたいなので,
改行コードが\x0D\x0Aだった場合は\x0Aのみが消されて\x0Dが残ってしまいます.

s/\x0D?\x0A?$// より良い方法があればご教示ください.
OSはWindows2000,PerlはActivePerlとPerl for Cygwinを使っています.

$_ = "str\x0D\x0A\x0D\x0A";
open(OUT_BIN, "> ./out_bin.txt") or die;
binmode(OUT_BIN);
chomp;
print OUT_BIN;
close(OUT_BIN);
0979名無しさん@お腹いっぱい。02/02/24 20:56ID:???
>978
binmodeをコメントアウトしたらうまくいかない?
0980名無しさん@お腹いっぱい。02/02/24 20:57ID:???
>>978
substr($data,length($data)-2,2):
0981名無しさん@お腹いっぱい。02/02/24 21:19ID:???
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 |   次スレ立てて!!  .|
 |_________|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
098297802/02/24 21:32ID:???
即レスどもです.

>>979
混乱させてしまったようで申し訳ありません.
テキストとして出力すると出力時に\x0A→\x0D\x0Aの変換がされてしまうので,
結果がわかりやすいようにサンプルコードではbinmodeしておきました.

実際にやりたい事を書いておきます.大崎氏の
「ファイルの最後の数行だけ表示する(http://www.din.or.jp/~ohzaki/perl.htm#File_Tail)」
を改造して「ファイルの最後の数行を『逆順に取り出す』」スクリプトを作っているのです.
取り出すところまでは書けたのですが,取り出した行の改行コードがchompでは取れない.
そこで質問したというわけです.


>>980
どもです.しかし一応改行が\x0D\x0Aでない場合(\x0Aとか)も考えておきたいのです.
0983名無しさん@お腹いっぱい。02/02/24 21:42ID:???
>>978
DOS改行が入力される可能性がある場合は、>>978の通りにやってます。
s/\r?\n$//;
こんなかんじー。
0984名無しさん@お腹いっぱい。02/02/24 21:59ID:???
1 0 0 0 ま で 平 然 と 質 疑 応 答 が 繰 り 返 さ れ る ス レ を 目 指 そ う ょ
0985名無しさん@お腹いっぱい。02/02/24 22:22ID:???
次スレ建てちゃった。
【Perl】初心者コーナーPart10
http://pc.2ch.net/test/read.cgi/php/1014556702/
0986名無しさん@お腹いっぱい。02/02/24 22:29ID:???
>985
お気に入りに入れて移動しマスです。。。。
098797802/02/24 22:29ID:???
>>983
ありがとうございます.一応支障は無いので私もこのままいく事にします.
答えてくれたみなさん,どーもです.

>>985
乙カレー.
098897802/02/25 00:31ID:???
うわ,つーかPerlメモの「改行コードを削除する」にしっかり書いてあった…….
お騒がせしてすまんかった.抜けてるなー,おれ.
0989名無しさん@お腹いっぱい。02/02/25 12:34ID:xTyCNQEK
つかぬことをお伺いします。
既にログに記録されている数桁の文字列を、
出力時にカンマやピリオドで区切ることは可能なのでしょうか?

例えば
"19800"とログに記録されているものを19,800として出力、
或いは
"20020224"とログ記録されているものを2002.02.24として出力、

いかがでしょうか、
もし可能でしたら方法を教えてもらえると大変助かります。
0990名無しさん@お腹いっぱい。02/02/25 13:00ID:???
>989
>>3のリンク先の
http://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma
ここにカンマ区切りのことが書いてある。

日付の方は
$day =~ s/(\d{4})(\d{2})(\d{2})/$1\.$2\.$3/;
でいいだろ。
0991名無しさん@お腹いっぱい。02/02/25 13:07ID:ZVFFw9ik
1 while ($str =~ s/^(\d+)(\d{3})/$1,$2/);
で、数字にコンマをつけます
099298902/02/25 16:29ID:xTyCNQEK
ありがとうございます。>990さん、991さん
望んでいたとおりの完璧に動きを得ることができました!
0993出来の悪い子02/02/25 17:11ID:KjItHBP9
出来の良いお前らに質問です

cgiにプルダウンでパラメータを渡そうとしています
XXX.cgi?year=2002&month=02&day=25
という形にはなったのですが
cgi側が吐き出す結果$Todayは -- という形になります

$day = $in{"day"};
$month = $in{"month"};
$year = $in{"year"};
$Today = $year . "-" . $month . "-" . $day;
print $Today

どこらへんの記述を見直せば良いでしょうか?
ヒントよろしくお願い致します。
0994名無しさん@お腹いっぱい。02/02/25 17:18ID:???
>993
このへんかな?

>出来の良いお前らに質問です
0995名無しさん@お腹いっぱい。02/02/25 17:19ID:???
>993
$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
foreach $pair (@pairs){
($key,$value) = split(/=/,$pair);
$in{$key} = $value;
}

この辺。
肝心な部分が載ってねーじゃねーか。
だから出来が悪いって言われるんだ。
改善を要求しる!
0996名無しさん@お腹いっぱい。02/02/25 17:21ID:???
ふが
0997名無しさん@お腹いっぱい。02/02/25 17:22ID:???
ほんとにできがいいなー
0998名無しさん@お腹いっぱい。02/02/25 17:22ID:???
。。。。。
0999名無しさん@お腹いっぱい。02/02/25 17:23ID:???
あ
1000名無しさん@お腹いっぱい。02/02/25 17:23ID:???
       / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       | 1000
   ∧ ∧ |/\_________
   (,,゚Д゚)____.
   (つ/~ ※ ※ \
   /※ ※ ※ ※ \
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。