【Perl】初心者コーナーPart10
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
02/02/24 22:18ID:zOj6Yq/31:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0579read
02/03/15 14:17ID:???read FILEHANDLE,SCALAR,LENGTH
Attempts to read LENGTH bytes of data into variable SCALAR
from the specified FILEHANDLE. Returns the number of bytes
actually read, 0 at end of file, or undef if there was an error.
SCALAR will be grown or shrunk to the length actually read.
If SCALAR needs growing, the new bytes will be zero bytes.
An OFFSET may be specified to place the read data into some
other place in SCALAR than the beginning. The call is actually
implemented in terms of stdio's fread(3) call. To get a true
read(2) system call, see sysread.
0580わざわざ英文かよ
02/03/15 14:19ID:???`read(FILEHANDLE,SCALAR,LENGTH)'
指定した FILEHANDLE から、 LENGTH バイトのデータを読んで SCALAR に格納する。
実際に読み込んだバイト数、またはエラーがあれば undef を返す。
SCALAR は実際に読んだバイト数に合わせてサイズが変わる。
OFFSET を指定すると、読んだデータを文字列の先頭ではなく他の場所に格納する。
これは実際には、 stdio の fread コールを用いてインプリメントしている。
本当の read システムコールを使いたければ、sysread を参照せよ。
0581nobodyさん
02/03/15 14:21ID:???ていうか、こういうドキュメントって、なんの役にもたたんです・・・・
実際の使用例があればすんなり理解できるのに・・・・・
0583アホか
02/03/15 14:24ID:???open(AHO, $file) or die;
read(AHO, $aho, -s $file);
close(AHO);
0584582
02/03/15 14:25ID:???-----------------------
open(A, "a.dat");
read(A, $Dat);
close(A);
print "$Dat\n";
とかでいいのか?
0585nobodyさん
02/03/15 14:29ID:???重要なのは最初の2行なのよ。↓これでほとんど理解できるはず。
read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH
0586nobodyさん
02/03/15 14:30ID:???そんなこたないよ。
はじめたばっかしの人間、言語というもの自体になれていない人間で
それで理解できる人間なんてほとんどいない。
0587nobodyさん
02/03/15 14:31ID:???使い方わかったサンクス。
でもそれを見て思うんだけど、ファイルの内容を一度変数に入れる形になってるみたいだけど、
while(<AHO>)よりもメモリ喰ったりしないの?
0588だから
02/03/15 14:33ID:???仕組みを説明するより、実際に使われているソースをながめたりいじったりした方が、
どれだけ理解を深めるか。
名著と呼ばれるリファレンスブックには、必ず実例が付いている。
>>585だけで理解出来るのであれば、そのような冗長な実例が付く本は
名著どころか、悪書とされているはず。
0589nobodyさん
02/03/15 14:34ID:???readだと,どこからどこまでを読むかが指定できる。
だから $dat = <AHO> で全部読んで $dat から抽出するよりはマシ。
0590nobodyさん
02/03/15 14:35ID:???ありがと〜〜
俺も一つ質問です。
whileで読み込むと、\nごとにわかれた配列に入れることもできるワケなんですけど、
そういう用途だったら素直にwhileつかっとけよ、っていういみなんですよね?
で、一気に読み込んで表示するんだったらreadが便利だわって意味ですね?
0591nobodyさん
02/03/15 14:37ID:???昔、数十MBのファイルを@lines = <FILE>;で読もうと思ったら、
すごく時間がかかった。readで読んだらすぐ読めた。
0592nobodyさん
02/03/15 14:38ID:???なるほど。
それじゃあ何も考えずにファイルの内容全表示するだけなら
while(<AHO>){
print;
}
でいいって事かな?
readは確かに使いどころを見極めれば便利そうだ。
ありがとう。
0593582
02/03/15 14:40ID:???なるほど。readは ファイルデータをスカラに入れるときの性能がいいのか。
>592
うむ。それ推奨。
おれもPOST以外ではread使ったことんなかったんでいい勉強になった。
>579-580には素直に感謝。
0594585
02/03/15 14:46ID:???>習うより慣れろって言葉がある。
>仕組みを説明するより、実際に使われているソースをながめたりいじったりした方が、
>どれだけ理解を深めるか。
そのつもりで、構文が大事だよって言いたかったんだが、余計にわかりにくかったな、俺。
ごめんよ。
0596nobodyさん
02/03/15 14:53ID:???そうだったのか、誤解だったかも知れない。
俺が言いたかったのは、
read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH
これだけ見て、たとえば、ファイルハンドルとは何か?スカラーとは?
オフセットとは実際どんな風に用いられているのか?
とか、そういうのがイメージできるような人は、その言語の上級者だって事なんだよな。
スカラーに$が付くってことすら、このステートメント見てイメージできない人って、
かなりいると思うんだよな。
俺自身、ほかの言語に行くとそういう混乱があったりする。
そういうことが言いたかっただけだったんだよな。
0597ファイル丸ごと読み込み
02/03/15 15:24ID:j7EJ72ekmkmnz での実装例。
http://www.namazu.org/ml/namazu-dev/msg00102.html
# readfile:
#
# Reads a specified file and returns its content.
# Takes one argument which can be a file name or IO::File object.
#
sub readfile ($) {
my ($arg) = @_;
my $fh;
if (ref $arg) {
if ($arg =~ /^IO::File/) {
$fh = $arg;
} else {
warn "$arg: not an IO::File object!\n";
return "";
}
} else {
$fh = fopen_or_die($arg);
}
my $cont = "";
my $size = -s $fh;
if ($size > $MAX_SIZE) {
warn "$arg: too large!\n";
return "";
}
read $fh, $cont, $size;
return $cont;
}
0599nobodyさん
02/03/15 22:55ID:Wm5JdTg+やるなら、
push(@data,$_) while <IN>;
だな
0601nobodyさん
02/03/15 23:06ID:???そ、それじゃKENTの意味無し処理と変わらんぞオイ・・・
0602nobodyさん
02/03/15 23:14ID:Wm5JdTg+@data=<IN>;
作業領域に<IN>が展開され、それを@dataにコピー
push(@data,$_) while <IN>;
$_に一行ずつコピーし、一行ずつ@dataに積んでく
意味が分からん奴は、KENT以下のDQN
0603ネタ
02/03/15 23:16ID:???print <IN>;
ちなみに、でかいファイル食わすとOut of Memoryでした(藁
0605nobodyさん
02/03/15 23:26ID:???まわりくどいことするんだな。(藁
0606nobodyさん
02/03/15 23:28ID:Wm5JdTg+ベンチマークとればわかるよ
0608nobodyさん
02/03/15 23:29ID:Wm5JdTg+0609601
02/03/15 23:29ID:???ん?上だと一瞬メモリ容量が二倍になるのか?
0610nobodyさん
02/03/15 23:31ID:???そうだよ。おまえみたいに上級者でも見下すヤツは正直場違い。
0611nobodyさん
02/03/15 23:34ID:???a[0] = IN[0];
a[1] = IN[1];
・
・
・
してから
result[0] = a[0];
・
・
・
と、
result[0] = IN[0]
・
・
・
の効率を話し合っているんだよ、今。
0612600
02/03/15 23:36ID:???ファイルがでかくなると圧倒的とも言える差だよ。
その点は認識不足だった。コレは認めよう。
だが、普通は
while(<IN>){
# ...
}
または
read IN, $buffer, $size;
を使った方がより良いのでそのテクは何らかの事情がない限り使わないがな。
0613607
02/03/15 23:36ID:???ネタだ。勘弁しろ。
0614nobodyさん
02/03/15 23:49ID:???認めてくれてありがとよ。
別にテクでもなんでもないんだが・・・(while倒置しただけだ)
どちらかというと、@data=<IN>;の方がトリッキーだしな。
0615nobodyさん
02/03/16 00:43ID:???例えば,eval{ flock(xxxx); } だと flockが実行できそうな時だけ実行するの??
エラーが返ったらやっぱりなかったことにするの??
こんなちゃらんぽらんなもんなの?
0616nobodyさん
02/03/16 00:49ID:???「この中のエラーは無かった事にしてくれ」と頼んでおきながら、何か不満ですか?
それとも$@の存在を知らないとか?
オブジェクトも受け取れるのでC++ちっくな例外処理も出来るよ。
eval{
throw MyException('Hoge!');
}
if($@){
die $@->errstr;
}
0617615
02/03/16 00:53ID:???エラーが返ると$@にエラーメッセージを入れて処理を続けるみたいだね。
ちゃらんぽらんだが便利なもんだな(笑
>616
その通り。$@知りませんでした。
あと「eval{};」みたいだね。
0618615
02/03/16 00:55ID:???2つeval{};を並べるときはそのつどundef $@;せなあかんの?
0619nobodyさん
02/03/16 04:32ID:???eval {flock STDIN,2};
print $@ . __LINE__;
eval {print $@ . __LINE__};
print $@ . __LINE__;
0620nobodyさん
02/03/16 06:23ID:???IDとパスワードでログイン
ってのはどうすれば良いですか?
ご説明は邪魔くさいと思うので
参考になるサイトがあればお教え下さい。
0622nobodyさん
02/03/16 06:35ID:???Perlに関係無い,Basic認証のだけど。
http://www.google.co.jp/search?q=Basic%94F%8F%D8+htaccess+%83p%83X%83%8F%81%5B%83h
0625615
02/03/16 08:20ID:???さんくす!参考になります!
>621
"認証サイト"なら .httaccess 使うとヨシ。
0626nobodyさん
02/03/16 10:38ID:???0627nobodyさん
02/03/16 11:26ID:???0629627
02/03/16 13:32ID:???0630nobodyさん
02/03/16 21:34ID:???どんなコマンドをつかったらよいですか?
自鯖を調べるのにつかいます
てか、自鯖立てるんだったらこれぐらいできるようにならんと・・・
0631nobodyさん
02/03/16 21:40ID:???0633nobodyさん
02/03/16 22:17ID:???Perl初心者コーナーで聞くからには、
もちろんPerlを使っての調べ方と仮定しますが。
Net::Pingを使いましょう。
perl-5.7.3では標準添付のようです。
ただし、MSWin32だと、Errnoの関係から使えないようです。
0635nobodyさん
02/03/16 22:31ID:???つまり、こういうことだろ。
$result = `ping hoge.org`;
0639nobodyさん
02/03/16 23:21ID:???取りあえずサーバの定義をはっきりしようや。
1台のマシンを指すのかサーバマシン上で走ってるネットワークデーモンを指すのか。
偉そうなことを言うのはそれからにしてくれ。
0643nobodyさん
02/03/17 00:53ID:???なんでこうなるかねぇ…
0644615
02/03/17 01:39ID:???eval{ flock(); };
die "errer!" if $@;
でも出力はないのですが,ロックしてないクセにそのまま真返してそうで・・・
0645615
02/03/17 01:51ID:???遅くなったけどありがとう。つまり偽だと空が入るんだね。納得。
0648636
02/03/17 03:35ID:???そういうときは、さくっとsynスキャンする。(嘘)
use IO::Socket;
print "ok\n" if (new IO::Socket::INET("www.kantei.go.jp:22"));
とかする。
0651nobodyさん
02/03/17 14:28ID:???0653615
02/03/17 23:21ID:???(((((||| ゚Д゚;;;)))))ガタガタガタガタ
0656648
02/03/17 23:44ID:???あ〜〜〜〜、デッドロックがなにか悪いことだと思ってるのね。
意図しないでデッドロックに陥るのはもちろん問題だけど、
テストとして意図的にデッドロックさせるのは、問題ないよ。
プロセス止めれば、解除されるので安心したまい。
0657nobodyさん
02/03/18 02:42ID:3JM+vmYu調べられますか?
もちろん対象ディレクトリ以下にディレクトリが複数あっても
底の底まで調べる・・・ど?
0658nobodyさん
02/03/18 03:29ID:???できるよ。
ファイルサイズ取得とディレクトリ内ファイル一覧取得を組み合わせるとか,
適当なモジュール使うとか,他のプログラム使うとかで。
0659nobodyさん
02/03/18 03:30ID:???データを全部配列に入れてからforeachで回して、
4桁の数字を見つけたらその部分をsubstrで取り出す・・と考えているのですが
4桁の数字を見つける処理に手間取っています。
正規表現を上手く使って^(\d{4})$とやろうかなと思っているものの、どう使ったものか・・。
スマートな方法は何か無いものでしょうか。
0660nobodyさん
02/03/18 04:00ID:???m//や//は,リストコンテキストで評価すると()内のリストを返すので,
それを利用するとこんな感じ。
while (<DATA>) {
my @tmp = /(\d{4})/g;
push @ary,@tmp;
}
print "@ary";
__DATA__
asdf1234as
d45ad6f54a32451234
af9842s
0661nobodyさん
02/03/18 11:37ID:34CtYnSpPerl4ですけど、
@DATA[ $FORM{'ressno'} ]の値を$oldDATAに代入したいんですが
つぎのコードは文法上間違ってますか?
$oldDATA = @DATA[ $FORM{'ressno'} ];
printしてみると@DATA[ $FORM{'ressno'} ]には文字列が入ってるんですが
$oldDATAは空っぽなんです。
本を見るとよさそうに見えるんですが・・・
ココで作業が止まっちゃってるんです。
おしえていただければありがたいのですが。
0662nobodyさん
02/03/18 11:43ID:???()なんて必要ないケド...
ループ内でのmy宣言はしないほうがよいのでは?
あと、その正規表現では5桁以上にもマッチしてしまうのでは?
my @array= map{ (/(\D|\b)(\d{4})(\D|\b)/g)[$[+1] } <DATA>;
print "@array\n";
__DATA__
asdf1234as
d45ad6f54a32451234
af9842s
0665nobodyさん
02/03/18 12:09ID:???0666615
02/03/18 12:35ID:???変数名が間違ってないかもう一度確かめて。
>662
なるほど。
ループ内でmy()はしないほうがいいのか。
ループの前に宣言するか,ループの後でundefするほうがいいのね。
0667たろう
02/03/18 12:37ID:eHMudoVKクッキーをセットして取得することってできます・・・?
無理かなあ。
それかクッキーがオンかオフが判定できる方法ってありますかねえ。
0668nobodyさん
02/03/18 12:46ID:???代入のタイミングが間違ってないか確認するべきかと。
printで文字列が出るという事は、@DATA[ $FORM{'ressno'} ]には文字列が入っているんだろう。
変数名の間違いという事もないと思われる。
しかし、
$oldDATA = @DATA[ $FORM{'ressno'} ];
この書き方では、@DATA[ $FORM{'ressno'} ]を変数でなく配列として認識してしまう為、その要素でなく要素数が返される。
だから>663の書き方のほうが正しい。
しかし、間違いの書き方でも、要素数の1が$oldDATAに入らないのはおかしい。
だとしたら考えられるのは変数の代入タイミングが間違っているか、変数のスコープの範囲外で判定しようとしてるかどっちかじゃないかと思われる。
0669nobodyさん
02/03/18 13:00ID:???その価値のないソースを見せてみRO!
0670663
02/03/18 13:18ID:???なら、@と$の間違いじゃない(配列に何か入ってる)ということで、
$oldDATA = join(undef,@DATA[ $FORM{'ressno'} ]);
とか。
0671nobodyさん
02/03/18 13:23ID:???663をやってダメなのにオマエはアフォか?
0672661
02/03/18 13:37ID:???ありがとうございます。その通りでした。
変数のスコープの範囲外です。
勉強不足で申し訳有りません。
他の皆さんも、ありがとうございました。
0673nobodyさん
02/03/18 14:36ID:HCOk+r4Yどうぞよろしくお願いします。
use関数についてなのですが、よく
use lib '/mylib';
というのを目にしますが、これの第二引数'/mylib/';の意味がわかりません。
ご教授いただけないでしょうか?
それともう一つ
use I18N::Japanese;
の”::”の意味は一体なんなのでしょうか?さっぱり意味不明です。
それでは失礼します。
0674nobodyさん
02/03/18 14:38ID:HCOk+r4Y補足させていただきます。
"::"がパッケージ変数へのアクセスに使われるというのは知っているのですが
use関数で使われる事の意味がわからないのです。
0675nobodyさん
02/03/18 14:48ID:???モジュールを読み込むディレクトリに'/mylib'を追加しまっせ!
'::'はディレクトリ構造を表します
I18N/Japanese.pm
0677673
02/03/18 15:27ID:HCOk+r4Yお答えありがとうございます!
"::"の意味がよくわかりました。一ヶ月くらい悩んでただけに感動ですw
'/mylib'は、つまりlibモジュールだけの特別な引数であるという
解釈でよろしいのでしょうか?
0679675
02/03/18 16:06ID:???useの後ろに付くlibはプラグマってやつね。
プラグマはperlの動作を変えるわけ。strictとかutf8とかあるから
自分で調べてみなさい。(プラグマは慣用的に小文字を使う。)
use lib LIST;は
BEGIN { unshift(@INC, LIST) }と同じね。
@INCにはモジュールなどを探すディレクトリが入ってるわけです。
■ このスレッドは過去ログ倉庫に格納されています