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

【Perl】初心者コーナー Part18

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

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

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

CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0002nobodyさん02/11/20 22:05ID:???
[過去ログ]
Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 知らん
Part15 http://pc.2ch.net/test/read.cgi/php/1028816385/
Part16 http://pc.2ch.net/test/read.cgi/php/1032070299/
part17 http://pc.2ch.net/test/read.cgi/php/1034583844/

[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
0003nobodyさん02/11/20 22:07ID:???
perl -F, -ane 'print @F[2];' kyoto.csv
とすると表示されますが、
perl -F, -ane 'print @F[4];' kyoto.html.csv
……
perl -F, -ane 'print @F[10];' kyoto.html.csv
は表示されません。perlって●を認識するのでしょうか?
0004nobodyさん <sage>02/11/20 22:29ID:???
>>3
●って何よ。

0005nobodyさん02/11/20 22:33ID:???
前すれ>>991
Socketを使わないとむりぽ。
がむばってネ。
0006前スレ99102/11/20 22:46ID:/E1Vbwsz
>>5 ありがとうございます。

あと、いきなり出て来て1000取ってすいません・・・。
0007nobodyさん02/11/21 00:06ID:???
>>3
前スレで答えた者だが、HTML(と、変換したCSV)はSJISだろ?
"\x81\x9c"を代わりに書けばよし。
0008702/11/21 00:20ID:???
ちなみに答えは多分683(自然なんちゃら)と126(ビオ)だと思う。
0009nobodyさん02/11/21 00:42ID:???
>>前スレ991
LWP::Simpleモジュールが入っているなら
perldoc lwpcookして出てくる文書読んでみるとやり方出てるよ。

use LWP::Simple;
getstore "http//:www.yahoo.co.jp", "yahoo.html";
みたいな感じ。
0010nobodyさん02/11/21 00:49ID:izFT1sBO
  ┏━━━━━┓    ┏━┓┏┳┓            ┏━┓      ┏┳┓
  ┃          ┃┏━┛  ┗┫┃┃            ┃  ┃┏━┓┃┃┃
  ┗━┳━    ┃┃        ┗╋┛┏━━━━┓┗━┛┃  ┃┃┃┃
      ┃      ┃┗━┓  ┏━┛  ┃        ┃      ┃  ┃┃┃┃
      ┃  ┏━┛┏┓┃  ┃┏┓  ┗━━━━┛┏━━┛  ┃┗┻┛
    、 ┃  ┃    ┃┃┃  ┃┃┃    .‘; ゜  ・  ┃        ┃
    、 ┃  ┃    ┃┃┃  ┃┃┃    .‘; ゜  ・  ┃        ┃┏┳┓
      ┗━┛ ” ;┗┛┗━┛┗┛   ノ      ┗━━━━┛┗┻┛
      ∧_∧    ヽ(。、::。.::・'゜・' )〆     .'  ,   
     (  ゚∀゚)__ ( 。、 ::。 ).。::  θ)  .∴ '     
     r'⌒ ̄ ̄ ̄ ̄ (。、::。.::・'゜。'゜ )ゝ|    ・,‘ 
     |   ̄ ̄ ̄ ̄ ) ヘ( 。、 ::。 )ヽ | |      ←>>1
     \   │     ’ Υ  γ  | | 
       ヽ   │     ⊂.J|     ) し`⊃ ヾ 
       (    ヽ       |  ||  |   
        \  \\     |  |.|  |   
          \  ヽ ヽ   ( 丶(  \
            > ノ ノ     \ \\ \
          / /| /       )  \. )  \
         / // /         (_/ .(_/
        /__// /__
      〈_ __〉 _ __〉
0011nobodyさん02/11/21 18:30ID:La3b0kHh
perlで「#」を変数名に普通に使えるのでしょうか?
例:$#hogehoge
0012nobodyさん02/11/21 18:52ID:???
>>11
使えない。
$#hoge は配列 @hoge の最後のインデックス値。

Perl で変数名に使えるのは英数字とアンダーバー。
ただし $ に続く一文字目が数字の場合、
変数名はすべて数字でなくてはならない。

で、あってる?
0013nobodyさん02/11/21 19:33ID:???
>>12
変数名に数字って使えたっけ?
0014nobodyさん02/11/21 19:37ID:???
>>12
やってみれ。

$hoge1ならいけるだろ?
0015nobodyさん02/11/22 16:14ID:UpQRYD34
質問です。2桁の整数値、たとえば
"01","09","01","21"
"01090121"
としたいのです。各値は実は日付で整数演算で日付の
更新を行っていますが、更新されたあとの数字を繋げると
"19121"
のように整数2桁にはなりません。
どうしたらよいのでしょうか?
0016nobodyさん02/11/22 16:40ID:???
my $ctg_id_ = $CTG_ID;
my @ctg_ids = ();
while (length($ctg_id_) > 1) {
push (@ctg_ids,$ctg_id_);
chop $ctg_id_;
}

------------

$CTG_ID = 'MK0010'
↓
@ctg_ids = (MK0010,MK001,MK00,MK0,MK)

というコードを一行にしてください。

0017nobodyさん02/11/22 16:57ID:???
>>15
意味がまったく解りません。

数値と数字の違いとか理解してる?
0018nobodyさん02/11/22 17:11ID:???
>>15
配列だとしたら、
@array = ("01","09","01","21");
join('', @array);

それ以外なら sprintf で %02d のフォーマットで出力すれば良。
0019nobodyさん02/11/22 17:28ID:UwQQAcbp
西暦と月を算出しようとしているのですがうまくいきません。
わかっているのは現在の西暦と月($nowYear、$nowMon)で、
ユーザーから与えられるのはページ番号($pg)とします。
1ページに 3ヶ月まとめて表示します。

未来については問題ないのですが、過去を表示させようとすると
「/12」でやっているのでマイナス値が出せません。
もっと効率のよい式はないでしょうか?

-------------------------
$nowYear = 2002;
$nowMon = 11;
$pg = 0;

foreach $i ( 0 .. 2 ){
$mon = ($nowMon + $i + $pg * 3) % 12 + 1;
$year = $nowYear + int((($nowMon + $i) + ($pg * 3) -1) / 12);
print "$year / $mon\n";
}
-------------------------
00201502/11/22 19:48ID:UpQRYD34
>>18
ありがとう。解決しました。
0021nobodyさん02/11/22 20:55ID:???
>16
my $ctg_id_ = $CTG_ID; my @ctg_ids = (); while (length($ctg_id_) > 1) { push (@ctg_ids,$ctg_id_); chop $ctg_id_; } ------------ $CTG_ID = 'MK0010' ↓ @ctg_ids = (MK0010,MK001,MK00,MK0,MK)
0022rubyist@カラアゲうまうま02/11/22 20:58ID:???
( ´,_ゝ`)プッ
00232302/11/22 23:11ID:???
perlopに載っている「s/\$(\w+)/${$1}/g;」の勉強なのですが

