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

【Perl】初心者コーナー Part19

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん03/01/11 13:52ID:???
初めに→「perl」その物のスレです。

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

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

あとは>>2-10にまかせた。
0802nobodyさん03/02/01 23:24ID:???
>>792.795.796
プププ
哀れだね
0803nobodyさん03/02/01 23:33ID:???
>>802
ここで熱くならずに無視できなかったから子供?
0804nobodyさん03/02/01 23:42ID:???
>>803
よくご存じで。
0805nobodyさん03/02/01 23:42ID:???
  〃┏━━
  |. ノノソハ)))
(\リリ ´ー`)リ  < ファイルテスト演算子
 (ニE(#つo⊂#)

ファイルテスト演算子は、こんなことができる演算子だよ。
・このファイルがあるかどうかチェック (-e)
・ファイル(ディレクトリ)が読めるかどうかチェック (-r)
・ファイル(ディレクトリ)に書けるかどうかチェック (-w)
・ファイルかどうかチェックする (-f)
・ディレクトリかどうかチェックする (-d)
・ファイルのバイト数をチェックする (-s)

これくらい知ってるといいね。
実例だよ。

if ( -e "test.txt" ) { print "ファイルがあるよ"; }
else { print "ファイルないよ"; }

if ( -r "test.txt" ) { print "ファイルから読めるよ"; }
else { print "ファイルから読めないよ"; }

if ( -f "test.txt" ) { print "通常ファイルだよ"; }
else { print "通常ファイルじゃないよ"; }

$size = -s "test.txt";
print "$sizeバイト";

他にもいろいろあるんだけど、また必要になりそうだったら説明するね。
ややこしい説明はなるべく避けたいからね。。

じゃあ次回は、他の文字列処理関係の関数を勉強するよ
0806nobodyさん03/02/02 01:13ID:???
>>805
誤爆か……
0807厨房03/02/02 07:09ID:45tlaHB9
置換に関する質問です。

$a = "aaa"; $b = "aa";
$a = ~s/^$b//;
print "$a\n";

これを実行すると
a
という実行結果になると思うのですがなぜか
4294967295
という実行結果が出ました。。 なぜでしょう?
perlのバージョンは
5.005_03 built for i386-freebsd
です。。
0808マリモーマ ◆r6PDGT6Xd2 03/02/02 07:20ID:m/KRriEG
^$bのせいでは?
0809nobodyさん03/02/02 07:23ID:???
$a =~ s/^$b//;
0810厨房03/02/02 07:27ID:45tlaHB9
あー
>>809さんの指摘通りでした。。
>>808さん>>809さん、ありがとうございました。
0811nobodyさん03/02/02 09:20ID:mV23mEyN
自分でライブラリを作るんだけど、

package MYLIBRARY;
sub new {
  ・・・
}

とか書きますよね。
んで、このソースにも、ちゃんと my のチェックをしたいので、use strict を書こうと思うんですが、

use strict;
package MYLIBRARY;
sub new {
  ・・・
}

とすべきか

package MYLIBRARY;
use strict;
sub new {
  ・・・
}

とすべきか迷ってます。
package よりも前に書くのと後に書くのはいっしょなんですか?
それとも、なんか違うんですか?
0812 ◆PerlqhxPVA 03/02/02 10:38ID:???
>>811
他の汎用ライブラリをお手本にする。
0813nobodyさん03/02/02 14:10ID:pmlltvJ1
↓ここまとめられないかな?
my($a)=&hoge();
@b=@$a;
↑
sub hoge {
------
return(\@a);
}
0814nobodyさん03/02/02 14:21ID:pmlltvJ1
ごめんできた
0815nobodyさん03/02/02 14:24ID:???
>>814
どうやって?
知りたい。
0816nobodyさん03/02/02 15:28ID:6TL1miGW
>>815
>>814じゃないけど、
@b=@{hoge()}
ってことでしょ。

配列のコピーが発生するからリファレンスのまま行った方がいいような気がするが
0817nobodyさん03/02/02 15:52ID:???
掲示板で
$trip って入れてあるところにトリップ出せるような
機能のつけかた教えてください。
0818nobodyさん03/02/02 15:55ID:???
>>817
$trip = "トリップ";

面倒だからやめた。htmlファイルなめて正規表現で該当箇所置き換えろ。
0819 e03/02/02 16:07ID:???
# ハンドル(トリップ)
&jcode::tr(?$FORM{'FROM'}, '#', '#');
if($FORM{'FROM'} =~ /([^?#]*)?#(.+)/){
my $main_message = $1;
my $handle_pass = $2;
my $change_salt = substr($handle_pass, , 1) . "H";
$handle_pass = substr(crypt($handle_pass, $change_salt), -8);
if($main_message ne ""){
$FORM{'FROM'} = "$main_message </b>◆$handle_pass <b>";
}else{
$FORM{'FROM'} = "</b> ◆$handle_pass <b>";
}
}
0820nobodyさん03/02/02 16:15ID:???
そういうのはCGI改造スレでやってくれ。
082172703/02/02 21:03ID:ionxQd5/
require 'cgi-lib.pl';
&ReadPlarse(*form);
require 'jcode.pl';
&jcode'convert(*form,'sjis');
$data = $form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n
open(ENQ, ">>$enqdata.dat")||do{print "ERR";exit;};
#flock(ENQ, 2);
print ENQ $data;
#flock(ENQ, 8);
close(ENQ);
print "Content-type:text/html\n\n";
print >> "END_OF_HTML";
<HTML>
<HEAD>
<TITEL>有難う御座いました</TITLE>
</HEAD>
<BODY>
アンケートは送信されました!<BR>
またのお越しをお待ちしています
</BODY>
</HTML>
END_OF_HTML
これを実行したら
Backslash found where operator expected at enquetesys.pl line 11, near "}\"
(Missing operator before \?)
syntax error at enquetesys.pl line 11, near "}\"
enquetesys.pl had compilation errors.
ってえらーがでました。
落してきたソフトを実行しただけなのになんでエラーがでるのでしょうか?
0822nobodyさん03/02/02 21:08ID:???
>>821
まともに設定もされてないんだろ。
0823nobodyさん03/02/02 21:10ID:lbpBAa4z
ファイルハンドルの配列というのはできないのでしょうか?
$MAX = 2;
@NAME = ('a','b');

for($i=0;$i<$MAX;$i++){
  open(@FILE, "./$NAME[$i].txt");
}

これだとエラーになってしまいました。
上記のコードのミス、もしくは何か他の方法がありましたらアドバイスお願いします
0824nobodyさん03/02/02 21:13ID:???
>>823
って言うかそんないっぺんにファイル開いて何する気よ?
0825デフォルトの名無しさん03/02/02 21:16ID:???
>>821
エラーメッセージちゃんと理解するように努力しろよ。
英語分かんなかったら又厨房からやり直せ
0826nobodyさん03/02/02 21:16ID:???
>>821

>$data = $form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n
$data = "$form{'name'}\n$form{'mail'}$form{'sex'}\n$form{'ryori'}\n$form{'message'}\n\n";

>print >> "END_OF_HTML";
print <<"END_OF_HTML";

そして最後の改行も忘れずに。
0827nobodyさん03/02/02 21:21ID:???
>>826
さて、厨房を甘やかした代償がいかに大きいかわかってないバカがいるわけだが。
0828 ◆PerlqhxPVA 03/02/02 21:23ID:???
>>827
しかもマルチだたし(哀)
0829nobodyさん03/02/02 21:23ID:GIziK5Md
スレ汚し失礼します。
今、
http://live.2ch.net/test/read.cgi/festival/1044106562/
このスレで
http://blatt.hp.infoseek.co.jp/
このサイトが大流行
みなさんも逝ってみてください。
よろしくおねがいします。
失礼しました。
0830nobodyさん03/02/02 21:27ID:???
mod_perl では exit()が使えないんらしいんだけど・・・
どうすんの?
exit()なしで終り?
0831h03/02/02 21:33ID:skZYA3IH
他にも書いちゃ単ですが・・・

ローカルでCGIを動かしたところ,うまく動作しました。
で,インターネットテンポラリーファイルとクッキーを削除したら
クッキーが復活しません。
どうしたらいいですか?
0832nobodyさん03/02/02 21:43ID:???
データファイルをまとめるCGIを作っているのですが、
日本語検索がうまくいきません。
if($test =~ /テスト/)
だとエラーになってしまいました。
jcodeというのもちゃんと入れました。
何かよい方法はないでしょうか?
0833nobodyさん03/02/02 21:46ID:???
>>832
jcode入れたところで標準の正規表現は英語用です。
083482603/02/02 21:56ID:???
がーん( ̄A ̄||)
083572703/02/02 22:43ID:ionxQd5/
>>827
ありがとうございました。
って言うか。コンパイルエラーが出るようなプログラムを
PERL講座って感じで公開しないで欲しいですよ、まったく。
0836nobodyさん03/02/02 23:10ID:???
>>835
講座である以上素人相手ではないのだから多少のミスはユーザ側で直して当然ということだろう。

実際、人の間違ったコードというのは課題としてよく使われる。
0837nobodyさん03/02/02 23:30ID:???
>>836
しかし、配布元http://www.salut.ne.jp/bf/wmh/seminar/にある
アフォ面http://www.salut.ne.jp/bf/wmh/seminar/img/KiryuuKiri.jpg見ると

単 に ヘ ボ な だ け
0838nobodyさん03/02/02 23:32ID:???
>>837
かと言って>>727が賢いわけでもあるまい。

そのヘボのスクリプトさえ使いこなせないわけだ。
0839nobodyさん03/02/02 23:50ID:???
>>838
その件については禿しく胴囲する。
0840h03/02/03 00:15ID:XAlS7Khu
ローカルでCGIを動かしたところ,クッキーが機能しました.
で,クッキーを削除したら クッキーが機能しません。
クッキーを復活させるにはどうしたらいいですか?
0841nobodyさん03/02/03 00:30ID:???
またクッキーを食べさせろ。
0842nobodyさん03/02/03 01:53ID:???
>>823
use Symbol;
my %fh = (foo => gensym, bar => gensym, baz => gensym);
my($i, $file, $fh) = (1);
open $fh, ">$file.txt" or die while ($file, $fh) = each %fh;
for (0..4) { print $_ $i++ for values %fh }
close $_ for values %fh;

>>830
http://www.din.or.jp/~bigstone/cgilab/cgitips/mod_perl1.html
0843nobodyさん03/02/03 07:12ID:JvqhDUOZ
日本語が混じったファイルの整理をするCGIを作りってるのですが、
↓のようなモノを数人分をtableでまとめようとしています
--------------------
あああ 123回
いい   11回
うううう 50回
----------------------
このような感じで文字は左端にそろえてあり、
回数のほうは「回」の部分でそろえられています。
この場合どのようにしたら回数の部分を読み込めるのでしょうか?

まず、日本語検索をしようとしてもエラーになってしまい、
もし日本語検索がうまくいったとしてもそのあとはどうすればよいのかと、
試行錯誤しております。
何かアドバイスありましたらご教授お願いします
0844nobodyさん03/02/03 07:46ID:???
>843
EUCで処理。
正規表現で抜き出す。

> もし日本語検索がうまくいったとしてもそのあとはどうすればよいのか
知らんよ、おまいの心は漏れにとどかんとよ。
0845デフォルトの名無しさん03/02/03 07:56ID:???
$_ = 'あああ 123回';
/(\d+)/; print $1,"\n";
0846nobodyさん03/02/03 10:07ID:???
>>843
データのフォーマットから見直すべき。
整形は出力時にやれ。
0847nobodyさん03/02/03 10:42ID:D3Jh7Sun
すいません、本当はEXCELのVBとかでやるべきことなのかもしれませんが、
自分はperlに関して少々の知識があるくらいなので質問させていただきます。
htmlで、各人の名前にリンクでメールアドレスがついてるソース

例えば
<a href="mailto:[email protected]">AAA</a><br>
<a href="mailto:[email protected]">BBB</a><br>
<a href="mailto:[email protected]">CCC</a><br>
.
.
.

みたいになってるときに、ソースをテキストファイルとして保存し、それを読み込んで
メールアドレスだけ取得し、別のテキストに書き出したいのですが、どうやって検索したら
アドレスだけ抽出できますか?
自分ではアドレスには前にmailto:があり、最後は(自分の場合は携帯アドレスなので).jpで終わってる
ので、この間にある部分をすべてとるようにしたいのですが、可能ですか?




0848nobodyさん03/02/03 10:59ID:???
>>847
できるよ...
つーか2,3個前のレスぐらい嫁。
おんなじようなことやってるやん。
0849nobodyさん03/02/03 11:11ID:???
>>847
@mail = map { /mailto:(.+?)"/ and $1 } @html;
0850nobodyさん03/02/03 12:01ID:D3Jh7Sun
>>848
>>849
ありがとうございます。perlに関する知識があるとはいえ、ソースの意味が
なんとなくわかる程度なので、作るとなるとごく基本的な事もあやふやです。
#!/usr/bin/perl


$datafile = "./mail.dat";
$sortfile = "./sort.dat";

open(LOG,"$datafile");
@html = <LOG>;
close(LOG);
@mail = map { /mailto:(.+?)"/ and $1 } @html;

open(FILE, ">$sortfile");
print $mail;
close FILE;
exit;

どこがおかしいですか?お願いします☆
0851nobodyさん03/02/03 12:11ID:???
Perl2EXEの使い方、または参考になるページを
ご存じの方がいらっしゃいましたら教えてください。
0852nobodyさん03/02/03 13:38ID:???
>>850
perlに関する知識があるのにソースの意味がなんとなくわかる程度なのか?
おかしいのはチミの頭だYO

ちなみに漏れにはperlの知識は殆ど無い

print FILE $mail;
0853nobodyさん03/02/03 13:44ID:???
文字列のバイト数を改行コード「\n」込みで算出したいのですが、
なにか良い方法はありますでしょうか?
今の自分のレベルでは、
$string = qq(「\\n」が含まれた任意の文字列。\nThe arbitrary character sequences in which '\\n' was contained.);
$length = scalar(map{1} unpack("C*",$string));
print "任意の文字列 \$string の総バイト数は $length です。\n";
くらいしか思い付きませんでした。
もうすこし賢い方法ってありますでしょうか?
0854nobodyさん03/02/03 13:48ID:???
$mailってな(ry
0855nobodyさん03/02/03 13:52ID:???
と、すると・・・
print FILE @mail;
かな?
0856nobodyさん03/02/03 14:10ID:???
$ perl -ne '/mailto:(.+?)"/ && print "$1\n"' mail.dat >sort.dat
は嫌?
0857nobodyさん03/02/03 16:08ID:???
>853
length() だと不都合あるの?
0858デフォルトの名無しさん03/02/03 18:23ID:???
バイト数だからな
0859nobodyさん03/02/03 18:29ID:???
length()で得られるのはバイト数なんだが。
もちろん改行コードとか全部込みで。
0860デフォルトの名無しさん03/02/03 20:18ID:???
昔罠
0861nobodyさん03/02/03 20:53ID:D3Jh7Sun
>>856
それどういうソース?
0862nobodyさん03/02/03 22:05ID:gGc+aOjU
xpにはロック処理いらないんですか?
カウンターみたいの作ってdos窓11個で
ロック処理無しで同時進行しても0にならないんですけど。
086386203/02/03 22:06ID:gGc+aOjU
あっ、カウンターは無限ループさせてやってますです。
0864nobodyさん03/02/03 22:08ID:???
>>862
そら、一プロセスからなら何回ループさせようが呼び出しはシーケンシャルなのだから正常に処理されるだろう。


根本的に理解が足りてない予感。
0865nobodyさん03/02/03 22:11ID:???
ロックにもいろんな種類あるんよ。
よさげな解説みつけたからペタ
http://homepage1.nifty.com/glass/tom_neko/web/web_04.html
086686203/02/03 22:58ID:gGc+aOjU
あれ?DOS窓開きまくって同時実行しても1プロセスなんですか?
win98の時同じ事を試したら
見事に空ファイルができたと思ったのですが。
>>864-865
どうもありがとう。
0867nobodyさん03/02/03 23:04ID:1c8W3GXA
@file = <FILE>;
$line_num = @file;

以外で行数を取得する方法はありますか?
一行ずつ読み込んでカウンタを回すのもなしで
0868nobodyさん03/02/03 23:10ID:???
>>867
何が不満なのか聞きたい。
0869nobodyさん03/02/03 23:16ID:???
でかいファイルを扱いたいから。この方法だとメモリを食うor時間がかかる
0870nobodyさん03/02/03 23:19ID:???
>>867
while (read(IN, my $buf, 8192)) {
 $lines += ($buf =~ tr/\n//);
}
0871nobodyさん03/02/03 23:30ID:???
これでええんでないの?メモリ消費も少なめで、簡単だし。

++ $count while (<FILE>);
0872nobodyさん03/02/03 23:32ID:???
括弧は省略できたみたい。関係ないけど。

++ $count while <STDIN>;
0873nobodyさん03/02/03 23:32ID:???
>>870
できました。ありがとうございます
0874nobodyさん03/02/03 23:34ID:???
>>871-872
どうもです。
0875nobodyさん03/02/04 00:00ID:???
>>860
> 昔罠

昔と今でlength()の何がちがうの?
0876 03/02/04 00:17ID:rUOqBsxa
100行くらいのマスターデータがあって、ある行だけ上書き(更新)したいん
ですけど、一行づつループかけて、マッチした行以外をTMPファイルへ書き
込み。吐き出したデータを読み込んで、マスターデータに(>)上書き。
更新したい行をマスターデータに追加書き込み(>>)って方法でいいんでしょ
うか?行の順番はどうなってもよいです。
なんか、スマートな方法があったらご指導ください。
0877nobodyさん03/02/04 00:36ID:???
open(IN, 'master');
open(OUT, '>master.tmp');
while (IN) {
 if () {
  print OUT 新しいもの;
 } else {
  print OUT $_;
 }
}
rename('master.tmp', 'master');
0878nobodyさん03/02/04 00:37ID:???
>>876
死ねクソマルチ。 
0879nobodyさん03/02/04 00:38ID:???
>>876
マルチするほどの事じゃないだろ。どうせ見るヤツかぶってるんだし。

100行くらいならメモリに入れておいてもいいんじゃない?
メモリの量が気になるなら読み込みつつ別ファイルに書き込み。
マッチしたらその行だけ変更して最後まで読み書きする。
最後にリネームして終わりだな。

つか今度マルチしたらグーで殴るからね
0880nobodyさん03/02/04 00:39ID:???
>>875
utf8
0881nobodyさん03/02/04 01:02ID:Z72oZy+O
printの中で変数を展開したいのですが、どうすればいいのですか?

$i = 1;
print "$i+1";
で'2'と出力したのですが。
0882nobodyさん03/02/04 01:08ID:eARYiwGA
print $i+1;
0883nobodyさん03/02/04 01:10ID:???
print "${\( $i + 1 )}";
print "@{[ $i + 1 ]}";
0884nobodyさん03/02/04 01:18ID:???
>>882-883
サンクス
0885nobodyさん03/02/04 01:55ID:???
-M の返す値って実際何を表してるんですか?
出力してみても何だかわかんなくて。
0886nobodyさん03/02/04 02:04ID:CHyA5DeQ
win98にApacheとActivePerlを入れたんですがCGIファイルを実行すると
Forbiddenと出てしまいます。どこの設定がおかしいのでしょうか?
0887nobodyさん03/02/04 02:12ID:???
>>885
最後にファイルを修正してからの日数じゃないの?
てか -Mだけじゃ分からんだろ(w perl -Mの意味かと思った。

>>886
何を参考に設定したのか知らないけど、もう一度apacheの設定の仕方を見てごらん。
まぁエラーログみれば原因分かるから、それを元に検索するのも勉強。
0888nobodyさん03/02/04 03:42ID:VBD/sziN
if($a and $b){ 処理 }
は、$aと$bに何か入っていたら処理するで実際OKなのですが、
unless($a and $b){ 処理 }
ですと、両方入ってなかったら処理って風にならく、
どちらか一方でも処理に行ってしまいます。
ifのまるっきり反対じゃないんですね。何か訳があるのでしょうか?
0889nobodyさん03/02/04 03:50ID:???
>>888
小学校の「べん図」からやり直し
089088803/02/04 03:53ID:???
>>889 素早くさんきゅー 不覚だった・・・
0891nobodyさん03/02/04 04:00ID:???
ド・モルガンて名前を思い出せなくて遅れをとったYO!
089287603/02/04 09:15ID:???
すいません。。。
マルチするつもりじゃなかったんですが、書き込みした後、リロード
して確認したら書き込まれていなかったもので、スレまちがえて再書き込みして
しまいました。ご迷惑おかけしました。
いろいろなアドバイスありがとうございました。今日、がんばってみます。
0893nobodyさん03/02/04 09:28ID:???
>>888
unlessってのは、評価の結果が偽のときに実行するという命令であって、
条件式の評価の仕方が逆になるわけではない。
慣れないうちは、if (! 式) {} を使っておいたほうがいい。
0894nobodyさん03/02/04 12:16ID:ZSr84PG1
ハッシュに入れた日本語をforeachでeucにしたいのですが期待通りの結果になってくれません。
%TEST = ('A' =>'あ', 'B' => 'い');
foreach $key(keys %TEST){
&jcode'convert(*$key, "euc");
}
このやり方では駄目なのでしょうか?
0895nobodyさん03/02/04 13:08ID:???
>>894
keyをコンバートしてどないするん。
&jcode'convert(*$TEST{$key}, "euc");
やな。
0896nobodyさん03/02/04 13:19ID:???
は!
なんとマヌケな…

ありがとうございました!
以後気をつけます。
0897nobodyさん03/02/04 14:28ID:???
おう、気をつけろよ
0898 ◆hMJAPH9PWA 03/02/04 14:31ID:???
最近妙にネタが多い気がする。
089971103/02/04 14:42ID:???
オンライン翻訳についてT電子に問い合わせたら、年50万とか言われた。
なんかもう自分で作りたくなっちゃったよ。PERLでcgi形式で翻訳スクリプト
なんて作ったら、どうなるんだろ。無謀か。
0900nobodyさん03/02/04 16:42ID:???
>>899
翻訳スクリプト作れるくらいの英語力(?)があったら翻訳スクリプトなんて必要ない。
0901nobodyさん03/02/04 17:02ID:???
>>899
1.入力フォームを作る
2.入力された文章をhttp://www.infoseek.co.jp/Honyaku?pg=honyaku_t_inout.html&svx=105420&svp=SEEK
にwgetで投げる
3.getしたhtmlから結果だけを抜き出して、整形して表示
レス数が900を超えています。1000を超えると表示できなくなるよ。