【Perl】初心者コーナー Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/20 22:04ID:???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あたりを見よう。
005250
02/11/26 22:33ID:kEoHEjhGボタンの値を見ておいて・・・というとどういう事ですか?
フォームタグではなくてCGI側の問題ですか?
0054nobodyさん
02/11/26 22:54ID:???005550
02/11/26 22:54ID:kEoHEjhGた、たしかにスペルは間違ってますが、、、
でもクリックだと認証に飛びますけどね・・
0056nobodyさん
02/11/26 23:03ID:???それはブラウザ依存だ。
IEの場合、formタグのaction属性がない場合、action属性を自分自身に設定する。
だから、クリックだと自分自身に飛ぶ。
0057nobodyさん
02/11/26 23:07ID:???クリックすると、type="submit" のnameとvalueが渡される。Enterキーだと
それが渡されない。
だから、type="password" のほうのnameとvalueだけ見て処理しろと>>51は
言っている。
005850
02/11/26 23:08ID:kEoHEjhGなるほど、分かりました。
どうもすみません
0059nobodyさん
02/11/26 23:11ID:???Perlでデータベースを扱おうと思ったら、その仲立ちをするモジュールを使うのが楽でいい。
Pg.pmはPostgreSQLとの接続専用のモジュール。
だが、DBI.pmとPostgreSQL用のDBDの組み合わせでも同じことができる。
(細かいやり方は違うだろうが)
同じことをするのに二つのモジュールを使うのは無駄だと思うかも知れないが、
こうしておくと、将来別のデータベースを使わなければならなくなった時に、
DBDを差し替えて、スクリプトをちょっと(多分一行)だけ変更すれば、
そのまま動くようになると言う利点がある。
これからの生涯でずっとPostgreSQLしか使わないと言うのであれば構わないが、
そうでなければ、DBI.pmを使うことを勧める。
ま、どっちを選ぼうが自由なんだがな。
0060nobodyさん
02/11/26 23:28ID:???0061nobodyさん
02/11/27 00:38ID:???http://palmperl.sourceforge.net/
006260
02/11/27 01:46ID:???全然順調じゃないじゃん
ぇゃ、ほんと有り難うございますた、なんかスゲェ質素なページでしたが(藁
検索しても引っかからなかったんですけどねぇ…
完成を心待ちにしときます
0063nobodyさん
02/11/27 09:27ID:???か
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:???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:???という、YYYYMMDDという日付データがあった場合に、
「今日からあと何日でその日が来るか」を算出するのにはどうしたらいいのでしょうか。
006766
02/11/27 10:55ID:???例えば、20020631という日付データがあって、
その日から3ヶ月後は何日か求めたい時はどうすればいいですか。
普通に20020931にしても、9月は31日が無いかもしれないですし、
うるう年とかで2月は28日だったり29日だったりしますよね。。
0068nobodyさん
02/11/27 10:56ID:???0069nobodyさん
02/11/27 11:04ID:???timelocal()を使うと楽。
>67
じゃあ、8月31日の3ヵ月後の11月31日が存在しなかった場合はどうするの?
なかった場合どうするかを先に決めないと何もできない。
0071nobodyさん
02/11/27 11:30ID:???なると思いますじゃねーだろ。
どういう仕様にしたいか決めないと出来ないってんだよ。
0072nobodyさん
02/11/27 11:32ID:???>70は>66-67みたいな事がしたくて
それでどんな風にやってみて、
それだとどんなエラーが出て上手く行かなかった
んだ?
自分で何もせずにやり方聞いてるわけじゃないよな?
>1読め。
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;
}
0076nobodyさん
02/11/27 12:20ID:???ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Split
これ参考にしてみ。
0077nobodyさん
02/11/27 12:22ID:???$tango =~ s/あ/a/g;
$tango =~ s/い/i/g;
ずら〜っとコレじゃダメですか?
でも、「っ」とかって大変そう・・・
後に来る文字で変わるでしょ・・・
0080nobodyさん
02/11/27 17:38ID:37dF+px+って文字コードになってるファイルがあるんですが
コレを元の文字に置換するようなやつはどのように書けばいいんでしょうか?
0081nobodyさん
02/11/27 17:46ID:???0082nobodyさん
02/11/27 19:08ID:???一生独りでシコってろ!!
0083nobodyさん
02/11/27 21:43ID:???ドピュッ
0084nobodyさん
02/11/27 22:06ID:Op374sN2$in = 500; #10進法で入力された数値
for($i = 1;$i < 1297;$i++){
$c[$i] = $h.$j++;
if($j eq "10"){$j = "a";}
elsif($j eq "aa"){$j = "0";
$h++;
if($h eq "10"){$h = "a";}
}
}
$out = $c[$in]; #36進法で出力される数値
効率のいいコードはないでしょうか?
0085nobodyさん
02/11/27 22:42ID:wgGugnNo$after = array('0','1','2','3','4','5'..........'z');
$a = floor($in /36);
$b = $in % 36;
$out = $after[$a].$after[$b];
echo $out;
008685
02/11/27 22:45ID:wgGugnNo$in = 500;
@after = qw(0 1 2 3 ... z);
$a = int($in / 36);
$b = $in % 36;
$out = $atter[$a].$after[$b];
0089nobodyさん
02/11/27 23:01ID:XpHW8B1z$out = (0..9,a..z)[int($in/36)] . (0..9,a..z)[$in%36];
0091nobodyさん
02/11/27 23:17ID:???0092nobodyさん
02/11/27 23:28ID:???0093nobodyさん
02/11/28 00:49ID:???0094nobodyさん
02/11/28 07:22ID:???009574
02/11/28 11:13ID:???今のところ全くの初心者なものでご迷惑をお掛けしました。
とりあえず>>77さんのやり方で出来ました。
「っ」や「ゅ」等については後で考えます。
皆さんありがとうございました。
0096nobodyさん
02/11/28 12:20ID:AB88ovMQどうしたら良いでしょうか?
if( $env(HTTP_REFERER) == NULL)
流石にこれじゃだめっすよね…
0097nobodyさん
02/11/28 12:39ID:???0098nobodyさん
02/11/28 12:40ID:9pvjX8Vyunless( $ENV{HTTP_REFERER} ) {
.
}
0099nobodyさん
02/11/28 12:40ID:FjFqkJQzではだめでつか?
0103nobodyさん
02/11/28 13:17ID:n94VkAjj0104nobodyさん
02/11/28 13:16ID:???>環境変数が存在するか無いかを判定したいのですが
というお題なので、exists でいいんじゃないか?
0や''を検出するなら、まず仕様を決めてもらわんと。
010596
02/11/28 13:22ID:cubtANrCCGIを重複で利用したいので
フォームからアクセスしたときと表示するだけでアクセスした時
に分けたかったんです。
フォームからアクセスした時にはQUERYなりCONTENT?なりに
残るじゃないですか。
それを判別したかったんです。
いろいろ御意見ありがとです。。
0106nobodyさん
02/11/28 13:24ID:???上のCGIが作りたいのですが、どうすればいいですか?
初心者なうえに知識がないんで…
教えてください。
0107nobodyさん
02/11/28 13:41ID:n94VkAjj該当するweb管理者にお問い合わせ下さい。
0108nobodyさん
02/11/28 14:47ID:???業務口調ワラタ
0109nobodyさん
02/11/29 02:18ID:???初心者に掲示板の制作は無理だから諦めれ。
(余談だけど、初心者って掲示板の設置のことを「作り方」って聞くときがあるんだよなー)
0110nobodyさん
02/11/29 11:03ID:YJ7YkLxM文字列を一定の長さまで比較したいんですけど
標準関数ありますか?
Cでいえばstrncmpみたいなものです。
できれば、今後自力で調べる方法も教えて頂けないでしょうか。
0111nobodyさん
02/11/29 12:26ID:???0112nobodyさん
02/11/29 17:54ID:nCXK5uR+メモリ上にロードされっぱなしになって速度が速くなったりするの?
あと、自分のperlソースをpmにすることはできますか?
webで調べたけど情報が無かったです。
0113nobodyさん
02/11/29 18:04ID:???> webで調べたけど情報が無かったです。
http://www.kt.rim.or.jp/~ekbk/perl5.005/perlmod.html
0114nobodyさん
02/11/29 18:08ID:FGwKAXnrprint <<HERE
テスト
HERE;
例(2)
print "テスト";
例(1)と例(2)ではどちらが表示が速いでしょうか?
0115nobodyさん
02/11/29 18:28ID:???●ソース
use Benchmark;
timethese(1000000,{
'ex1'=>sub {
print "テスト\n";
},
'ex2'=>sub {
print << "EOM";
テスト
EOM
}
});
●結果
Benchmark: timing 1000000 iterations of ex1, ex2...
ex1: 40 wallclock secs ( 5.84 usr + 5.25 sys = 11.09 CPU) @ 90203.86/s (n=1000000)
ex2: 49 wallclock secs ( 6.26 usr + 5.56 sys = 11.82 CPU) @ 84631.01/s (n=1000000)
●結論
気にするほどの差はない
0116の
02/11/29 20:42ID:vqpWO9fR> 「DBI.pm」の「pm」って何??モジュール化されてるってこと?
単なるファイル名。use を使ったとき、名前+".pm" で読み込むくらいです。
普通中身はモジュールのための構造を持たせるけど、別に何か規定されてるわけじゃない。
---
俺的ポータルサイトを作ろう
http://mysite.ddo.jp/
0117nobodyさん
02/11/29 22:23ID:JObUfqd/0118nobodyさん
02/11/29 22:23ID:lYLiGnC/という文字列があったとして、
例えば3つ目のA以降の文字列を除去するにはどうすればいいでしょうか。
この文字列の場合、
ABCADEA
まで残したいのですが。。。(あるいはABCADEまで
0120nobodyさん
02/11/29 23:00ID:JObUfqd/0121117
02/11/29 23:06ID:JObUfqd/とかすると、
sub error {
の中で、
error:line 333 in hoge.pl
とか出したいんですが。
&errorは、hoge.plからrequireします。
0122nobodyさん
02/11/29 23:13ID:???とかで簡単にコンパイルできたらなぁ
0123nobodyさん
02/11/29 23:13ID:???sub error{
die "error: line $_[0] in $0";
}
0125nobodyさん
02/11/30 00:52ID:???テキスト内のどこにキーワードがあるか一見してわかるような
プログラムを作っているのですが、
jcode::convert(\$_, 'euc', "", "z");
jcode::convert(\$word, 'euc', "", "z");
$_ =~ s/$word/<XX>$word</XX>/; #(XXは任意のタグ)
とするとどうしてもうまく置き換えられずに化けてしまう
文字があります(主に全角のカナ)。
処理は入力をすべてEUCにコンバートしてから行っています。
化けてしまう原因が分かりません。
置き換え時の文字化けというのは避けられないのでしょうか?
0126nobodyさん
02/11/30 00:55ID:???0127nobodyさん
02/11/30 00:58ID:???情報すくなすぎ。
具体的に$_と$word それぞれがどういう入力のときにうまく
いかないのか。jcode::convertした時点で化けているのか、
置き換えたときに化けてしまうのか。
0128125
02/11/30 03:00ID:???jcode::でsjis→EUCコンバート時には
まだ化けていないようです。
さらにそのテキストをsjisに戻した場合は
化けてしまうものもあるようですが、今回は
sjisに戻しておりませんので無視しています。
現状としてはどうやら置き換えている時に
化けてしまっているようです。
どの文字がどのようなタイミングで化けるか調査して
もう一度書き込ませていただきます。
0129125
02/11/30 04:09ID:???確認したところ、置き換え時に同一文字コードながら違う文字?
で置き換えが行われていて化けてしまっているようです。
例えば
$_ = "007シリーズの最新作「ダイ・アナザー・デイ」";
$word = "次';
としたときに以下のようになります
007シリーズの最新作「ダイ・アナザ。<XX>次</XX>Ε妊ぁ廚・
このように、"次"という文字は含まれていないのですが
文字コードが同一?のため中途半端な所で置き換えが
行われて以後の文章が化けてしまう、という現象に見えます。
このような動作を回避することは出来るのでしょうか?
0132nobodyさん
02/11/30 09:03ID:KwMUsAxfうまくいきません。(例:40000000000とか) 何でですか?
$m = 2; $x = 0; $c = 0; ($nは元の数)
while ($h == 0){
if ($n % $m == 0){
$n = $n / $m;
@x[$x] = $m;
$x++;
}
else{
$m++;
if ($n % $m == 0){
$n = $n / $m;
@x[$x] = $m;
$x++;
}
}
if ($n < $m){$h = 1;}
}
0133nobodyさん
02/11/30 09:36ID:???素因数分解のアルゴリズムは置いておいて、
http://pc.2ch.net/test/read.cgi/php/1000191385/66-69
これか?
0134132
02/11/30 10:21ID:KwMUsAxfよく分からないんですが、perlのバージョン?(仕様上?)に問題があるということですかね?
0135nobodyさん
02/11/30 12:00ID:???たとえば<txt></txt>で囲まれている間の文字のみを
s/</</g;
s/>/>/g;
という風に変換したいのですが、
どうしたらいいか分かりません。下記の様にしたのですが、できませんでした。
ご教授して頂けませんか?
if ($val =~ /<txt>(.*?)<(.*[^>]*)>(.*?)<\/(.*?)>(.*?)<\/txt>/) {
$val =~ s/$1<$2>$3<\/$4>$5/ig;
}
#見にくくてスミマセン…
0136135
02/11/30 12:17ID:???上手くいきました、ご迷惑おかけしまスタ
0137nobodyさん
02/11/30 13:59ID:/75slB4UMath::Bigint 使ってください。
Perlで大きい整数はまともに扱えません。
使い方は perldoc Math::Bigint 読んでね。
0138nobodyさん
02/11/30 14:04ID:???ttp://www.din.or.jp/~ohzaki/perl.htm
ここの「日本語を扱う 正しくパターンマッチさせる」を読んでくれ。
日本語処理はそう簡単には実装できない。
0139125
02/12/01 14:00ID:???求めていた回答がここにありました。
じつはそこのサイトはこのスレッドの頭にあったので
見ていたのですが、ちゃんと読まずに通過していたようです。
解決することができました。ありがとうございました。
他の皆様も考えてくださったり回答してくださったりして
ありがとうございました。では。
0140nobodyさん
02/12/01 21:52ID:???で作ったをもとに、
hoge,piyo,huga
と表示させたいです。どうやればいいか教えてください。
0141nobodyさん
02/12/01 21:55ID:???0142nobodyさん
02/12/01 21:58ID:???0143nobodyさん
02/12/01 22:02ID:???0145nobodyさん
02/12/01 22:06ID:???{
my @hogelist = ('hoge','piyo','huga');
my $count =1;
foreach(split(/\t/,join('\t',@hogelist))){
print "," if $count%0x04;
chomp;
print STDOUT;
$count += ($count+1)/0x01;
}
もっと無駄な方法ってないかしらん・・・
0147nobodyさん
02/12/01 22:22ID:SByI0FEM誰かUPローダの作り方教えてください。
作り方を説明してるサイトでもいいんで、お願いします。
0148nobodyさん
02/12/01 22:25ID:???CGI::Liteとかのurl_encode,decodeなんですけども、
ある文字列がエンコード済みなのか未エンコードなのか調べる方法は無いでしょうか?
既にエンコード済みの"300%89%7e%82%c5%8d%a1%8c%8e%90%b6%82%ab%82%c4%82%a2%82%af%82%e9%82%a9%89%b4"
とか、未エンコードの"松屋のカレー(゚д゚)ウマー"とか色々な文字列が与えられてくるのですが
それを一律にURLエンコードがされた状態にしたいのです
で、ソレをデコードする時等、エンコードされてるモノはデコードしなきゃいけませんですし、
エンコードされてないモノに、"今日の降水確率は%25ってとこですかね"とか与えら、
デコードしたら変になってしまいますし…
なにかいい方法はないでしょうか?お知恵をお貸しください…
0149nobodyさん
02/12/01 22:37ID:???レンタルのにしなさい。
>>148
本文につっこみますが日本語がとても難しいです。
もう一度日本語の勉強をしなおしてきます。
($str =~ m#^%.*#)? デコード処理 ;
ではダメ?(やっぱりよくわからん)
0150nobodyさん
02/12/01 22:38ID:???理論的には不可能だ。
'%22'という文字列だけが来たときに、それがもともと
'%22' という文字列をそのまま送信したのか、
'"'(ダブルクォーテーション)を送信したのか、判別できないだろう。
[\x80-\xff]が含まれていたらエンコードされていないと見なす、くらいで
妥協したら?
0151nobodyさん
02/12/02 04:38ID:weXpByrh->decode($str) if $str =~ m/^(?:%[a-fA-F0-9][a-fA-F0-9])+$/;
で、十分実用に耐えると思うが・・・
エンタープライズとかだと、デコードしてないと
error 400になるけど
■ このスレッドは過去ログ倉庫に格納されています