@data = (taro ,Jiro, Sabro);
@temp = ('$b');
foreach $b(@data){
foreach $c(@temp){
$c =~s/\$(\w+)/${$1}/g;
print $c;
}
}

とやって、ほんとは「taroJiroSabro」と表示したいんですが
「tarotarotaro」となってしまいます。
どうすればいいのでしょう

00242302/11/22 23:13ID:???
perlopに載っている「s/\$(\w+)/${$1}/g;」の勉強なのですが

@data = (taro ,Jiro, Sabro);
@temp = ('$b');
foreach $b(@data){
foreach $c(@temp){
$c =~s/\$(\w+)/${$1}/g;
print $c;
}
}

とやって、ほんとは「taroJiroSabro」と表示したいんですが
「tarotarotaro」となってしまいます。
どうすればいいのでしょう

0025nobodyさん02/11/23 00:16ID:TlwVHlkv
(-_-;)
0026nobodyさん02/11/23 00:51ID:???
>>23
$temp[0]の中身を'taro'に置換したんだからそれ以後はマッチしないかと。
0027nobodyさん02/11/23 00:56ID:???
なるほど。

$c =~s/\$(\w+)/${$1}/g; は止めて
print eval $c;
なら「taroJiroSabro」になりました。
でもこれって正しいやり方なんですかね
0028nobodyさん02/11/23 05:29ID:???
open(F, "+< xxx.txt");
だとxxx.txtは自動生成されないので直前に
open(F, "xxx.txt");
を入れようとしましたけど、その場合直後でcloseすべきですか?
となるとflockも必要ですか?
ていうか煩雑なのでもっとスマートなやり方はないですか?
0029nobodyさん02/11/23 08:44ID:???
>>28
open F, "+>>xxx.txt" or die;
seek F, 0, 0;
00301902/11/23 10:38ID:???
>>19
ttp://www.din.or.jp/~ohzaki/perl.htm#Date2WDay
の方法で use Time::Local; することにしました。
00312802/11/23 13:53ID:???
>>29
+>>なんて初めて見ますた。
flockを使う上で一番安全ぽいと思われたのでわざわざ+<を使っていたわけですが
+>>てのは具体的にどんな動作するんでしょか。
0032nobodyさん02/11/23 21:45ID:???
教えてください
CGIで、フォームのデータを%inにしまってあって、
それをJcodeモジュールで片っ端からコード変換したいのですが
全部のキーに対して変換をかけるとエラー吐かれますた…
んで、次にgetcodeでsjis、euc、jisの時のみ変換をかけるようにしたのですが
フォームの中にラジヲボタンとかがあり、配列のリファレンスに対して
getcodeしようとするとエラーを吐かれてしまい、困ってます

