【Perl 】初心者コーナーPart5
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2001/05/01(火) 23:41ID:???尋ねる前に同じ質問がないかこのスレや旧スレ、及び>>2のリンクを一通り見てみよう。
案外答えはもう書かれているかもしれない。
0102名無しさん@お腹いっぱい。
2001/05/20(日) 04:11ID:???0103名無しさん@お腹いっぱい。
2001/05/20(日) 04:15ID:???頼むよ。
0104名無しさん@お腹いっぱい。
2001/05/20(日) 04:28ID:???場所を用意してくれるんなら少しは協力するぞ。
0105名無しさん@お腹いっぱい。
2001/05/20(日) 05:44ID:???0106名無しさん@お腹いっぱい。
2001/05/20(日) 05:47ID:???せっかくLINUXいれたので・・・。
0107名無しさん@お腹いっぱい。
2001/05/20(日) 05:50ID:???0108名無しさん@お腹いっぱい。
2001/05/20(日) 07:26ID:???まだそんな事でつっこむのかよ。
サブッ
0110名無しさん@お腹いっぱい。
2001/05/20(日) 08:18ID:???このスレの>>2のリンク集の[お薦め]のとこ。って"の"が多いね。
0111名無しさん
2001/05/20(日) 08:31ID:/uasmmyo0112(・∀・)イイ!!
2001/05/20(日) 10:31ID:3QTA/xf2http://ton.2ch.net/test/read.cgi?bbs=news&key=990241282&ls=100
0113名無しさん@お腹いっぱい。
2001/05/20(日) 11:36ID:???http://xbbs21.virtualave.net/xbbs/up/
ここにページを圧縮してアプしてくれれば、
こっちで見られるようにするよ。
0114初心者
2001/05/20(日) 13:32ID:4X2s.QbMperlでAとBのファイルのレコードマッチングで
同じレコードを抜き出してCというファイルを作るのですが
foreachの入れ子で作るとどうしても抜き出すレコードが
2レコードずつ出力されてしまいます。
どこかによい例がありませんでしょうか?
0115初心者
2001/05/20(日) 13:31ID:4X2s.QbMperlでAとBのファイルのレコードマッチングで
同じレコードを抜き出してCというファイルを作るのですが
foreachの入れ子で作るとどうしても抜き出すレコードが
2レコードずつ出力されてしまいます。
どこかによい例がありませんでしょうか?
0116名無しさん@お腹いっぱい。
2001/05/20(日) 13:39ID:???まずはそのスクリプトを書くなりアプするなりしたらどうだ。
0117初心者
2001/05/20(日) 13:48ID:4X2s.QbM@new = <NEW>;
foreach $new_rec (@new){
#---関数 comp_update
$subname="comp_update";&local_time;
&comp_update;
$val = &comp_update;
if($val){
if($hit_sw eq "0"){
print OUT "$new_rec2---unm\n";
}
print OUT "$new_rec2\n";
}
}
#
sub comp_update{
# 新旧更新情報ファイルの比較
$hit_sw = "0";
$new_rec2 = $new_rec;
@new_data = split(/\s+/,"$new_rec");
@old = <OLD>;
foreach $old_rec (@old){
@old_data = split(/\s+/,"$oup_rec");
if(($new_data[0] eq $old_data[0]) && ($new_data[1] eq $old_data[1]) && ($new_data[2] eq $old_data[2])){
$hit_sw = "1";
if($new_data[3] eq $old_data[3]){
return[0];
}else{
return[1];
}
}
}
if($hit_sw eq "0"){
return[1];
}
}
0118初心者
2001/05/20(日) 13:50ID:4X2s.QbMあと4行目はファイルの突き合わせには意味のない
サブルーチンです。
0119名無しさん@お腹いっぱい。
2001/05/20(日) 14:00ID:???思うに問題は"return[n]"じゃないか?勘だが。
真偽値を返すつもりなら"return(n)"と書いてみな。
0120初心者
2001/05/20(日) 14:11ID:4X2s.QbMnって数字ではないのですか?
アルファベットの“n”ですか?
メインルーチン側はどうやって真偽を判断するのですか?
0121_gunzip
2001/05/20(日) 14:14ID:???>return[0];
return(0);
[]じゃなくて()だよ。(このままだと、0という要素を持った配列へのリファレンスを
返すことになってしまうよ)
>$hit_sw eq "0"
数値を""でくくるのは、なんか変。
$hit_sw = 1; $hit_sw == 0;
>$new_rec2
こういった変数の付け方は、後から見ると(or 他の人が見ると)何を指しているのか
分かりづらいのでやめよう。(しかもグローバル変数で突然現れるし......)
>$old_data[0] eq $new_data[0] とか
どんなフィールドを比較しているのか.....わからん。
>@old = <OLD>;
毎回読むの?最初の一回でファイルの終端まで全部読んでしまうから
二回以降@oldは空じゃない?
#どういったことをやりたいのかを(114より詳しく)正確に書いて欲しい。
0122_gunzip
2001/05/20(日) 14:17ID:???ってことは、
>if($hit_sw eq "0"){
>print OUT "$new_rec2---unm\n";
>}
>print OUT "$new_rec2\n";
>}
の後者のprintが要らない?......というか、よくわからん。
0123ははは
2001/05/20(日) 14:28ID:???0124初心者
2001/05/20(日) 14:38ID:4X2s.QbMやりたいことは 更新情報であるNEWファイルのレコードを
OLDファイルのレコードと比べて、
互いのレコードデータの項目[0]〜[2]まで一致したら
日付(YYYYMMDD・・・)の入っている項目[3]を比べ
差異があればOUTファイルへ出力させます。
但し、NEWファイルにしかないレコードもunmatchとして同じく出力させます。
>>@old = <OLD>;
>毎回読むの?最初の一回でファイルの終端まで全部読んでしまうから
>二回以降@oldは空じゃない?
NEWのレコード1行毎に、OLDファイルは頭から再び
探したいのですけど・・・意味ないのでしょうか?
0125初心者
2001/05/20(日) 14:57ID:4X2s.QbM>return(0);
>[]じゃなくて()だよ。(このままだと、0という要素を持った配列へのリファレンスを
>返すことになってしまうよ)
スミマセンここもう少し詳しく教えてください。
1度シンタックスエラーになり
リファレンスマニュアルを読むと[]と書いてあったので変えたのですが・・・
戻り値に真偽を与えメインルーチン側で真偽を判断する方法がよくわからないのです。
あと 一度、配列にファイルハンドルで全てあたえたら
繰り返し処理でやる意味はないのですか?
open...
@old = <OLD>;
close...
とファイルを開いて全て読みこんでファイルを閉じるのが正しい
使い方なのでしょうか?
0126名無しさん@お腹いっぱい。
2001/05/20(日) 15:12ID:???悪い事は言わないからまともな本買って勉強し直しな。
その方が君のためになる。
0127_gunzip
2001/05/20(日) 15:18ID:???#!/usr/bin/perl -w
use constant NOT_EXISTS => 0;
use constant EXISTS => 1;
use constant LAST_MODIFIED => 3;
@old = map{ [ split ] } <OLD>;
while($rec = <NEW>){
chomp $rec;
$is_exists = NOT_EXISTS;
@new = split(/\s+/,$rec);
foreach $old (@old){
if(($new[0] eq $old->[0]) && ($new[1] eq $old->[1]) && ($new[2] eq $old->[2])){
$is_exists = EXISTS;
if($new[LAST_MODIFIED] ne $old->[LAST_MODIFIED]){
print $rec , "\n";
last;
}
}
}
if($is_exists == NOT_EXISTS){
print $rec , "---unmatched\n";
}
}
やりたいのはこういったこと?
0128_gunzip
2001/05/20(日) 15:19ID:???print OUT $rec , "\n";
だな。それにNEW,OLDも開いてない。
0129名無しさん@お腹いっぱい。
2001/05/20(日) 15:25ID:???流石_gunzipさんです。
0130_gunzip
2001/05/20(日) 16:00ID:???>>125
>1度シンタックスエラーになり
うーん。あり得ないような。
>リファレンスマニュアルを読むと[]と書いてあったので変えたのですが・・・
どんな記述だったのか知りたいなあ。
>戻り値に真偽を与えメインルーチン側で真偽を判断する方法がよくわからないのです。
うう....言ってることが分からない。戻り値として返されたものを評価すればいいだけでは(?)
>あと 一度、配列にファイルハンドルで全てあたえたら
一回目の&comp_update()の呼び出しで
>@old = <OLD>;
@oldには($/未変更時)ファイルハンドルOLDの各行が一行ずつ入る。
ついでにEOFもセットされる。(最後まで読んだので)
二回目の&comp_update()の呼び出しで
>@old = <OLD>;
OLDにはもう残っていないので@oldは空になる。
>>129
ありがとう。何か変なところがあったら指摘してくれると嬉しいです。
0131初心者
2001/05/20(日) 17:39ID:4X2s.QbMそうしたいのは山々なのですが(ここからは言い訳になります)
コンピュータはインターネットとゲームをするていどの
ど素人だったのが
COBOLの研修を2週間程度受けて、いきなり配属され
一人ぼっちでperlと格闘している最中の新入社員なのです。
(でもperlってコンパイルしなくていいのが好き)
周りは年老いたおじサンばかりで若いというだけで引継ぎも
ままならないままサーバ管理をまかされてしまいました・・・・
>>127
あまりにも・・・高等すぎてよくわかりませんが
有り難くコピペさせて勉強させていただきます。
先ほどの突き合わせ処理の問題はなんとか解決できました。
やはり御指摘の通り @old = <OLD>を繰り返し処理の中で
行っていた事が原因でした。
(2行づつ書きこむのは別の原因でしたが)
perlのマニュアルは沢山買いこみましたが
肝心の無い様が私にとってチンプンカンプンで・・・
今の仕事向いてないのかもしれません・・・
ありがとうございました。
追伸:どこかおすすめのPerlのサイトありませんでしょうか?
0132名無しさん@お腹いっぱい。
2001/05/20(日) 17:49ID:MGMWE3cQ上手い方法ないですか?
tr/a/a/g; tr/1/1/g;
みたいにやってもだめでした。
0133名無しさん@お腹いっぱい。
2001/05/20(日) 18:09ID:???関連サイトは>>2を参照
しかし…君を悪く言うつもりは無いが、
酷い会社だなそこは…それともそういうものなのか。
ま、頑張れや
>>132
jcode.pl(またはJcode.pm)のtr()関数を使えばいい
#!/usr/bin/perl
require 'jcode.pl';
$str = 'ZENKAKU123';
jcode::convert(\$str, 'euc');
jcode::tr(\$str, 'A-Z0-9', 'A-Z0-9');
print $str, "\n";
__END__
0134名無しさん@お腹いっぱい。
2001/05/20(日) 18:31ID:P53jKHxsリファレンスとして便利なPerlサイトはいっぱいあるけど、
Perlをいちから学ぶためのサイトは知らないなあ。
Perlの本を沢山買い込んであるなら、やっぱ最初はそれを
読むことから始めるほうがいいんじゃないの。
この↓参考書籍スレッドも参考になるよ。
http://corn.2ch.net/test/read.cgi?bbs=php&key=988809842&to=9
0135初心者
2001/05/20(日) 18:40ID:4X2s.QbM>ついでにEOFもセットされる。(最後まで読んだので)
すみませんもう一つだけ
eofなんですけど、ファイルの一括処理
>@old = <OLD>;
を行った時も下記の様に使えますか?
@old = <OLD>;
foreach $old_rec(@old){
if(eof(OLD)){
#最終行の処理
}
}
マニュアルには eof(ファイルハンドル)を指定すると
書いてあるのですが、この場合もファイルハンドルで
いいのでしょうか?
0136名無しさん@お腹いっぱい。
2001/05/20(日) 18:49ID:???@old = <OLD>;
とした時点で配列"@old"とファイルハンドル"OLD"は何の関係も無くなる。
同じ事をしたいのならwhileで回せ
while(defined($old_rec = <OLD>))
{
&nbsp;&nbsp;if(eof(OLD)){
&nbsp;&nbsp;&nbsp;&nbsp;#最終行の処理
&nbsp&nbsp;;}
}
0137名無しさん@お腹いっぱい。
2001/05/20(日) 18:50ID:???while(defined($old_rec = <OLD>))
{
if(eof(OLD)){
#最終行の処理
}
}
0138132
2001/05/20(日) 21:00ID:Ir3q0zHo無事変換できました。3日悩んでいたのでとても嬉しいです。
ありがとうございました。
0139馬鹿
2001/05/20(日) 22:34ID:???http://www.microsoft.com
http://www.microsoft.com/
とかの入力から、これを
www
microsoft
com
に分解するにはどうすればいいの?
0140_gunzip
2001/05/20(日) 22:45ID:???直接には役に立てなかったけど、上手くいってよかった。
お仕事頑張って。(ちょっと無責任かな.......)
>この場合もファイルハンドルでいいのでしょうか?
はい。ちなみに、
perldoc -f eof
でPerlの関数(この場合はeof)についてのマニュアル(英語)を読むことが出来ますよ。
他のも色々試してみてください。
>>139
これでいいか?
#!/usr/bin/perl
@url = split /\n/ , <<;
www.hogehoge.com
www.hogehoge-u.ac.jp
hogehoge.com
http://hogehoge.com/
http://hogehoge.com
http://www.hogehoge.com/
foreach(@url){
m%([0-9a-z\-]+\.)*?([a-z0-9-]+)\.([a-z]{2,3})(?:\.([a-z]{2}))?([^a-z]|$|/$)%i;
print "$_ :\t \$1 = $1, \$2 = $2, \$3 = $3, \$4 = $4\n";
}
0141名無しさん@お腹いっぱい。
2001/05/20(日) 22:47ID:???$str = "http://www.microsoft.com/";
$str =~s/(http:\/\/)?([^\/]+)(\/)?/$2/;
@array = split /\./, $str;
0143めっちゃ初心者です
2001/05/21(月) 21:53ID:Ra9UJdqo/を,に変換したいのですが美味くいきません
こんな感じです。
$moji = "111/222/333";
$moji =~ tr///,/;
print "$moji";
/という文字がやっぱ不味いんでしょうか?でも/をどうしても,
に変換したいんです。
宜しくおねがいします。
0144名無しさん@お腹いっぱい。
2001/05/21(月) 22:14ID:???0146名無しさん@お腹いっぱい。
2001/05/21(月) 22:24ID:???たった2バイトの回答で感謝されるのも珍しい(笑)
0147名無しさん@お腹いっぱい。
2001/05/21(月) 23:18ID:???気づく時は「あ〜っ」という感じなんだろう(笑)
0148初心者
2001/05/22(火) 17:16ID:v5lFmpjo「スカラー変数の値の左端からn桁を抜き出す」
コマンドってありませんか?
0149初心者
2001/05/22(火) 17:17ID:v5lFmpjo「スカラー変数の値の左端からn桁を抜き出す」
コマンドってありませんか?
0150初心者
2001/05/22(火) 17:18ID:v5lFmpjo「スカラー変数の値の左端からn桁を抜き出す」
コマンドってありませんか?
0151名無しさん@お腹いっぱい。
2001/05/22(火) 17:33ID:???0152初心者
2001/05/22(火) 17:56ID:v5lFmpjo0153名無しさん@お腹いっぱい。
2001/05/22(火) 23:57ID:???また、できるとすればどうやったらできるんでしょう?
やっぱり変換するしかないのかな・・・・。
0154疑問。
2001/05/22(火) 23:59ID:???ってどうやるんでしょうか。
サブルーチンではなく、普通のファイルを、なのですが・・。
0155名無しさん@お腹いっぱい。
2001/05/23(水) 00:04ID:???require "./file.pl";
0156名無しさん@お腹いっぱい。
2001/05/23(水) 00:13ID:???$ perldoc perlxs
0157名無しさん@お腹いっぱい。
2001/05/23(水) 00:31ID:???0158JAPU
2001/05/23(水) 02:38ID:???http://search.cpan.org/search?dist=Inline
少し前の The Perl Journal に載っていたんだったかな。
0159名無しさん@お腹いっぱい。
2001/05/23(水) 11:29ID:Qg5ERlzM0160名無しさん@お腹いっぱい。
2001/05/23(水) 12:06ID:???>>159
使ってみて報告してくれ
0161名無しさん@お腹いっぱい。
2001/05/23(水) 17:39ID:Lqr/QSWw$str = "12345";
$str =~ tr/0-9/0-9/;
print "Content-type: text/html\n\n";
print $str, "\n";
print "</body></html>\n";
とすると出力が
0203040506
となってしまいます、普通に 12345 とは表示できないのでしょうか?
0162名無しさん@お腹いっぱい。
2001/05/23(水) 17:48ID:???>>133
0163antique
2001/05/23(水) 17:54ID:???-----------------------------------
require './jcode.pl';
$str = "12345";
jcode::tr(*str, "0-9","0-9");
print $str;
0164antique
2001/05/23(水) 17:53ID:???-----------------------------------
require './jcode.pl';
$str = "12345";
jcode::tr(*str, "0-9","0-9");
print $str;
0165antique
2001/05/23(水) 17:56ID:???あ、タイムスリップもしてる(w
0166名無しさん@お腹いっぱい。
2001/05/23(水) 18:02ID:Lqr/QSWwありがとうございます
0167名無しさん@お腹いっぱい。
2001/05/23(水) 23:12ID:???ローカル(win98/httpd)で使用することは出来ますか?
つーか使い方もまだ良く分からないんだけど(ぉ
0168名無しさん@お腹いっぱい。
2001/05/23(水) 23:16ID:???モジュールを使ってみようとしましたか?
0170名無しさん@お腹いっぱい。
2001/05/23(水) 23:52ID:???はいってアンタ…(w
使ってみた結果は?
0171名無しさん@お腹いっぱい。
2001/05/24(木) 12:36ID:???0172名無しさん@お腹いっぱい。
2001/05/24(木) 14:35ID:???0173名無しさん@お腹いっぱい。
2001/05/25(金) 00:05ID:wtGhDgwQ0174名無しさん@お腹いっぱい。
2001/05/25(金) 01:07ID:???メッセージを送信した後に記事表示部をリロードするには
どうすればいいのでしょうか? 教えてください。
0175名無しさん@お腹いっぱい。
2001/05/25(金) 01:37ID:???HTMLの勉強をしよう。
<form method=POST action=undex.cgi target=under>
それともオートリロードの仕方かい?
<meta http-equiv="refresh" content="90;url=under.cgi">
必要ならunder.cgi?name=$nameとかにすればよろし。
0176175
2001/05/25(金) 01:38ID:???0178名無しさん@お腹いっぱい。
2001/05/25(金) 07:29ID:tY41esp20179名無しさん@お腹いっぱい。
2001/05/25(金) 10:03ID:???0180名無しさん@お腹いっぱい。
2001/05/25(金) 23:58ID:???やはりtelnet設定してやらナイト無理ですか?
ちなみにサーバはf2sです。
0181名無しさん@お腹いっぱい。
2001/05/26(土) 00:11ID:ykv1O/hI使用されているCGIのソースをこっそりダウンロードする方法ってありますか?
0182名無しさん@お腹いっぱい。
2001/05/26(土) 00:57ID:AODUSOWA無い。あまりそんな質問されると厨房だと思われますよ。
0183名無しさん@お腹いっぱい。
2001/05/26(土) 01:05ID:???IDが微妙にカッコ(・∀・)イイ!
0184弐ch編者
2001/05/26(土) 07:58ID:???こいつはやめそうにないんで
とりあえず泣かそうと思ってる。
0185名無しさん@お腹いっぱい。
2001/05/26(土) 08:12ID:???本気でIDカッコ(・∀・)イイ!
# アドゥソワ?
0186名無しさん@お腹いっぱい。
2001/05/26(土) 19:51ID:ojerd3UA移植に使えるかと思ったんですが・・・。
0187名無しさん@お腹いっぱい。
2001/05/26(土) 19:58ID:GHTZid3cprintf"Hello World\n";
と書いてsample001.plで保存。
Perlでperl sample001としてもなにも起こりません。ソースのパスを
指定してないからなんでしょうが、パスを変更する方法がわかりません。
0188名無しさん@お腹いっぱい。
2001/05/26(土) 20:07ID:???[email protected]$ perl -MO=C foo.pl >foo.c
0189名無しさん@お腹いっぱい。
2001/05/26(土) 20:14ID:???[email protected]$ export PATH=$PATH:/home/hoge/bin
0190名無しさん@お腹いっぱい。
2001/05/26(土) 21:26ID:???0191名無しさん@お腹いっぱい。
2001/05/26(土) 21:32ID:???・printf
・.plを抜かす
・「なにも起こらない」
ってことでネタと断定
0192名無しさん@お腹いっぱい。
2001/05/26(土) 22:02ID:???確かにあまり使わないが、別に誤りでもなかろ。
0193名無しさん@お腹いっぱい。
2001/05/27(日) 00:00ID:???open(FILE,"$filename") or die('...');
ってしてますよね?
sleep(1) until open(FILE,"$filename");
みたいなのは駄目なんでしょうか?
0194名無しさん@お腹いっぱい。
2001/05/27(日) 00:06ID:???ファイルがずっと開けない状態にあったらどうなるのかな?
0195名無しさん@お腹いっぱい。
2001/05/27(日) 00:40ID:???0196名無しさん@お腹いっぱい。
2001/05/27(日) 03:38ID:???>perldoc perlcc
$ perlcc -c file # Creates a C file, 'file.c'
$ perlcc -c out.c file # Creates a C file, 'out.c' from 'file'
$ perlcc -c -e 'print q//' # Creates a C file 'a.out.c'
0197187
2001/05/27(日) 04:03ID:fXHTNImEしてみただけです。ちなみに
perl e:/書類/ユーザー/perl/sample001.pl
ってやったらMS-DOS窓が閉じちゃいました。なにか表示されたのが
一瞬見えましたが。perl5.6.1です。
0198名無しさん@お腹いっぱい。
2001/05/27(日) 05:41ID:???DOSプロンプトで起動してるのか?
system(exit);
でもやらんと閉じない気がするのだが。
0199187
2001/05/27(日) 07:32ID:daAcq/BIえ?PerlのアイコンwクリックでDOS窓が開きませんか?
0200187
2001/05/27(日) 07:37ID:daAcq/BIあれがPerlのインターフェイスですね。
0201187
2001/05/27(日) 07:41ID:daAcq/BIActivePerl-5.6.1.626-MSWin32-x86-multi-thread
これ以外になにかインストールしないといけないんでしょうか。
■ このスレッドは過去ログ倉庫に格納されています