【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を見よう。
0514460
02/03/13 22:09ID:???Mainとmainが黒と白以上に違うもんなのは十分承知。
ちなみに勘違いしてるようだが,おれは最近そのスレ見つけたんだよ。
書き込みすらしたことない。
0516レンタル掲示板
02/03/13 22:33ID:???どういう仕組みなの?
細かいところはどーでもいいので、大きな部分が知りたい。
0517nobodyさん
02/03/13 22:37ID:???もう出てくんなよ
0520460
02/03/13 22:50ID:???ごめんよ。
0521nobodyさん
02/03/13 23:14ID:???0522nobodyさん
02/03/13 23:19ID:???通常、私は
&hoge;のような形でサブルーチンを使っているのですが、
&hoge("section1","section2");
のような引数をかっこに入れた使い方を見たことがあります。
取り立ててその使い方がわからなくても使えてはいるのですが、
もしよろしければ、これの意味を教えて下さいませ。
0524nobodyさん
02/03/13 23:33ID:???読んでいません。
普通、なにかの処理のなかで
&sub_routin 呼び出せば、そこまでのグローバル変数と$_がそのまま使えますので、
それ以上の使い方をしたことがないのです。
ですから、よく、というか、全く理解していないのが現状です。
人の作ったCGIを、自分の好みのデザインに変えるくらいの作業しかわからないのですが
このあたり、どういう意味なのか理解したいなとは思っています。
お願いします。
0526春chu予防係
02/03/14 00:47ID:???&sub_routine('hoge','pau');
で呼び出すと、
sub sub_routine {
($a,$b) = @_;
...
}
とすることで、$a,$bに引数を受け取れます。
グローバル変数で受け渡しすると、どの変数をどこで書き換えたか
管理するのがめんどうになってくるので、引数で渡したほうが
べんりですよ。あとからそのサブルーチンを使いまわすときも
効果大です。
perlは、他人のソースから学ぶのが非常に困難なトリッキーな
言語だと思いますので、入門書等の平易なソースを見ながら
勉強したほうが楽だと思います。
ちなみに私は、一度書いた自分のソースでさえ、あとから見ると
なにをやってるのか、その記述にどんな必然性があるのか、
わからなくなることがしょっちゅうです。
0527526
02/03/14 00:51ID:???すまぬ。
($a,$b) = @_;
↓
local($a,$b) = @_;
に訂正です。
余計な疑問が沸かないように省略したら、逆にグローバル変数と
変わらなくなってしまった・・・アフォだオレ
0528nobodyさん
02/03/14 00:53ID:???print $answer; # 15
sub plus {
my ($x,$y) = @_; # @_は&plus(ここ)にあったものを渡す 今回は@_ = [5,10]
my $xy = $x + $y;
return $xy; # 返す
}
本読まないで言語習おうなんて甘いと思うけどね
0529nobodyさん
02/03/14 01:17ID:???print $answer;
sub plus {
return $_[0] + $_[1];
}
俺ならこうしちゃうけど、一度変数に格納した方がいいのかね?
0531nobodyさん
02/03/14 01:39ID:???0532nobodyさん
02/03/14 01:57ID:???>>529
あとから見るときの為に分かりやすい名前つけておいた方がいいとか読んだから
俺は変数に入れてるけど、使う人の好みだよね。
0533526
02/03/14 02:07ID:???すまぬ。いつものくせで
local($a,$_) = @_;
とか書くもので。
みんな、関数の中で $_ つかうときどうしてるのー?
0536nobodyさん
02/03/14 02:13ID:???漏れの場合、
&hoge($_);
sub hoge{
$temp = $_[0];
}
とかにしちまう。
0538nobodyさん
02/03/14 02:52ID:???クッキーの解説でも「パスが省略されると、アクセスしたリソース(HTML、CGI)のパスがセットされます。」とか本当にあってる?
とほほではそのスクリプトのフォルダ全部にパスかかるって書いてたと思うんだけど・・・
参考にしても大丈夫かな?
0539nobodyさん
02/03/14 06:55ID:???正規表現で前方一致させるにはどうしたらいいんでしょう?
$i = 0;
undef(%color);
foreach $name ('田中', '鈴木', '佐藤') {
$color{$name} = $i++;
}
田中角栄でも真紀子でも0を、鈴木一郎でも宗男でも1を、という具合に
定義したいんです。よろしくお願いします。
0542nobodyさん
02/03/14 07:59ID:???意図を理解するまでちょっとかかったぞ・・・
(ここに>>539のソース)
$in = <>;
undef $result;
while( ($name,$col) = each %color) {
$result = $col,last if $in =~ /^$name/;
}
て感じでどうかね。
0543nobodyさん
02/03/14 08:56ID:???すみません、私の説明不足でした。
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:???初心者なもんで粗野ですが、こんな感じでやってみました。
%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
0545543
02/03/14 10:16ID:???早速ありがとうございます。申し訳ありませんが、どうやって>>543に
移せばいいのでしょうか?私、perl二日目でしてよくわからないんです。
お手数をおかけして申し訳ありませんが、どうかよろしくお願いします。
0546nobodyさん
02/03/14 10:25ID:???結果を@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:???素直にLWPにしとけ。
どうしてもSocketを使いたいなら、せめてIO::Socketにしとけ。
0550547
02/03/14 12:14ID:???>>548
すんません、LWPってなんですかね?調べてみます。
IO::Socketのりてんってなんですかね?
>>549
もちろんサーバーのポートはデフォルトの80です!
ちなみにどんな内容がかえってくるのですか?
たびたび申し訳ないですがよろしくおねがいします。
0551549
02/03/14 12:42ID:???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:???何となくわかりました・・・
一応本は、オライリーのネズミの絵の奴とラクダの絵の奴を読みました。
一つのことを理解しようとするとき、いろんな要素で、ほかの知識が
必要になったりして、積み残したり理解できなかったりする知識があったりします。
本当にありがとでした
0553547
02/03/14 13:09ID:???ActivePerlってことは環境はWinですよね?
うーん、私が接続できないってことはサーバー設定に問題があるんですかね?
ちなみにサーバーは何を使用されてますか?
Apacheがいいのかな?
0555553
02/03/14 13:37ID:Ibnv+vbs>>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'));
0557555
02/03/14 15:15ID:Ibnv+vbsおおー!できましたー!ありがとうございます!
>>$paddr = pack_sockaddr_in($port, $iaddr);
↓
>>$paddr = pack_sockaddr_in(80, inet_aton('127.0.0.1'));
すなおにgetservbynameを使わずに’80’を指定すればいいのですね?
興味本位ですが、みなさんはSOKETを使ってどのよな処理をされるのですか?
0559nobodyさん
02/03/14 20:30ID:???死んじまえ
きいろいぶためを やっつけろ
金で心を 汚してしまえ
死ね死ね死ね死ね
日本人は じゃまっけだ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいさるめを やっつけろ
夢も希望も うばってしまえ
死ね死ね死ね死ね
地球の外へ 放りだせ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね……
この歌を歌っている人を教えて下さい。
気になってPerlのスクリプトが書けません。
0560nobodyさん
02/03/14 20:35ID:???0561nobodyさん
02/03/14 20:36ID:83vwJ138キャッツアイズとヤングフレッシュだよ。
しっかりコーディングしてね。
0562nobodyさん
02/03/14 20:38ID:???どっかにフラッシュムービーあったね。
0564nobodyさん
02/03/14 20:43ID:???ttp://music.2ch.net/test/read.cgi/asong/1011726043/
とりあえずこっち行け。
0565nobodyさん
02/03/14 21:39ID:???死んじまえ
きいろいぶためを やっつけろ
金で心を 汚してしまえ
死ね死ね死ね死ね
日本人は じゃまっけだ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね 死ね死ね死ね死ね
死んじまえ
きいろいさるめを やっつけろ
夢も希望も うばってしまえ
死ね死ね死ね死ね
地球の外へ 放りだせ
きいろい日本 ぶっつぶせ
死ね死ね死ね 死ね死ね死ね
世界の地図から 消しちまえ 死ね
死ね死ね死ね 死ね死ね死ね
死ね死ね死ね 死ね死ね死ね……
おれも歌って見ました…てへ
0566nobodyさん
02/03/15 01:12ID:???sub func
{
}
などと書いてる奴は氏ね。
プロトタイプ使えプロトタイプ。
0567nobodyさん
02/03/15 01:13ID:BRbcgxefぼくは秀丸で打ち込んだら、いちいちコマンドプロンプトでperl ファイル名
と入力してやっているんですけど。
環境はwin xpです。
0568nobodyさん
02/03/15 01:17ID:???0569nobodyさん
02/03/15 01:28ID:???M-x perldb
0570nobodyさん
02/03/15 01:31ID:???せっかく秀丸つかってるのに・・・
最低でも次のマクロを用意しろ。
[実行]run "perl < con";
[構文チェック]run "perl -c < con";
↑共に1行だ。これでファイルに保存せずに、構文チェック、実行が出来るぞ。
0571nobodyさん
02/03/15 07:25ID:???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:???ちなみに俺のはこれ
// ExecPerl.mac
run "perl -w \"" + filename + "\" >con";
// EOM
0573nobodyさん
02/03/15 11:42ID:pkh37ffW---
@data=<IN>;
foreach(@data){
print $_,"<BR>";
}
---
と
---
while(<IN>){
print $_,"<BR>";
}
---
は、どっちが速いの? また、それぞれの利点・欠点は?
0574nobodyさん
02/03/15 12:18ID:???上:メモリを食う。(やめとけ)
下:行数が多いと時間がかかるかも。(1,000,000行とかならんかぎり大丈夫)
ファイルの表示だけなら下を使いなさい。
0575nobodyさん
02/03/15 12:41ID:???行数が多いと時間がかかるのは上も同じ。
実際に計ってみればわかるが、下の方が高速だしメモリも少なくてすむぞ。
上のほうがいい状況って何だ…?
エディタとか?
0576nobodyさん
02/03/15 12:59ID:???0577nobodyさん
02/03/15 14:03ID:NtzdYptjだね。なんかのルーチンで表示したあと配列保持して、spliceなんかで
編集する必要がある場合くらいしか思いつかない。
それにしても、@配列を逐次表示するのだって、
foreach使うよりwhile使うべきだと思うんだけどな。
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:???ネタだ。勘弁しろ。
■ このスレッドは過去ログ倉庫に格納されています