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

【Perl】初心者コーナーPart10

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。02/02/24 22:18ID:zOj6Yq/3
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

1:自分はこう言う事がしたい。
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を見よう。
0508nobodyさん02/03/13 21:55ID:???
>>507
徹底抗戦の構え・・・か。
050947002/03/13 21:56ID:???
>>471
すいません、難しくて理解できないんです。申し訳
ありませんが、もう少し易しくご教示いただければ
幸いです。よろしくお願いします。

>>472
ありがとうございます。その通りやってみましたが、
ソートされずにそのまま出力されてしまいました。
0510nobodyさん02/03/13 21:56ID:???
揚げ足取りをしていいのならこの文章を張っておこう

> HTML文書の拡張子は通常 .html なのですが、Windows 3.1など古いシステムでは拡張子に3文字までしか使用できなかったため、
> Windows系では未だに .html の代わりに .htm と記述するケースが多いようです。
> HTML文書の擴張子は不定です。仕樣書のどこにも「HTML文書の擴張子は*.htm/*.htmlでなければならない」等とは書かれてゐません。例へば、cgiの吐出すHTML文書に擴張子は附いてゐません。それでもcgiの吐く文書は立派なHTML文書です。
> サーヴァからhttp應答ヘッダにContent-type:text/htmlを附けられて送信された文書は皆HTML文書です。
> 擴張子が*.htmlの文書を「HTML文書」と看做すのは、
> 擴張子で文書の種類を判斷するWindows(や、Windowsの使用に合はせて擴張子でも文書の種類を判斷するMac)だけです。
051146002/03/13 22:02ID:???
>507
ぷっ,その書き込みでおれが一番救われた(笑
0512nobodyさん02/03/13 22:03ID:???
どこぞでMainを指摘した厨房だが
>>504
Mainが誤りだと指摘されたのがそんなに悔しかったのか?
大文字小文字を識別する言語なら当然だろうが。
それとも、まさか指摘するべきじゃなかったと言いたいのか?

0513nobodyさん02/03/13 22:04ID:???
知 識 だ け で 大 人 げ な い 厨 房 の 宴 の 開 催 だ !
051446002/03/13 22:09ID:???
昔からこの板には空気が読めない厨房が存在するって書いただけ。
Mainとmainが黒と白以上に違うもんなのは十分承知。

ちなみに勘違いしてるようだが,おれは最近そのスレ見つけたんだよ。
書き込みすらしたことない。
0515nobodyさん02/03/13 22:14ID:???
>>513
厨房はそもそも大人じゃないやん(ビシッ)
0516レンタル掲示板02/03/13 22:33ID:???
で、結局のところ、
どういう仕組みなの?
細かいところはどーでもいいので、大きな部分が知りたい。
0517nobodyさん02/03/13 22:37ID:???
KENTのMBSProのお試し版の中身でも見りゃいいだろ
もう出てくんなよ
0518レンタル掲示板02/03/13 22:42ID:???
>>517
ありがとう。
最初から素直に教えろよな。ヴォケ。
0519春chu駆除係02/03/13 22:47ID:???
>>518
すまん。
052046002/03/13 22:50ID:???
>518
ごめんよ。
0521nobodyさん02/03/13 23:14ID:???
ヽ(´ー`)ノ
0522nobodyさん02/03/13 23:19ID:???
サブルーチンについて教えて下さい。
通常、私は
&hoge;のような形でサブルーチンを使っているのですが、
&hoge("section1","section2");
のような引数をかっこに入れた使い方を見たことがあります。
取り立ててその使い方がわからなくても使えてはいるのですが、
もしよろしければ、これの意味を教えて下さいませ。
0523nobodyさん02/03/13 23:24ID:???
>>522
引数て・・・ちゃんとお手持ちの参考書は読みましたか?
0524nobodyさん02/03/13 23:33ID:???
>>523
読んでいません。
普通、なにかの処理のなかで
&sub_routin 呼び出せば、そこまでのグローバル変数と$_がそのまま使えますので、
それ以上の使い方をしたことがないのです。
ですから、よく、というか、全く理解していないのが現状です。
人の作ったCGIを、自分の好みのデザインに変えるくらいの作業しかわからないのですが
このあたり、どういう意味なのか理解したいなとは思っています。
お願いします。
0525nobodyさん02/03/13 23:35ID:???
>>524
一度Perlの入門書を購入して読まれた方がいいです。
0526春chu予防係02/03/14 00:47ID:???
>>524
&sub_routine('hoge','pau');
で呼び出すと、
sub sub_routine {
($a,$b) = @_;
...
}
とすることで、$a,$bに引数を受け取れます。
グローバル変数で受け渡しすると、どの変数をどこで書き換えたか
管理するのがめんどうになってくるので、引数で渡したほうが
べんりですよ。あとからそのサブルーチンを使いまわすときも
効果大です。

perlは、他人のソースから学ぶのが非常に困難なトリッキーな
言語だと思いますので、入門書等の平易なソースを見ながら
勉強したほうが楽だと思います。

ちなみに私は、一度書いた自分のソースでさえ、あとから見ると
なにをやってるのか、その記述にどんな必然性があるのか、
わからなくなることがしょっちゅうです。
052752602/03/14 00:51ID:???
>>524
すまぬ。
($a,$b) = @_;
↓
local($a,$b) = @_;
に訂正です。

余計な疑問が沸かないように省略したら、逆にグローバル変数と
変わらなくなってしまった・・・アフォだオレ
0528nobodyさん02/03/14 00:53ID:???
$answer = &plus(5,10); # 5と10をサブルーチンplusに渡して、結果を$answerに返す
print $answer; # 15

sub plus {
my ($x,$y) = @_; # @_は&plus(ここ)にあったものを渡す 今回は@_ = [5,10]
my $xy = $x + $y;
return $xy; # 返す
}

本読まないで言語習おうなんて甘いと思うけどね
0529nobodyさん02/03/14 01:17ID:???
$answer = &plus(5,10);
print $answer;

sub plus {
return $_[0] + $_[1];
}

俺ならこうしちゃうけど、一度変数に格納した方がいいのかね?
0530 02/03/14 01:23ID:???
Perl5の時代に、何故にlocal?
0531nobodyさん02/03/14 01:39ID:???
KENT信者だから。
0532nobodyさん02/03/14 01:57ID:???
@_ = [5,10] ってなんだよ(恥

>>529
あとから見るときの為に分かりやすい名前つけておいた方がいいとか読んだから
俺は変数に入れてるけど、使う人の好みだよね。
053352602/03/14 02:07ID:???
>>530
すまぬ。いつものくせで
local($a,$_) = @_;
とか書くもので。

みんな、関数の中で $_ つかうときどうしてるのー?
0534nobodyさん02/03/14 02:08ID:???
>>533
sub hoge
{
local $_;
...
}

先頭付近でlocal宣言してます。
0535nobodyさん02/03/14 02:09ID:???
>>524
つまり皆はグローバル変数だらけにしないって事だね。
0536nobodyさん02/03/14 02:13ID:???
>533
漏れの場合、

&hoge($_);

sub hoge{
 $temp = $_[0];
}

とかにしちまう。
0537nobodyさん02/03/14 02:17ID:???
>>488
アヤシイ性格判断してる暇があったら、$| を $_ と書いちゃってることを
一言指摘してやりゃーいいのにさ。
0538nobodyさん02/03/14 02:52ID:???
ttp://www.futomi.com/ の解説ってどうなの?
クッキーの解説でも「パスが省略されると、アクセスしたリソース(HTML、CGI)のパスがセットされます。」とか本当にあってる?
とほほではそのスクリプトのフォルダ全部にパスかかるって書いてたと思うんだけど・・・
参考にしても大丈夫かな?
0539nobodyさん02/03/14 06:55ID:???
すいません、すごく初歩的な質問で恐縮なんですが、こういうときに
正規表現で前方一致させるにはどうしたらいいんでしょう?

$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}

田中角栄でも真紀子でも0を、鈴木一郎でも宗男でも1を、という具合に
定義したいんです。よろしくお願いします。
054053302/03/14 07:41ID:???
>>534
なるー。
0541488じゃないけど02/03/14 07:47ID:???
>>537
やべ。実はこっそり>>487はうまいこと言うなぁと思ってていたので、
そこには気づかなかったよ・・・
0542nobodyさん02/03/14 07:59ID:???
>>539
意図を理解するまでちょっとかかったぞ・・・

(ここに>>539のソース)
$in = <>;
undef $result;
while( ($name,$col) = each %color) {
$result = $col,last if $in =~ /^$name/;
}

て感じでどうかね。
0543nobodyさん02/03/14 08:56ID:???
>>542さん
すみません、私の説明不足でした。

1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
   ・
   ・
以下続く

というようなファイルがありまして、必ず田中、'鈴木、佐藤の順に
並べ替えるにはどうしたいいかと試行錯誤しておりまして、以下の
ようになっているんです。

$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}
@LINES = map {$_->[0]}
sort {$color{$a->[3]} <=> $color{$b->[3]}}
map {[$_, split /,/]} @LINES;

>>542でいただいたソースを貼ってみましたがうまくいかないようです。
アドバイスいただければ幸いです。よろしくお願いします。
0544nobodyさん02/03/14 09:55ID:???
>>543
初心者なもんで粗野ですが、こんな感じでやってみました。
%name = ();
@lines = ();
$i = 0;
while ($line = <DATA>) {
push(@lines, $line);
$tmp = (split(/,/, $line))[2];
$name{$tmp} = $i;
++$i;
}

@permutation = qw(田中 鈴木 佐藤);

foreach $fam (@permutation){
foreach $full (keys %name) {
if (index($full, $fam) == 0) {
push(@result, $full);
}
}
}

foreach(0 .. $#result) {
print $lines[$name{$result[$_]}];
}

__END__
1,foo,田中角栄,bar
2,foo,鈴木一郎,bar
3,foo,田中真紀子,bar
4,foo,佐藤三郎,bar
5,foo,佐藤栄作,bar
6,foo,鈴木宗男,bar
054554302/03/14 10:16ID:???
>>544さん
早速ありがとうございます。申し訳ありませんが、どうやって>>543に
移せばいいのでしょうか?私、perl二日目でしてよくわからないんです。
お手数をおかけして申し訳ありませんが、どうかよろしくお願いします。
0546nobodyさん02/03/14 10:25ID:???
「>>543に移す」の意味がわからないのですが・・・
結果を@LINESに入れるなら、
print $lines[$name{$result[$_]}];
を、
push(@LINES, $lines[$name{$result[$_]}]);
で大丈夫だと思いますが。
0547オ02/03/14 10:36ID:???
はじめまして、いまソケットのお勉強をしているのですが
期待した結果が得られません。ご指導のほど宜しくお願い致します。

WEBサーバー:AN HTTP Daemon ver1.38

1、DOSプロンプトから実行。
2、”localhostに接続できません。”
3、(ToT) アウゥー

以下からソースです・・・
use Socket;

$hostname = 'localhost';
$port = getservbyname('http', 'tcp');
$proto = getprotobyname('tcp');

$iaddr = inet_aton($hostname) or die "$hostnameが見つかりません。\n";

$paddr = pack_sockaddr_in($port, $iaddr);

$socket_addr = pack_sockaddr_in($port, $iaddr);

socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "ソケットを生成できません。\n";

connect(SOCKET, $paddr) or die "$hostnameに接続できません。\n";

select(SOCKET); $|=1; select(STDOUT);


print SOCKET "GET /index.html HTTP/1.0\r\n";
print SOCKET "\r\n";

while (<SOCKET>){
m/^\r\n$/ and last;
}

while (<SOCKET>){
print $_;
}
ここまでです・・・
0548nobodyさん02/03/14 11:05ID:???
裸のSocketは素人にはお勧めできない。
素直にLWPにしとけ。
どうしてもSocketを使いたいなら、せめてIO::Socketにしとけ。
0549nobodyさん02/03/14 11:06ID:???
>>547
私はそのままコピペで正常に動作しましたよ。
サーバーのPort番号は80ですよねぇ?力になれなくてゴメソ・・・
055054702/03/14 12:14ID:???
早速の回答ありがとうございます。
>>548
すんません、LWPってなんですかね?調べてみます。
IO::Socketのりてんってなんですかね?
>>549
もちろんサーバーのポートはデフォルトの80です!
ちなみにどんな内容がかえってくるのですか?

たびたび申し訳ないですがよろしくおねがいします。

055154902/03/14 12:42ID:???
>>550
index.htmlが無いので404が帰ってくるだけですが、次のような出力でした。
ちなみにperlはv5.6.1 built for cygwin-multiと
ActivePerl 5.005_03で実行しました。

<HTML><HEAD><TITLE>Error </TITLE></HEAD>
<BODY>
<H1>Error 404</H1>
Not found - file doesn't exist or is read protected
<HR><ADDRESS><a href="http://www.st.rim.or.jp/~nakata/">AnWeb/1.36b</a></ADDRESS>
</BODY></HTML>
0552nobodyさん02/03/14 12:45ID:???
サブルーチンについてお答え下さった皆様ありがとうございました。
何となくわかりました・・・

一応本は、オライリーのネズミの絵の奴とラクダの絵の奴を読みました。
一つのことを理解しようとするとき、いろんな要素で、ほかの知識が
必要になったりして、積み残したり理解できなかったりする知識があったりします。
本当にありがとでした
055354702/03/14 13:09ID:???
>>551
ActivePerlってことは環境はWinですよね?
うーん、私が接続できないってことはサーバー設定に問題があるんですかね?
ちなみにサーバーは何を使用されてますか?
Apacheがいいのかな?
0554nobodyさん02/03/14 13:18ID:???
>>553
551を見ればわかるけどAn HTTPDですよ。
そもそもWEBブラウザではlocalhostに接続できますか?
055555302/03/14 13:37ID:Ibnv+vbs
>>554

>>551を見ればわかるけどAn HTTPDですよ
ほんとだ「AnWeb/1.36b」はずかしー。

>>そもそもWEBブラウザではlocalhostに接続できますか?
できますよー^^
手軽にローカルでテストするから使用するんですよ。

けど同じ環境でできないのならやっぱり設定ですかね?
551さんと同じ設定にして試したいので設定公開していただけないでしょうか?
0556nobodyさん02/03/14 14:07ID:???
設定は普通です。
HTTPサーバ機能 HTTPバージョン1.1 ポート80

ちなみに$paddrを↓こうしてもconnect失敗しますか?
$paddr = pack_sockaddr_in(80, inet_aton('127.0.0.1'));
055755502/03/14 15:15ID:Ibnv+vbs
>>556
おおー!できましたー!ありがとうございます!

>>$paddr = pack_sockaddr_in($port, $iaddr);
               ↓
>>$paddr = pack_sockaddr_in(80, inet_aton('127.0.0.1'));

すなおにgetservbynameを使わずに’80’を指定すればいいのですね?
興味本位ですが、みなさんはSOKETを使ってどのよな処理をされるのですか?
0558nobodyさん02/03/14 18:34ID:???
>>557
通信。
0559nobodyさん02/03/14 20:30ID:???
死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいぶためを やっつけろ
金で心を 汚してしまえ
死ね死ね死ね死ね
日本人は じゃまっけだ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね

死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね

死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいさるめを やっつけろ
夢も希望も うばってしまえ
死ね死ね死ね死ね
地球の外へ 放りだせ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね

死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね……


この歌を歌っている人を教えて下さい。
気になってPerlのスクリプトが書けません。
0560nobodyさん02/03/14 20:35ID:???
春だねぇ
0561nobodyさん02/03/14 20:36ID:83vwJ138
>>559
キャッツアイズとヤングフレッシュだよ。
しっかりコーディングしてね。
0562nobodyさん02/03/14 20:38ID:???
>559
どっかにフラッシュムービーあったね。
0563nobodyさん02/03/14 20:42ID:???
>>562
ほんとですか!
それが気になってPerlが書けません!

>>561
ありがとうございます。これで探せます。
0564nobodyさん02/03/14 20:43ID:???
>563
ttp://music.2ch.net/test/read.cgi/asong/1011726043/
とりあえずこっち行け。
0565nobodyさん02/03/14 21:39ID:???
死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいぶためを やっつけろ
金で心を 汚してしまえ
死ね死ね死ね死ね
日本人は じゃまっけだ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね

死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね

死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいさるめを やっつけろ
夢も希望も うばってしまえ
死ね死ね死ね死ね
地球の外へ 放りだせ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね

死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね……

おれも歌って見ました…てへ
0566nobodyさん02/03/15 01:12ID:???
&func($a1, $a2);

sub func
{
}

などと書いてる奴は氏ね。
プロトタイプ使えプロトタイプ。
0567nobodyさん02/03/15 01:13ID:BRbcgxef
みんなどうやってパールを実行してんのですか。

ぼくは秀丸で打ち込んだら、いちいちコマンドプロンプトでperl ファイル名
と入力してやっているんですけど。
  環境はwin xpです。
0568nobodyさん02/03/15 01:17ID:???
# ./hoge.pl
0569nobodyさん02/03/15 01:28ID:???
開発中は
M-x perldb
0570nobodyさん02/03/15 01:31ID:???
>>567
せっかく秀丸つかってるのに・・・
最低でも次のマクロを用意しろ。
[実行]run "perl < con";
[構文チェック]run "perl -c < con";
↑共に1行だ。これでファイルに保存せずに、構文チェック、実行が出来るぞ。
0571nobodyさん02/03/15 07:25ID:???
>>567
closehidemaru findhidemaru(windir + "\\temp\\perlres.txt");
save;
run "\"c:\\program files\\perl\\bin\\perl.exe\" \"" + filename + "\" > " + windir + "\\temp\\perlres.txt";
openfile "/(0," + str(cyscreen - 300) + "," + str(cxscreen) + ",300) " + windir + "\\temp\\perlres.txt";

俺専用統合開発環境w
実行ファイル変更でjavaにも対応(と、言うか元々java用に開発)。
0572nobodyさん02/03/15 10:46ID:???
単なるPerl実行マクロでもみんな違うのな(w

ちなみに俺のはこれ
// ExecPerl.mac
run "perl -w \"" + filename + "\" >con";
// EOM
0573nobodyさん02/03/15 11:42ID:pkh37ffW
open(IN,"aaa.dat");のあとに中身を表示するにのに、
---
@data=<IN>;
foreach(@data){
print $_,"<BR>";
}
---
と
---
while(<IN>){
print $_,"<BR>";
}
---
は、どっちが速いの? また、それぞれの利点・欠点は?


0574nobodyさん02/03/15 12:18ID:???
上はKENTのドキュソスクリプトかね。


上:メモリを食う。(やめとけ)
下:行数が多いと時間がかかるかも。(1,000,000行とかならんかぎり大丈夫)

ファイルの表示だけなら下を使いなさい。
0575nobodyさん02/03/15 12:41ID:???
>下:行数が多いと時間がかかるかも

行数が多いと時間がかかるのは上も同じ。
実際に計ってみればわかるが、下の方が高速だしメモリも少なくてすむぞ。

上のほうがいい状況って何だ…?
エディタとか?
0576nobodyさん02/03/15 12:59ID:???
全部読むなら普通read使うだろ
0577nobodyさん02/03/15 14:03ID:NtzdYptj
>>575
だね。なんかのルーチンで表示したあと配列保持して、spliceなんかで
編集する必要がある場合くらいしか思いつかない。
それにしても、@配列を逐次表示するのだって、
foreach使うよりwhile使うべきだと思うんだけどな。
0578nobodyさん02/03/15 14:04ID:???
>>576
使い方しらんねんモン
教えて下され
0579read02/03/15 14:17ID:???
read FILEHANDLE,SCALAR,LENGTH,OFFSET
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,OFFSET)'
`read(FILEHANDLE,SCALAR,LENGTH)'
指定した FILEHANDLE から、 LENGTH バイトのデータを読んで SCALAR に格納する。
実際に読み込んだバイト数、またはエラーがあれば undef を返す。
SCALAR は実際に読んだバイト数に合わせてサイズが変わる。
OFFSET を指定すると、読んだデータを文字列の先頭ではなく他の場所に格納する。
これは実際には、 stdio の fread コールを用いてインプリメントしている。
本当の read システムコールを使いたければ、sysread を参照せよ。
0581nobodyさん02/03/15 14:21ID:???
>>579-580

ていうか、こういうドキュメントって、なんの役にもたたんです・・・・
実際の使用例があればすんなり理解できるのに・・・・・
0582nobodyさん02/03/15 14:22ID:???
>581
>>579-580に悪いがちょっとだけ同意。
0583アホか02/03/15 14:24ID:???
$file = "/omaeha/ahoka";
open(AHO, $file) or die;
read(AHO, $aho, -s $file);
close(AHO);
058458202/03/15 14:25ID:???
a.txt: aiueo\n
-----------------------
open(A, "a.dat");
  read(A, $Dat);
close(A);

print "$Dat\n";

とかでいいのか?
0585nobodyさん02/03/15 14:29ID:???
>>581
重要なのは最初の2行なのよ。↓これでほとんど理解できるはず。
read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH
0586nobodyさん02/03/15 14:30ID:???
>>585 
そんなこたないよ。
はじめたばっかしの人間、言語というもの自体になれていない人間で
それで理解できる人間なんてほとんどいない。
0587nobodyさん02/03/15 14:31ID:???
>583
使い方わかったサンクス。
でもそれを見て思うんだけど、ファイルの内容を一度変数に入れる形になってるみたいだけど、
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:???
>>583
ありがと〜〜

俺も一つ質問です。
whileで読み込むと、\nごとにわかれた配列に入れることもできるワケなんですけど、
そういう用途だったら素直にwhileつかっとけよ、っていういみなんですよね?
で、一気に読み込んで表示するんだったらreadが便利だわって意味ですね?
0591nobodyさん02/03/15 14:37ID:???
大きいファイルはreadで読まないとダメだよね。
昔、数十MBのファイルを@lines = <FILE>;で読もうと思ったら、
すごく時間がかかった。readで読んだらすぐ読めた。
0592nobodyさん02/03/15 14:38ID:???
>589
なるほど。
それじゃあ何も考えずにファイルの内容全表示するだけなら
while(<AHO>){
print;
}
でいいって事かな?
readは確かに使いどころを見極めれば便利そうだ。
ありがとう。
059358202/03/15 14:40ID:???
>591
なるほど。readは ファイルデータをスカラに入れるときの性能がいいのか。

>592
うむ。それ推奨。
おれもPOST以外ではread使ったことんなかったんでいい勉強になった。

>579-580には素直に感謝。
059458502/03/15 14:46ID:???
>>588
>習うより慣れろって言葉がある。
>仕組みを説明するより、実際に使われているソースをながめたりいじったりした方が、
>どれだけ理解を深めるか。
そのつもりで、構文が大事だよって言いたかったんだが、余計にわかりにくかったな、俺。
ごめんよ。
0595nobodyさん02/03/15 14:48ID:???
>>594
勉強になったよ。ありがと〜〜
ほかのみなさんもありがと〜〜
0596nobodyさん02/03/15 14:53ID:???
>>594
そうだったのか、誤解だったかも知れない。
俺が言いたかったのは、

read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH

これだけ見て、たとえば、ファイルハンドルとは何か?スカラーとは?
オフセットとは実際どんな風に用いられているのか?
とか、そういうのがイメージできるような人は、その言語の上級者だって事なんだよな。
スカラーに$が付くってことすら、このステートメント見てイメージできない人って、
かなりいると思うんだよな。
俺自身、ほかの言語に行くとそういう混乱があったりする。
そういうことが言いたかっただけだったんだよな。
0597ファイル丸ごと読み込み02/03/15 15:24ID:j7EJ72ek
全文検索エンジン Namazu のインデックス作成プログラム
mkmnz での実装例。
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;
}
0598nobodyさん02/03/15 17:15ID:???
>>597
つまりそういう場合はちゃんとサイズチェックをするべきだ、と。
0599nobodyさん02/03/15 22:55ID:Wm5JdTg+
@data=<IN>;
やるなら、
push(@data,$_) while <IN>;
だな
0600nobodyさん02/03/15 23:01ID:???
>>599
ここは「初心者コーナー」なんだからネタはネタと書こうぜ。メールアドレス欄でいいからさ。
0601nobodyさん02/03/15 23:06ID:???
>599
そ、それじゃKENTの意味無し処理と変わらんぞオイ・・・
0602nobodyさん02/03/15 23:14ID:Wm5JdTg+
>>601
@data=<IN>;
作業領域に<IN>が展開され、それを@dataにコピー

push(@data,$_) while <IN>;
$_に一行ずつコピーし、一行ずつ@dataに積んでく

意味が分からん奴は、KENT以下のDQN
0603ネタ02/03/15 23:16ID:???
undef $/;
print <IN>;

ちなみに、でかいファイル食わすとOut of Memoryでした(藁
0604nobodyさん02/03/15 23:16ID:???
>>602
で、メリットはメモリ節約?
0605nobodyさん02/03/15 23:26ID:???
>602
まわりくどいことするんだな。(藁
0606nobodyさん02/03/15 23:28ID:Wm5JdTg+
>>604
ベンチマークとればわかるよ
0607nobodyさん02/03/15 23:28ID:???
>>602
$a = 1000000;
と
for(1..1000000){ $a++; }

どっちのほうが君の好み?
■ このスレッドは過去ログ倉庫に格納されています