全部変換しようとする>エラー
日本語だけ変換>コードをゲトしる>エラー

これ以上おヴァカな自分には対処方が思いつきません、どうか御教授くださいませ…
0033rubyist@カラアゲうまうま02/11/23 21:49ID:???
エラーメッセージも書かずにお願いするのがperlユーザの典型
0034nobodyさん02/11/23 22:35ID:???
すみませんでした

ちょっと自分で検証ミスが有ったようで、なんかgetcodeはできるぽでした…
その後の処理が上手くいってないのかもです

[Jcode.pm:575:die] Not a SCALAR reference at C:/Perl/site/lib/Jcode.pm line 575, <DATA> line 1579.
上記のエラーが出てました…

ラジヲボタンのフォームとか場合によってリファレンスだったり普通の値だったりしてわけわかんない・゚・(ノД`)・゚・
0035nobodyさん02/11/23 22:54ID:zBuUfsU+
ファイル存在確認の
if (-e $a)
なんですが
ファイルをOpenするとかなりパフォーマンスは悪くなりますよね?
これも悪くなるのでしょうか?
0036nobodyさん02/11/24 00:05ID:???
>>32
%in に格納するときに変換する
0037nobodyさん02/11/24 04:22ID:???
>>35

ならない。stat(2) を使うから。

# open にしてもそれ程遅いわけではないと思うが。
0038nobodyさん02/11/24 15:36ID:???
>>32
>>36
cgi-lib.plかなんかを使っているのではないかと想像してみる。
まあ、自分のやったことを全部言わない>>32がアレなんだが。
0039nobodyさん02/11/24 15:57ID:???
if ($hoge){〜;} と if ($hoge ne '') {〜;}

上記の場合は、どちらを使うのが普通なのでしょうか?
0040 ◆hMJAPH9PWA 02/11/24 16:06ID:???
>>39
用途が違うからなんとも…。
例えば、変数の中身が'0'だと前者は偽、後者は真になるよ。
0041nobodyさん02/11/24 23:11ID:???
>>38
じゃ、refで分岐処理
00422302/11/25 00:00ID:???
>>23
自己レスです。

@data = (taro ,Jiro, Sabro);
@temp = ("\$b", $b ,$b);
foreach $b(@data){
foreach $c(@temp){
$d = $c;
$d =~s/\$(\w+)/${$1}/g;
print $d;
}
}

こうすれば、ちゃんとtaroJiroSabroになりました。
0043.3202/11/25 17:33ID:???
すみません、質問の仕方がトコトン悪かったようで

>>36
すみません、勉強不足なようでわかりません

>>38
CGI::Lite使ってまつ

>>41
Σ(´Д`;)そんな関数があたのか…

いろいろヒントいただきましたので、がんがってみます、ありがとうございました
00443802/11/26 00:49ID:???
>>32
CGI::Lite の使い方を最初から勉強しなおせ。
悪いことは言わないからさ。

そもそも、「%inにフォームのデータをしまって」あるのがわかっているなら、
いつ%inに格納したのかわかるだろうに。
0045nobodyさん02/11/26 16:45ID:Y+XqV5xb
これからperlを使ってデーターベースを構築しようと思うのですが、
これからやるならDBは何を使えばいいんでしょうか。
他のスレ読むと、PostgresSQL+Pg.pmよりもDBIを使えとかいろいろ書いてありましたが
初めてなのでよくわからないです。実際はPg.pmというのを使ってる人が多いみたいですし。
いい方向へ誘導してください。

