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

Perlコーディング初心者質問スレ Part 40

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/27 18:08:42ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0304nobodyさん05/02/10 19:40:55ID:???
変数【$bbb】の後ろに【.txt】と書きたいのですが、どう区別したらいいのでしょうか?

my $aaa = "$bbb.txt";
0305nobodyさん05/02/10 19:49:39ID:???
>>304
区別って$bbbと".txt"の境界をはっきりPerlに伝えたいってこと?
とりあえず、"."は変数の一部とは見なされないから、そのままでもOKだけど、
もっと安全に書きたいというのなら、

my $aaa = $bbb . ".txt";
my $aaa = "${bbb}.txt";
030630405/02/10 19:59:43ID:???
>>305  サンクス

でもできない...  他にない?
0307nobodyさん05/02/10 20:24:57ID:???
>>306
なぜ出来ないの?
030828205/02/10 20:46:53ID:???
>>303
やべー。恥ずかしい。pathとpassを間違いまくってた。_| ̄|○
そっか、ハッシュを使うんですね。ハッシュ。
しかも所々細かいアドバイスありがとう。
って事で今からテストしてきます。

030930405/02/10 21:41:23ID:???
変数に複数行のHTMLを格納したいのですが、できますか?
0310nobodyさん05/02/10 21:46:11ID:???
$sazae = "<p>でら<br />\nべっぴん</p>";
0311nobodyさん05/02/10 21:50:00ID:???
>>504 

$sazae = "

<table width=675 border=0 cellspacing=0 cellpadding=0 height=5>
<tr>
<td><img src="http://img.yahoo.co.jp/images/clear.gif" alt="" width=1></td>
</tr>
</table>

";
0312nobodyさん05/02/10 22:23:33ID:???
>>304
$masuo = <<"EOM";
<p>
でら<br>
べっぴん
</p>
EOM
0313nobodyさん05/02/10 22:24:27ID:???
>>311
エスケープ汁。バーヤ。
0314nobodyさん05/02/11 01:43:21ID:???
Win2000環境にてAN HTTPD+Perlで2chの板一覧を取得したいと考えています。
しかし、「www6.ocn.ne.jp」からは取得できますが、「www.ff.iij4u.or.jp」からは「Access Denied」となります。
当然ブラウザからならアクセス可能。User-Agent等を変えてもうまくいかず・・ご助言宜しくお願いします。

#!/usr/local/bin/perl -w
use Socket;

#$address = "http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html";
#$host = "www.ff.iij4u.or.jp";

$address = "http://www6.ocn.ne.jp/~mirv/2chmenu.html";
$host = "www6.ocn.ne.jp";

$myagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
$rhost = "hoge.com";
$port = getservbyname('http','tcp');
$iaddr = inet_aton($host) or die "aton-err\n";
socket (SOCKET,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(SOCKET,sockaddr_in($port,$iaddr));
binmode(SOCKET);select(SOCKET); $| = 1; select(stdout);
print SOCKET "GET $address HTTP/1.0\r\n";
print SOCKET "Host: $host\r\n";
print SOCKET "User-Agent: $myagent\r\n";
print SOCKET "Accept: */*\r\n";
print SOCKET "Accept-Charset: *\r\n";
print SOCKET "Accept-Language: jp\r\n";
print SOCKET "Referer: http://$host/\r\n";
print SOCKET "Remote-Host: $rhost\r\n";
print SOCKET "\r\n";
while (chop($buf=<SOCKET>)) {print "$buf\n";}
close(SOCKET);
exit;
0315nobodyさん05/02/11 02:07:19ID:???
LWP使(ry
0316nobodyさん05/02/11 02:29:31ID:???
#!/usr/local/bin/perl -w
use Socket;

$address = "http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html";
$host = "www.ff.iij4u.or.jp";



$myagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
$rhost = "hoge.com";
$port = getservbyname('http','tcp');
$iaddr = inet_aton($host) or die "aton-err\n";
socket (SOCKET,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(SOCKET,sockaddr_in($port,$iaddr));
binmode(SOCKET);select(SOCKET); $| = 1; select(stdout);
print SOCKET "GET /~ch2/bbsmenu.html HTTP/1.0\r\n"; #ここがおかしい
print SOCKET "Host: $host\r\n";
print SOCKET "User-Agent: $myagent\r\n";
print SOCKET "Accept: */*\r\n";
print SOCKET "Accept-Charset: *\r\n";
print SOCKET "Accept-Language: jp\r\n";
print SOCKET "Referer: http://$host/\r\n";
print SOCKET "Remote-Host: $rhost\r\n";
print SOCKET "\r\n";
while (chop($buf=<SOCKET>)) {print "$buf\n";}
close(SOCKET);
exit;
031731605/02/11 02:35:22ID:???
あぁ 途中で書き込んでしまった。

$address =~ m|^http://([-_\.a-zA-Z0-9]+)/?(.*)$|;
$host = $1;
$path = $2;

と付け加えて、

print SOCKET "GET /$path HTTP/1.0\r\n";

と変更すると汎用性があっていいかも。
031829405/02/11 08:42:07ID:4xNa2hhv
>>302
ありがとうございます。
ユニークキーは一応Perl側で作成してますが、万が一の重複の可能性を考えて
インサート時にauto_incrementになってます。
なのでユニークキーについては役割は半々ですね。

LAST_INSERT_ID()ではアクセスが集中した時にミスりますよね?
プロセスAが入れる→プロセスBが入れる→プロセスAからのLAST_INSDERT_ID()を処理
=プロセスBが入れたものがプロセスAに渡されてしまうorz
031929405/02/11 10:01:49ID:4xNa2hhv
すみませんサイト読んでたらそういうことは起こらないと書いてありましたm(_ _)m
今回のCGIではPerlで半分ユニークキーを作成してますので、auto_incrementする可能性は
ほとんどないので、last_insert_id()がauto_incrementしてない時には初期値の0まま
(もしくは前回値ですが今回はinsert1回しかないので)という仕様を利用して、

my $your_id = $last_insert_id == 0 ? $perl_creat_id : $last_insert_id;

のようにして確実に自分が入れたデータの取り出しが可能になりました。
お世話になりましたm(_ _)m
0320nobodyさん05/02/11 10:31:52ID:???
よかったね
0321nobodyさん05/02/11 11:11:35ID:???
activeperl5.6
テスト環境は(local)→winXP
サーバ→Linux

@array = qw/a b c d e f g/;
@arrayの中に7個あります。インデックスは0-6になります。

これをランダムに表示させたいんですが単にrand関数を使っただけでは均等には
なりませんよね?(rand関数自体どこまで完全確率に近づけられているのかはわかりませんが、
それはおいといてください。)

print $array[(rand 6)];
これだと圧倒的に最後の$array[6]だけ選択率が落ちます。
0-5は小数点も付きますが、6だけ付かないのでまあ当然なのですが。

かといってrand 7にして7が選ばれたらマイナス-1するというのではまだ不公平ですよね。
rand 7にして7が選択されたらマイナスもrandで決定するというのも結局
そのときもマイナス7が選ばれる可能性が・・・・次に続けます
032232105/02/11 11:15:15ID:???
$number = rand 7;
$number = $number == 7 ? $number - rand 7 : $number;
print $array[$number];

前回言いかけましたがこうしても結局今度は$array[0]が選ばれる可能性がちょっと増える
ので不公平ですよね。

公平に0-6を抽選することはできないのでしょうか?
0323nobodyさん05/02/11 11:40:10ID:eHptbqsS
>>322

言ってることがよくわかりませんが

http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020909010545.shtml

このへん読んでみれば?


というかrand関数を使えば均等になるし、ちゃんとrand呼び出す前に
srand関数で初期化してますか?

032431405/02/11 11:54:58ID:???
>315-316さま
教えていただいた方法で無事取得できました。
ありがとうございました。
032532105/02/11 11:56:27ID:???
>>323
Perl5.1以降は自動的にsrandされてるみたいです。

もしかしてrand 8;
って0-8をランダムに選ぶのではなく0-7(小数点つき)を選ぶんですかね?
確かにprint rand 8;として
>8
となった経験はありませんが、ただ確率が極端に8だけ落ちるからだと思ってました・・・
私の勘違いだったのでしょうか?
0326nobodyさん05/02/11 11:57:37ID:???
rand(8)は、0以上8未満を返す。
032732105/02/11 12:23:35ID:???
>>326
すみませんでしたorz
0328nobodyさん05/02/11 14:06:49ID:???
print gmtime(time+32400)[5]+1900;

これで今年が何年なのかを表示させようと思ったらエラーがでました。
near ")["
となってたのですがこの形式はダメなのでしょうか?
gmtime(time+32400)自体はリストなので大丈夫だと思ったのですが。
0329nobodyさん05/02/11 14:14:41ID:???
かっこつけろよ
0330nobodyさん05/02/11 14:14:45ID:QAwMbYUp
(time+32400)
↑これをリスト扱いしてるでしょ。どう見ても。
0331nobodyさん05/02/11 14:24:46ID:???
W3C形式の日時を YYYY年 MM月 DD日 hh時 mm分 に変換したいです。

参考
Perlメモ/W3C形式の日時の解析
http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FW3C%B7%C1%BC%B0%A4%CE%C6%FC%BB%FE%A4%CE%B2%F2%C0%CF

2005-02-10T14:54:18+09:00 を変換する場合、どう書けばいいのでしょうか?
0332nobodyさん05/02/11 14:32:58ID:???

open FH,"+>>test.txt";
seek FH,0,0;
print FH "ファイルの先頭";
close FH;

これを実行したら何故かファイルの末尾にかかれました。
seekが効いてないのでしょうか?
0333nobodyさん05/02/11 14:33:32ID:???
>>327
init(rand(7));
でいいんじゃね?
033432805/02/11 14:34:37ID:???
print (gmtime(time+32400))[5]+1900;
でも同じエラーがでます。
0335nobodyさん05/02/11 14:42:49ID:???
>>332
+>>
ではseekは使えない。ポインタの移動自体が不可能。
もし先頭に追加したければ一度中身を配列に読み込んでから
unshiftで先頭に入れて上書きするしかない。

>>334
当たり前。かっこなんかつけてどうこうなる状況ではない。
@{[gmtime(time+32400)]}[5]
とすればいい。
0336nobodyさん05/02/11 15:19:23ID:???
>>334
print((gmtime(time+32400))[5]+1900);
0337nobodyさん05/02/11 15:37:08ID:???
>>332
">>"はO_APPENDがつくのでwriteがかならずその時点でのファイルの
末尾からになる。

ファイルをもしなければ作成して読み書き両用で開きたいんじゃないかと
思うが「>」使うのでちょうどいいのはたぶんない。openでシステムコール
のオプションを明示的に指定できるのでそれを使うのがいいと思われる。
0338nobodyさん05/02/11 15:45:03ID:???
>>334
print+(gmtime(time+32400))[5]+1900;
0339nobodyさん05/02/11 17:00:15ID:CPrSGSxU
perl初めてなんですけど、

print(
"引数",
"引数",
);
↑こーゆーのってコーディングスタイルとしてどーなんですか?
エラーはでないみたいなんですけど。
0340nobodyさん05/02/11 17:07:21ID:4xNa2hhv
if (){
my $test;
〜処理〜
undef $test;
}

ブロックの終端で人間が見たときにこのブロックでどういうローカル変数を使っているかを
わかりやすくするためにわざわざundefしてます。

私のテキストエディタでは関数名は太字になりますので、もの凄く見やすいです。
それでそのブロックないで作った(いじった)グローバル変数もまとめて列挙したいんですが、
# $global
とかしてもコメント用の色にはなりますが、太字にはならず見づらいです。

そこで何か変数に対して何もしない関数があればいいなと思ったのですが、何かいいのはありませんか?
scalar $global;
みたいな感じです。

undefにしろ完全に処理効率を落とすものでしかないのでなるべくその影響が
小さいものがいいです。undef以下の処理時間の関数だと最高です!
0341nobodyさん05/02/11 17:15:59ID:???
>>339
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
あとは君が書いたスクリプトを誰が保守するのか考えた上でご自由に。

>>340
エディタの為のコードを書くな。コードに合わせてエディタを設定しろ。
034234005/02/11 17:26:02ID:4xNa2hhv
>>341
エディタの設定ではできないのです。
0343nobodyさん05/02/11 18:20:17ID:???
>>339
リストの最後にカンマが付いているのを懸念しているのか?
結論から言えばアリ。ハッシュでも良く使うね。
{
foo => 1,
bar => 2,
}
後で項目追加したりするときに、ミスが出なくていい。
034434305/02/11 18:33:32ID:???
ちなみに根拠は
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
0345nobodyさん05/02/11 21:22:27ID:???
>>331
use HTTP::Date qw(parse_date);

my @date = parse_date("2005-02-10T14:54:18+09:00");
my $date_str = sprintf('%04d年 %02d月 %02d日 %02d時 %02d分 %02d秒', @date);
034633905/02/11 21:26:56ID:CPrSGSxU
CGIで使う時にprintが乱立するのが見苦しいから
こっちのほうがいいな、と。
Cのprintfだと引数1つしかだめなんでちょっと
おどろいたついでに確認してみたんですが・・
アリということなのでがんがんつかいますw
034733905/02/11 21:31:01ID:CPrSGSxU
あ、あと
print と print() だとなんか前者の方がよくみるんですが
print()の方でもいいんですよね?
関数に()がないのがなんか気持ち悪くて・・
034833905/02/11 21:37:39ID:CPrSGSxU
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
↑に書いてありましたね、連投スマソ
0349nobodyさん05/02/11 23:14:45ID:???
>>345 できた。 サンクス
0350nobodyさん05/02/12 00:13:28ID:???
>>340
あまりいい趣味とは思えないが、どうしてもやりたければ

use Filter::cpp;
#define NOOP(x)

とか?
0351nobodyさん05/02/12 00:15:44ID:???
>>347
俺は関数に限らず極力()を付けない。
基本的に見易さと理解しやすさが第一だから。
もちろんぱっと見たときにどういう優先順位かわからなくなりそうな時はつけるけどね。

>CGIで使う時にprintが乱立するのが見苦しいから
それとこれは君がしょぼいだけと言わざるを得ない。
出力内容はユーザによって変えないといけないことが多いCGIではprintを始める
以前にほとんどのデータを用意しておく。

そして何行にもなるならヒアドキュメントを使ってスッキリさせる。

まぁプログラミングなんて誰でもできるものだけど、
読みやすく効率のいいものが作れるかが馬鹿と賢者の分かれ目かな。

ってえらそうにごめんねm(_ _)m
とりあえず処理効率よりも読みやすさを薦めるよ。
0352nobodyさん05/02/12 01:31:57ID:???
一般的に、多くの場合関数には()をつけ、
演算子には()をつけないほうが読みやすいとされるそうです。
俺もそう思いますが、printは演算子です。
035334705/02/12 01:34:34ID:DEctNxAs
>>351
なるほど〜、うまいことやる方法がきちんとあるのですね。
なんせCGIは初めてで正直まだ何もわかっていないんです。
でも351さんがおっしゃっていることは自分も同意で、普段書く時
は気をつけています、綺麗なコーディング。

とにかくがんばります。
035434705/02/12 01:40:35ID:DEctNxAs
>>352
え、、、PerlやPHPだとprintは演算子なんですかぁ、ちとびっくり。
てっきり関数かと思ってました。
だから()がいらないんですね、なるほどなるほど。
0355nobodyさん05/02/12 03:35:24ID:W11W0gdq
>>346
そもそもCGIでprint文なんていくつも書かないだろ。
出力用のルーチンに投げてprintは1つでお終い。そこで変数展開してやればいい。
0356nobodyさん05/02/12 10:55:57ID:???
()の省略をprintとprintfでしかやってなかった俺は馬鹿者ですか、そうですか。('A`)
0357nobodyさん05/02/12 12:43:51ID:???
>>354
正確に言うと少し違う。Perlの組み込み関数はある意味で全て演算子であるといえる。

>>356
それでいいよ。その方が分かりやすい。
0358s05/02/12 16:09:49ID:???
文字「&」をpostで送りたいんですが、受け渡し後&を区切りとしているので
うまく読み取ってくれません。どうやればいいのでしょうか?
0359nobodyさん05/02/12 16:22:44ID:???
>>358
エンコード
0360nobodyさん05/02/12 17:35:59ID:???
>組み込み関数はある意味で全て演算子であるといえる
こら。好き勝手書くんじゃない。
0361nobodyさん05/02/12 19:42:57ID:???
>>360
関数は名前付単項演算子かリスト演算子になるのです。
perlfunc(1)の最初の方にそう書いてあるよ。

0362nobodyさん05/02/12 20:57:06ID:???
>>358
%26
0363nobodyさん05/02/12 23:09:29ID:???
サブルーチンではプロトタイプ宣言するべきですか?
0364nobodyさん05/02/13 00:57:42ID:???
>>363
プロトタイプ宣言を行うとどうなるかわかれば必要の有無もわかるはず
0365nobodyさん05/02/13 04:12:34ID:???
関数は名前付単項演算子かリスト演算子になるのです。

print ←リスト演算子
scalar ←名前つき単行演算子
rand ←引数が一つの関数
sort ←関数

演算子はコンパイラが変換形式と答えを知っている。
関数はインタプリタにて処理が実行される。
0366nobodyさん05/02/13 05:23:09ID:???
2文字ごとに%を入れたいんだけど、どうすればいいのか教えて欲しいです。
例
82CA82E982DB
を
%82%CA%82%E9%82%DB
にしたいのです。

使われる文字はa-zA-Z0-9の半角英数です。
ちなみに漏れが考えたのは、2文字ごとにsplitで分割して配列に入れ、joinでくっつけて頭に%をくっつけるって方法だけど、これでいいっすか?
0367nobodyさん05/02/13 05:30:51ID:???
>>366
それでいいよ

s/([a-zA-Z0-9]{2})/%\1/g

これでもいいし
0368nobodyさん05/02/13 05:33:24ID:???
>>367
即レスthx!
> s/([a-zA-Z0-9]{2})/%\1/g
採用させていただきました。
0369nobodyさん05/02/13 08:31:42ID:???
>>368
× \1
○ $1
0370nobodyさん05/02/13 12:40:44ID:NsfysfMz
perl modulesのhttpプロトコルを実装したモジュールの使い方を紹介したページは無いでしょうか。

googleでperl http webなどとしてもURLのスキーマがヒットするので要領を得ないのです。

0371nobodyさん05/02/13 14:54:56ID:???
>>370
httpプロトコルを実装したモジュールなどいくらでもあるから
どういうものを探してるのかわからんが、LWPなどよく使うものなら
↓に少々載っている。
http://homepage3.nifty.com/hippo2000/perltips/index.htm
0372nobodyさん05/02/13 16:48:05ID:???
>>371
ありがとうございました。実装できました。
0373nobodyさん05/02/13 16:50:52ID:Lwv6BlB8
if文で
$a == 1 かつ $b == 2
みたいに条件にaかつbみたいな複数条件を付けるにはどう書いたらいいんでしょうか?

教えてエロイ人
0374nobodyさん05/02/13 16:52:28ID:???
>>373
andか&&。
両者で演算子の優先順位が違うので要確認。
下名は何でもかんでも括弧でくくるのでその辺曖昧です。
0375nobodyさん05/02/13 16:53:57ID:Lwv6BlB8
>>374
即レスサンスコ
0376nobodyさん05/02/13 20:33:35ID:???
配列変数の中の物を消したいのですが、一行で済ませる方法ないですか?
@xx=();とやってもだめでした。

for($i=0;$i<=$#xx;$i++){
$xx[$i]="";
}
↑こうすればできましたが、やっぱり一行で何とかなりませんか?
0377nobodyさん05/02/13 21:00:28ID:???
@array = ();
でできるけど。
0378nobodyさん05/02/13 21:03:58ID:???
>>376
できなかった時のテストコード書いてみなさい。
0379nobodyさん05/02/13 21:08:31ID:???
>>376
@xx=()でだめということは、要素数を保ったままで全要素を
空文字列にしたいという問題なのかな?

もしそうなら、

map $_ = '', @xx;

$_ = '' for @xx;

for (@x) { $_='' }

あたりからお好きな奴を。下のほうに行くにしたがって
微妙に遅くなるけどそれほど差はない。map使う奴はvoid
コンテキストじゃないと遅くなるので注意。

空文字列じゃなくてundefでよければ、
@xx = ();
したあとに
$#xx = 要素数-1;
で要素数あわせる方が速いけど。



038037605/02/13 21:35:58ID:???
なぜか、今回やるとできました。ありがとうございます&お騒がせしました。
0381nobodyさん05/02/13 21:45:50ID:MAmE7PYm
入力されたメールアドレスが変じゃないかどうか調べるのはこんなのでいいですか?

!~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/

なんかもうちょっといいのあったら教えてください
0382nobodyさん05/02/13 22:24:52ID:???
>>381
メールのアドレスはまじめにやるとかなりメンドウななので、
Email::Valid(または日本の携帯のRFCに違反したアドレスにも
対応したければEmail::Valid::Loose)を使うのが楽だよ、
というかすこしまえにこのスレで話題になってたぞ。せめて
現行のログぐらい読め。

ttp://search.cpan.org/~maurice/Email-Valid-0.15/
ttp://search.cpan.org/~miyagawa/Email-Valid-Loose-0.04/
0383nobodyさん05/02/14 02:06:35ID:???
$mail =~ /[\w\-\.]+\@([\w\-\.]+)/;
$host = $1;
if ( !$host || !gethostbyname($host) ) {
print "不正なメールアドレスです";
}

俺はこうしてる。
0384nobodyさん05/02/14 07:52:59ID:mZmBq9e/
         ナ ゝ   ナ ゝ /    十_"    ー;=‐         |! |!
          cト    cト /^、_ノ  | 、.__ つ  (.__    ̄ ̄ ̄ ̄   ・ ・

            ,. -─- 、._               ,. -─v─- 、._     _
            ,. ‐'´      `‐、        __, ‐'´           ヽ, ‐''´~   `´ ̄`‐、
       /           ヽ、_/)ノ   ≦         ヽ‐'´            `‐、
      /     / ̄~`'''‐- 、.._   ノ   ≦         ≦               ヽ
      i.    /          ̄l 7    1  イ/l/|ヘ ヽヘ ≦   , ,ヘ 、           i
      ,!ヘ. / ‐- 、._   u    |/      l |/ ! ! | ヾ ヾ ヽ_、l イ/l/|/ヽlヘト、      │
.      |〃、!ミ:   -─ゝ、    __ .l         レ二ヽ、 、__∠´_ |/ | ! |  | ヾ ヾヘト、    l
      !_ヒ;    L(.:)_ `ー'"〈:)_,` /       riヽ_(:)_i  '_(:)_/ ! ‐;-、   、__,._-─‐ヽ. ,.-'、
      /`゙i u       ´    ヽ  !        !{   ,!   `   ( } ' (:)〉  ´(.:)`i    |//ニ !
    _/:::::::!             ,,..ゝ!       ゙!   ヽ '      .゙!  7     ̄    | トy'/
_,,. -‐ヘ::::::::::::::ヽ、    r'´~`''‐、  /        !、  ‐=ニ⊃    /!  `ヽ"    u    ;-‐i´
 !    \::::::::::::::ヽ   `ー─ ' /             ヽ  ‐-   / ヽ  ` ̄二)      /ヽト、
 i、     \:::::::::::::::..、  ~" /             ヽ.___,./  //ヽ、 ー
0385nobodyさん05/02/14 09:45:44ID:IE9wtcnB
CSV形式のファイルってどう読み込めばいいでしょうか?
カンマ区切りでダブルクォートで括られてると中のメタ文字は評価しないってやつです。
0386nobodyさん05/02/14 10:26:10ID:???
http://www.rfs.jp/sitebuilder/perl/02/08.html

ここを見ながらファイル操作をためしてます。
しかし
open FH,"+>file";
こうした時に何故かファイルの既存データが読み取れません。
+<を使うと普通に読み取れますが、このサイトは間違った事を書いてるのでしょうか?
+>は読み取りも可能だと一覧表には書いてあるんですが・・・・
0387nobodyさん05/02/14 10:37:57ID:???
>>385
Text:;CSV_XS

0388nobodyさん05/02/14 10:48:19ID:???
>>386
'+>'はファイルを開くときにまずいったん空にするのでそうなる。
そのあと新たに書き込んだ内容は読み出せるので読み取り可能と
いうのはそういう意味でいっていて間違いではない。

open(2)のflagsパラメタでいうと

'+>'はO_RDWR|O_CREAT|O_TRUNC
'+<'はO_RDWR


0389nobodyさん05/02/14 10:56:31ID:???
>>387
分ると思うが:;は::の打ち間違いです。シフトキーの押しが足りなかったようでスマヌ(汗)
039038605/02/14 11:07:15ID:???
>>388
そういうことでしたか!ありがとうござます。

ActivePerl5.6.1
Apache1.3
WindowsXP
この環境で今しがたflockのテスト行いました。flock初めてです;
open FH,"+<test.txt";
if (flock FH,2) {print "ok";}
seek FH,0,0;
print FH "あいうえお";
close FH;

>ok

okと出たのでflockがwinXPで使えるんだと思ってよいのでしょうか?
そうでしたら今から契約サーバでもこれを試して排他処理を選択しようかなと
思ってるんですが。
039138605/02/14 11:37:39ID:???
すみませんそれとflockなのですが
+<の時もflockはモードを2にしておいていいんでしょうか?

読み込み時にモード2でやるとロックがかからない時があるようですが、
+<これはどうなのでしょうか?
0392nobodyさん05/02/14 11:42:51ID:???
>>390
flockは9x系では使えないけどNT系は使えるということになってたと
思った。未実装だと致命的エラーになるはずだし。
0393nobodyさん05/02/14 11:57:52ID:???
>>391
perlのflockがlockfやfcntlを用いたエミュレーションで実現されている場合は、
書き込みで開いてないとLOCK_EX使えないことがあるようだ。XpのActivePerlが
どうなのかは知らない。どちらにせよ'+<'は書き込み付だから問題ないと思う。

Note that the emulation built with lockf(3) doesn't provide
shared locks, and it requires that FILEHANDLE be open with
write intent. These are the semantics that lockf(3) imple-
ments. Most if not all systems implement lockf(3) in terms of
fcntl(2) locking, though, so the differing semantics shouldn't
bite too many people.

Note that the fcntl(2) emulation of flock(3) requires that
FILEHANDLE be open with read intent to use LOCK_SH and requires
that it be open with write intent to use LOCK_EX.

あと「モード2」とかって見づらいので、use Fcntl qw(:flock);して「LOCK_ほげ」
という名前の定数を使った方がいいと思う。
039438605/02/14 12:21:05ID:???
>>392>>393
+系は書き込みで大丈夫なんですね^^
ありがとうございましたm(_ _)m
039538505/02/14 12:25:37ID:IE9wtcnB
>>387
どうもです
0396nobodyさん05/02/14 13:58:03ID:IE9wtcnB
Email::Valid
Email::Valid::Loose
この二つを使いたいのですがwin版perl5.6にはプリインストールされてないようです。
そこでppmを使用してEmail::Validだけインストールしてみました。
しかしどうやらMail::Addressともう一つ何かが必要なようでMail::Addressの法を
ppmでインストールを試みてみたらどうやらPPDがないので無理なようですorz

実は今までppm以外のインストールをしたことがありません。
しかしこの度メールフォームを作成したいので、XSS対策?代わりにメルアドチェックを
Email::Validに任せたいのです。
多分鯖にもインストールされてないモジュールだと思うので、winXP環境の
ものをそのままLinux鯖のユーザスペースに移して使おうと思ってます。
0397nobodyさん05/02/14 14:00:26ID:IE9wtcnB
やはりMail::Addressともう一つ必要になるものは自分でコンパイルするしかないのでしょうか?
しかしその場合はLinux上にコピーしたところで使用するのは不可能ですよね?

Email::Valid
Email::Valid::Loose
使用してる皆様アドバイスお願いします。
0398nobodyさん05/02/14 14:13:07ID:???
>>397
Email::Valid::Looseはperlだけで書かれているっぽいので、
コピーすればいけるんじゃないかな。

ちゃんとディレクトリを掘ったりuse lib追加したりは必要
だろうけど。

しかしLinuxなら普通の手順でインスコできそうなもんだが
貸し鯖かなんかですかね。
0399396 05/02/14 14:24:17ID:IE9wtcnB
>>398
Email::Valid::Looseは
Email::Validのサブクラスですよね?

Email::Valid自体もpureperlなんでしょうか?
実は私は中身を見てもそれがpureperlなのかどうか判断できない馬鹿者なんですorz

実際の実行はLinuxのレンサバですが、テスト環境がwinXPなのです。
以前にpureperlのモジュールをLinuxレンサバのユーザスペースに移して
使用したことはあるので、今回もpureperlならできると思いますが、
結局Mail::addressとNet::DNSモジュールあるいはnslookupが必要なので
むりぽですorz

行き詰ってるのでとりあえずソースを自分でコンパイルしてインストールする
方法を勉強してみます。
0400nobodyさん05/02/14 14:36:52ID:???
>>399
開発手元に持ったほうがいいよ。
俺はデスクトップ環境にはLAN上にRH9置いてる。
持って歩くノートにはWinXPをホストにしてcolinux+debianを使ってる。
perlモジュールはCPAN使ってインストしてる。
実機はレンサバだけどSSHできるのでCPANで ~/lib/perl5 とかにインストして use lib〜使ってる。

環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
マシンなければ colinux+debian(デストリは何でもいいけど)で、これ最強。
0401nobodyさん05/02/14 14:40:17ID:???
>>396
あまり知識がないなら簡単なチェックで我慢したら?
@.-_
確かこれ以外の記号を使ってるメールアドレスってないよ。
だからこれと英数字以外を含んでるなら「メルアドが不正!」みたいな
メッセージを出してメールフォーム画面に戻せばとりあえず問題ないけどね。

まともなメールフォームなら
"<>スペース
あたりも許容するべきだけど、まあないならないでいんじゃないかな?
0402nobodyさん05/02/14 14:49:16ID:???
>>399
Net::DNSまたはnslookupが必要になるのはmxcheckを有効にしたときで、
無効にしとけばいらないはず。
040339605/02/14 14:52:18ID:IE9wtcnB
>>400
colinux+debian
聞いたことない名前ですが調べてみますm(_ _)m
>環境作るの少々めんどいけど、都度Win環境でごたごたするよりはまし。
そうですよねorz

>>401
そうなのですか!?
メールフォームといっても相手していするアドレスに固定文章を送りつけるだけなので
メールフォームとは呼ばないのかもしれません^^;
>@.-_
でもrfc882か何かではサイトURLなどと同じ記号が許されてましたよね。
で、それが結構な数になりますが私も401さんが挙げてくれた記号以外を
使ったメールアドレスを見たことがありません。

でもちょっと不安です;
どなたか @.-_  この4種類以外の記号が使われてるメールアドレスを
見たことがある方はいますでしょうか?
0404nobodyさん05/02/14 15:11:05ID:???
>>403
ttp://www.kawaijibika.gr.jp/kaomoji1.shtml
■ このスレッドは過去ログ倉庫に格納されています