追伸:InterBaseってどうなのですか?
0046nobodyさん02/11/26 17:25ID:???
Pg.pm はデータベースではない。
0047.3202/11/26 20:09ID:???
>>44
わかりますた、勉強しなおしまつ…
英語読めねぇよウワァァァァン
0048nobodyさん 02/11/26 21:48ID:???
perlで外部ファイルから変数を読み込むことができる
bashのsourceコマンドみたいなものってないのでしょうか?
0049nobodyさん02/11/26 21:53ID:???
>>48
require
0050nobodyさん02/11/26 22:24ID:kEoHEjhG
http://www.1-one-town.com/wakanavi/sptkan.cgi
ここみたいに、Enterキー押した時は認証しないのに
loginボタンをクリックした時は何故かCGIに認証しに行きます。

Enterキー押した時も認証しに行くようにするには
どうすればいいんでしょうか?
0051nobodyさん02/11/26 22:29ID:???
>>51
ボタンの値を見ておいてどうすれば?もないもんだ。
passの値だけで判断しろ。
00525002/11/26 22:33ID:kEoHEjhG
>>51
ボタンの値を見ておいて・・・というとどういう事ですか?
フォームタグではなくてCGI側の問題ですか?
0053アシトン?02/11/26 22:43ID:???
>>50
aciton=
0054nobodyさん02/11/26 22:54ID:???
アシトンワロタ
00555002/11/26 22:54ID:kEoHEjhG
>>53
た、たしかにスペルは間違ってますが、、、

でもクリックだと認証に飛びますけどね・・
0056nobodyさん02/11/26 23:03ID:???
>>55
それはブラウザ依存だ。
IEの場合、formタグのaction属性がない場合、action属性を自分自身に設定する。
だから、クリックだと自分自身に飛ぶ。
0057nobodyさん02/11/26 23:07ID:???
>>55
クリックすると、type="submit" のnameとvalueが渡される。Enterキーだと
それが渡されない。
だから、type="password" のほうのnameとvalueだけ見て処理しろと>>51は
言っている。
00585002/11/26 23:08ID:kEoHEjhG
>>57
なるほど、分かりました。
どうもすみません
0059nobodyさん02/11/26 23:11ID:???
>>45
Perlでデータベースを扱おうと思ったら、その仲立ちをするモジュールを使うのが楽でいい。
Pg.pmはPostgreSQLとの接続専用のモジュール。
だが、DBI.pmとPostgreSQL用のDBDの組み合わせでも同じことができる。
(細かいやり方は違うだろうが)

同じことをするのに二つのモジュールを使うのは無駄だと思うかも知れないが、
こうしておくと、将来別のデータベースを使わなければならなくなった時に、
DBDを差し替えて、スクリプトをちょっと(多分一行)だけ変更すれば、
そのまま動くようになると言う利点がある。

これからの生涯でずっとPostgreSQLしか使わないと言うのであれば構わないが、
そうでなければ、DBI.pmを使うことを勧める。

ま、どっちを選ぼうが自由なんだがな。
0060nobodyさん02/11/26 23:28ID:???
すんません、PalmOSで動くPerlってないですか?やっぱ
0061nobodyさん02/11/27 00:38ID:???
開発順調
http://palmperl.sourceforge.net/
00626002/11/27 01:46ID:???
>>61
全然順調じゃないじゃん




ぇゃ、ほんと有り難うございますた、なんかスゲェ質素なページでしたが(藁
検索しても引っかからなかったんですけどねぇ…
完成を心待ちにしときます
0063nobodyさん02/11/27 09:27ID:???
awk '$1 >=130 && $1 <=170 && $2 >=30 && $2 <=60 {print $0}' tmp1 > $ofile
か
perl -F" " -ane 'if($F[1] >=130 && $F[1] <=170 && $F[2] >=30 && $F[2] <=60) {print $_;} tmp1 > $ofile
か
perl -F" " -i.ofile -ane 'if($F[1] >=130 && $F[1] <=170 && $F[2] >=30 && $F[2] <=60) {print $_;} tmp1
はどれが一番速いのですか?


0064nobodyさん02/11/27 10:37ID:???
#!/bin/csh
set min = `awk '$3 <= 0.9 {print $0}' aho.txt | sort +1 -n | head -n 1`
echo min[1]

foreach time ( 90621)
  ifile = hoge${time}.txt
  set gyou = `awk '$1 == '$time' {print NR}' date.txt`

  awk 'NR >= '$gyou' && NR <= ('$gyou' + 80) {print $0}' date.txt > tmpA
  paste $ifile tmpA > tmpB
  awk '( NR % 2 ) == 0 {print $0}' tmpB > tmpC
  set gyousu = `awk '$5 > 0 {print $0}' tmpC | wc -l`

  if ( $gyousu == 40 ) then
       set temae = 40
  else if ( $gyousu < 40 ) then
       set aaa = `awk '$5 < 0 {print NR}' tmpC | head -n 1`
       set temae = `awk 'NR < '$aaa' {print $0}' tmpC | wc -l`
  endif
  echo $temae
end
0065nobodyさん02/11/27 10:41ID:???

set min = `awk '$3 <= 0.9 {print $0}' aho.txt | sort +1 -n | head -n 1`
echo min[1]
と
set gyou = `awk '$1 == '$time' {print NR}' date.txt`

awk 'NR >= '$gyou' && NR <= ('$gyou' + 80) {print $0}' date.txt > tmpA
paste $ifile tmpA > tmpB
awk '( NR % 2 ) == 0 {print $0}' tmpB > tmpC
set gyousu = `awk '$5 > 0 {print $0}' tmpC | wc -l`

をそれぞれperlで書くとどのような感じになりますか?

いいかげんな感じでいいので、perlの構文教えてください。
調べてたら、卒論かけません。

本来のcshスクリプトでは
foreach time ( 90621 90609 90521 90509 83021 83009 81821 81809 81721 81709 81621 81609 81521 81509 80821 80809 80721 80709 80621 80609 80521 8050
9 80421 80409 80221 80209 72921 72909 72821 72809 72721 72709 72621 72609 62121 62109 61021 61009 60921 60909 60821 60809 52209 50521 50509 50421
50409 50321 50309 50221 50209 50121 50109 43021 )
となっており、このスクリプトでは遅すぎて、話しになりません

アフォですみません。
0066nobodyさん02/11/27 10:51ID:???
20021231
という、YYYYMMDDという日付データがあった場合に、
「今日からあと何日でその日が来るか」を算出するのにはどうしたらいいのでしょうか。
00676602/11/27 10:55ID:???
あと、
例えば、20020631という日付データがあって、
その日から3ヶ月後は何日か求めたい時はどうすればいいですか。
普通に20020931にしても、9月は31日が無いかもしれないですし、
うるう年とかで2月は28日だったり29日だったりしますよね。。
0068nobodyさん02/11/27 10:56ID:???
卒業しなくて良いよ。
0069nobodyさん02/11/27 11:04ID:???
>66
timelocal()を使うと楽。

>67
じゃあ、8月31日の3ヵ月後の11月31日が存在しなかった場合はどうするの?
なかった場合どうするかを先に決めないと何もできない。
00706602/11/27 11:24ID:???
>>69
11月31日が存在しなかったら次の日の12月1日になると思います。
0071nobodyさん02/11/27 11:30ID:???
>70
なると思いますじゃねーだろ。
どういう仕様にしたいか決めないと出来ないってんだよ。
0072nobodyさん02/11/27 11:32ID:???
んで、
>70は>66-67みたいな事がしたくて
それでどんな風にやってみて、
それだとどんなエラーが出て上手く行かなかった
んだ?

自分で何もせずにやり方聞いてるわけじゃないよな?
>1読め。
0073nobodyさん02/11/27 11:33ID:???
>>71
オマエのほうが勘違いしてないか? よく読め
0074nobodyさん02/11/27 12:01ID:???
掲示板から入力した文字データの文字数を数えて、
その文字数分、処理をループさせたいのですが、
これだと何も出来ませんでした…。

要するに、入力されたひらがな($tango)を、
ローマ字に変えてファイルに書き込みたいって事なんですが…。

$mojisu = length $tango;
while ( $x < $mojisu ){
$moji = substr($tango,$x,2);
if ($moji = "あ"){print $romaji "a"};
         ・
         ・
         ・
$x = $x+2;
}
■ このスレッドは過去ログ倉庫に格納されています