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

【Perl】初心者コーナー Part16

■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo 02/09/15 15:11ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0249nobodyさん02/09/22 23:29ID:Ao5uw2aw
aというサブルーチンを100回動かすとして同時に3個動かすにはどうしたらいいんでしょうか?
1個終われば次の1個がはじまって。。。

と、言う内容で。
0250nobodyさん02/09/22 23:42ID:aEiiJGxo
>>247
正規表現スレ見たけど、何がなんだか全然分からん。
教えて。
0251nobodyさん02/09/22 23:55ID:???
>>249
マシン上に、少なくとも3つはCPUが必要でしょう
0252nobodyさん02/09/23 00:00ID:Igutub/E
>>251
forkとやらの関数でaが一度に多数流れるのは見たんですが多すぎて逆に遅くなってしまいます。
んで、3個ぐらいに制限したいなと・・・
0253nobodyさん02/09/23 00:09ID:???
>>252
どういうルーチン組んだ?
0254nobodyさん02/09/23 01:07ID:???
>>248
とりあえず、すべての文字に\つけとけば安心だ。
0255nobodyさん02/09/23 01:25ID:???
>>248
print "<a href="a.html">表示<a>";  #エラー
print \"<a href=\"a.html\">表示<a>\";  #エラー
print "<a href=\"a.html\">表示<a>"  #エラー
print "<a href=\"a.html\">表示<a>";  #エラーじゃないけどSJISだと文字化け
print "<a href=\"a.html\">表\示<a>";  #OK

print "<a href=\"mailto:[email protected]\">メアド<a>";  #エラー
print "<a href=\"mailto:meidohuku\@moemoe.ne.jp\">メアド<a>";  #OK
0256nobodyさん02/09/23 01:33ID:???
>>255
タグぐらいまともに書けよ
0257nobodyさん02/09/23 01:47ID:???
>>256
脳内補完よろ
0258nobodyさん02/09/23 03:47ID:???
>>245
ちょっと難しい内容だが、これを読んでくれ。
ttp://homepage1.nifty.com/nomenclator/perl/shiftjis.htm

要は苦労したくなければ、現状では文字コードは EUC-JP で

print <<HTML;
<a href="a.html">表示</a>
HTML

等としろってこったな。
0259 ◆AOHU.zVE 02/09/23 04:07ID:???
>>232
厨でもなんでもいいけど、、、
面白い(興味を持てる)事したいだけなんだけどね。
(すれ違いってより、聞くとこ間違ったカナ)
0260nobodyさん02/09/23 04:11ID:???
面白いことでも何でも、すればぁ?
0261nobodyさん02/09/23 04:59ID:v/9sXn0J
よく local よりも my を使えとか言われるけど、
たとえば関数なんかで

func{
 local ($a,@b) = @_;

}

ってやる場合、my にできないよね?
こういう場合って、local でやるしかないかな〜、、
配列とか引き渡す場合、どうやってる?
0262nobodyさん02/09/23 05:06ID:v/9sXn0J
ごめん、素で間違えた。

func{
 local ($a,*b) = @_;
 print "変数の中身は→$a\n";
 print "配列の最初の要素は→$b[0]\n";
}

たとえば、こう言う風に使うとき

@a = (1,2,3,4,5);
&func('オマエモナー',*a);
0263nobodyさん02/09/23 05:10ID:v/9sXn0J
連カキスマソ
>>262 の例で、

my $a = 'あほか?';
my @b = (1,2,3,4,5);
&func($a,*b);

で実行するとエラー出るよね??

my $a = 'あほか?';
local @b = (1,2,3,4,5);
&func($a,*b);

だったら、OKでした。なんか my と local が同じソース内に、ごっちゃになってるのが
気に入らないので、結局

local $a = 'あほか?';
local @b = (1,2,3,4,5);
&func($a,*b);

と、local で統一することに、、、でも、周りからは my 使えと、、、
0264nobodyさん02/09/23 05:23ID:???
>>262, >>263
Cerlって言語ですか?
0265nobodyさん02/09/23 05:53ID:???
>>261-263
my $a = 'あほか?';
my @b = (1,2,3,4,5);
&func($a,\@b);
func{
  my($a,$b) = @_;
  print "変数の中身は→$a\n";
  print "配列の最初の要素は→$$b[0]\n";
}
0266 ◆AOHU.zVE 02/09/23 05:58ID:???
my $a = 'あほか?';
my @b = (1,2,3,4,5);
&func($a,\@b);
sub func{
 my($a,$b) = @_;
 print "変数の中身は→$a\n";
 print "配列の最初の要素は→$b->[0]\n";
}
0267nobodyさん02/09/23 06:08ID:???
>>261-263
答えは既に出ているから、
あなたが勉強するべきキーワードを挙げておくね。

・型グロブ
・my と local の違い
・リファレンス
0268nobodyさん02/09/23 09:10ID:lfiSBGtK
質問がありますのでどなたか教えて戴けると嬉しいです。
掲示板のような形のcgiで、フォーム入力で受け取った半角数字(1とか5とか)を数値として扱って、それを計算に使いたいのですが、そのままだとログ部分が空白になってしまったんです。
たとえば、
名前<INPUT TYPE="text" NAME="name" SIZE=25>
年齢<INPUT TYPE="text" NAME="tosi" SIZE=25>
こういうフォームに入力してもらい、名前・nobody 年齢・18才と入れると「nobodyさんの50年後は68才です!」と表示したいんです。
それで、「$abc = $tosi + 50;」としてみたのですが、その部分のログが空白になってしまうだけでした。
どうすれば、フォームから受け取った数字で計算出来るのでしょうか?
計算が間違っていないかは、
#!/usr/bin/perl
print "Content-type: text/html\n\n";
$tosi = 18;
$abc = $tosi + 50;
print "$nameさんの50年後は$abc才です!\n";
exit;
というだけので試して、間違っていないと確認しました。
名前は通常通り記入出来るのですが、年だけ空白の状態です。
どうすれば良いのか教えて下さい。
0269nobodyさん02/09/23 09:24ID:???
>268
きっちり出るが。
0270nobodyさん02/09/23 09:38ID:???
>>269
え。出ます?あれ、どうしてだろ。
$abc = $tosi + 50;
をいれるところはどこでも良いんでしょうか?
0271nobodyさん02/09/23 09:45ID:???
>270
常識的な範囲なら。

#!/usr/bin/perl より前に書いたりとかexit;より後ろに書いたらもちろん無理だが。
0272nobodyさん02/09/23 09:51ID:???
>>270
require "cgi-lib.pl";
# require "jcode.pl";
&ReadParse;
$tosi = $in{"tosi"};
してんでしょね。
0273nobodyさん02/09/23 09:58ID:???
>>272
仮に$tosiが空だとしても+の数値が入るはずだが…
0274nobodyさん02/09/23 10:07ID:???
プログラムの流れを読み間違えて$abc = $tosi + 50;をやる前に
$abcを使ってるとか。
$abcを出す直前に計算させてもダメ?
0275nobodyさん02/09/23 10:08ID:???
>>271

ん、それは大丈夫でした。けど、でもやっぱりだめなんです。
どうしてなんでしょう…。ログファイルに書き込めてないのでしょうか。
えと、もうちょっと考えてみます。簡単な筈なんですよね?
0276nobodyさん02/09/23 10:37ID:???
>>272
あっ、すいません。今気がつきました。
自分で1から組んでるやつじゃなくてですね、インサイドウェブさんのX-BBS Lineをちょっとだけ弄ったんです。
ですから、plとか全然使ってないみたいなんです。もしかしてそこがダメだったんですか?
>>273
それが入らないんです。もしかしたら>>272さんの仰る
$tosi = $in{"tosi"};をしてないからなんでしょうか?
>>274
はい、$abcは計算と、最後の表示にしか使っていないのです。
それで計算もちゃんと表示する前にしているのですが…。
0277nobodyさん02/09/23 11:17ID:???
改造でやってるなら改造スレへ・・・と言いたいが、変数のスコープが届いてないという可能性を一応言ってみる。
0278nobodyさん02/09/23 11:26ID:???
>>277
改造…依頼じゃないような気がしたので。申し訳ございません。
アドバイス有り難うございました。
取り敢えず楽しようとしないで自分で1からやってみます。
0279nobodyさん02/09/23 11:27ID:???
>>276
0 + 50 はいくつ?
$abcを計算の後に使ってるなら空って事はないだろ。
その動作じゃ通らないブロックの中で計算してるとかじゃないか?

あと、フォームから送られたデータは勝手には変数に入らないよ。
入れる処理を自分で追加しないと。
0280nobodyさん02/09/23 11:43ID:???
どなたか教えて下さい。
掲示板で投稿された "http://〜"で始まるURLに自動リンクを貼りたいのですが、
その際に、リンクして行った人を数えるため、link.cgiにurlを渡してリンクさせ
ようと思ったのですが、

$message =~ s/([^=^\"]|^)(http\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+]+)/$1<a href=\"$2\">$2</a>/g;
$url = $2;
$url_ec = $2;
$url_ec =~ s/(\W)/'%'.unpack("H2", $1)/ego;
$url_ec =~ tr/ /+/;
$message =~ s/<a\ href=\"\Q$url\E\"/<a href=\"link.cgi?url=$url_ec\"/g;

このように書くと、最後だけがlink.cgi呼び出しになって、
それ以前のものは、通常にリンクされてしまいます。
link.cgiにエンコードしたurlを完全に渡す方法を教えて下さい。
0281nobodyさん02/09/23 11:54ID:???
>>280
$message =~ s/([^=^\"]|^)(http\:\/\/[\w\.\~\-\/\?\&\=\;\#\:\%\+]+)/$1<a href=\"$2\">$2</a>/g;
がめちゃくちゃだよ。
正規表現道場で鍛えた方がいい。
0282nobodyさん02/09/23 12:07ID:???
>>279
$tosi = $in{"tosi"};
が、データを変数に入れるって事ですよね?
ですがこれはjcode.plを使った時だけとかじゃ…ないのでしょうか。
このもともとのcgiにも使われていないんです。
0283nobodyさん02/09/23 12:13ID:???
$message =~ s!(http://[-\w\.~\/\?&=;#:\%\+]+)!<A href="link.cgi?url=$1">$1</A>!g;
0284nobodyさん02/09/23 12:15ID:???
>282
じゃあそのスクリプトはどうやって入力データを変数に格納してるんだ?
0285nobodyさん02/09/23 12:24ID:???
>>282
jcode.plはコメントにしてるだろうが。
変数を取り込んでるのは、cgi.plだあよ。
最近のは、use CGI;とかじゃねの。
028628002/09/23 12:32ID:???
>>281
正規表現道場で少し勉強して来ました。URLの正規表現は変えようと思います。
>>283
ありがとうございます。
でも、それだとURLエンコードが出来ないので困っています。
link.cgiに渡すURLは、エンコード済みのものにしたいのですが。
0287nobodyさん02/09/23 12:47ID:???
>>286
正規表現道場2chで待ってたけどこなかったじゃん。
urlに日本語なんか入ってねだろ。
028828002/09/23 12:55ID:???
>>287
http://www.google.co.jp/search?q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE&ie=UTF-8&oe=UTF-8&hl=ja&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
こういうURLを貼られると、&があるので、URLが途中までしかlink.cgiに渡せないんです。
0289nobodyさん02/09/23 13:10ID:???
>>288
エンコード云々の問題じゃないでしょ。
&もメタ文字だからエスケープすれ。
>>283さんのじゃだめなんか?
その後、&link.cgi(metaquote($message))じゃだめなんか?
0290AOHU.zVE02/09/23 13:30ID:???
$tai=なんかしたい文字列
m/\Q$tai\E/
0291nobodyさん02/09/23 13:34ID:pjFAvyv+
httpドキュメントを取得するための関数をつくりました。
1度目の呼び出しはうまくいくのですが、2度目以降は
「現在処理中の操作です」というメッセージが出て
ソケットの育成ができません。なぜなんでしょうか?

関数の一部を抜粋
$socket = IO::Socket::INET->new( PeerAddr => $host,
PeerPort => $port,
Timeout => '30' );

# 以下が実行されてしまい「現在実行中の操作です」と表示される。
unless ($socket) {
print "socket: $!";
}
0292AOHU.zVE02/09/23 13:37ID:???
>>291
close($socket);
でしょうか
029329102/09/23 14:42ID:pjFAvyv+
>>292
関数の最後にclose($socket);と書いてみると
今度は、以下のようなエラーメッセージが出ました。
やはり2度目のソケット育成に失敗しているみたいです。

Can't use an undefined value as a symbol reference at ./test.pl line 185, <FILE> line 35.
socket: 現在処理中の操作です

コード抜粋
181:unless ($socket) {
182: print "socket: $!";
183:}
184:
185:print $socket "GET $url HTTP/1.1\n";
186:print $socket "Host: $host\n";
187:print $socket "Connection: close\n\n";
029428202/09/23 15:06ID:???
>>284
>>285
解らないです。
cgi-lib.plもjcode.plもcgi.pmも使っていないように見えるのです。
http://www.galstown.m-n-j.com/8/internet/lia/board.txt
↑これにcgi-lib.plかcgi.pmを組み込もうとしたんですけれど、悉く失敗してしまって。
0295nobodyさん02/09/23 15:41ID:???
書き込めない…?
0296nobodyさん02/09/23 15:41ID:???
>>295
スマソ書き込めた。

>>294
> $nini = $comment + 50;#ここに、年齢の式を書いてみました。
の位置が違う。
0297nobodyさん02/09/23 16:12ID:???
>>294
そのスクリプト、セキュリティ上問題があるから、
おすすめしない。
0298nobodyさん02/09/23 17:04ID:???
>>297
私は、>>294さんではないんですが、
cgi.libもCGI.pmも何も使わずにユーザーの入力を直接受け取る
っていうのは、初めて見たのですが、結構多いんでしょうか。
0299nobodyさん02/09/23 17:06ID:???
foreach $data(@data){
処理
}

という文で、例えば@data[0]を処理している場合にのみ別の処理に分岐させるには
どうしたらいいでしょうか?
つまり、@dataのなかの今何行目をあつかっているのかを得たいのですが・・。
if(@data[0]){&print;}
とやってもうまくいきませんでした。
030029702/09/23 17:07ID:???
>>298
多いです。けどマネするのはやめましょう。
http://www.perldoc.com/perl5.6/pod/perlfaq9.html#How-do-I-decode-a-CGI-form-
030129902/09/23 17:10ID:???
処理の中に$a++;とかやって数えていくしかないのでしょうか?
なんかスマートな方法がありそうなんですが・・
030229702/09/23 17:12ID:???
>>300 に追加。ちょっと古いけど、日本語。
http://www.kt.rim.or.jp/%7ekbk/perl5.doc/perlfaq9.html#How_do_I_decode_a_CGI_form_
0303AOHU.zVE02/09/23 17:26ID:???
>>301
$x_x=@data;
for($i=0;$i<=$x_x;$i++){
if($i eq 0){
&別の処理{};
print $date[$i];
}else{
print $date[$i];
}
↑適当
030429402/09/23 17:34ID:???
>>296
>>297
ありがとうございました。そうですか、問題があるのなら使用を諦めようと思います。
やはり自分で最初からもう一度頑張ってみますね。
取り敢えず入門書でも買って来よう…
0305nobodyさん02/09/23 17:35ID:???
>>297
どんな問題?
0306nobodyさん02/09/23 17:37ID:???
>>300, >>302
Oh, thanks.
日本語訳まずいね。最初のとこだけでも、原文では、
「POSTのCONTENT_LENGTHと同じバイト数をSTDINから盲目的に
読むプログラムやGETのデコードでQUERY_STRINGをひっつかむプログラム
」って書いてあるのに、和訳では、
「$ENV{CONTENT_LENGTH} や$ENV{QUERY_STRING}を含んだプログラム」
ってなってるよ。他にもいっぱい誤訳あるけど・・・


0307nobodyさん02/09/23 17:39ID:???
>>306
バージョンが違うんだYO!
たぶん。
030830602/09/23 17:42ID:???
>>305
だから>>300読むといいよ。そこには、うまく動かないこともあるって
書いてあるけど、あのスクリプトは、その上、受け取った変数、
例えば、$commentをそのまま検証しないでif文に入れてるから、
exec文でも書いてあったらやばいんじゃないかってことだと。
030930602/09/23 17:44ID:???
>>307
そか、そいうことにしておきませう。
031029702/09/23 17:45ID:???
>>306
ゴメン。新しいのがあった。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq9.html#How_do_I_decode_a_CGI_form_

>>305
スクリプトを読んで分らないなら、とにかく
使わないでください。
031130602/09/23 17:54ID:???
>>310
あらよ、thanks again!
訳者にはスマソ。
0312nobodyさん02/09/23 18:00ID:???
リファレンスのことで少々不安な点があります。
ハッシュデータをサブルーチンへ渡そうと思うのですが、

%DAT = ( "2by4" => "8", "4by8" => "32");
&D_write(\%DAT);

sub D_write {
my($data) = $_[0];
print"これがデータ : $$data{'2by4'}";
return 1;
}

まず"\%DAT"でリファレンスを渡しますが、その受け取りが普通の変数なのは"メモリの番地自体"を収めているから
という認識で良いのでしょうか?
また、さらにその値自体を参照したいときは1次参照なので$を1つだけ加えて"$$"になるという考え方でよいのでしょうか?
0313nobodyさん02/09/23 19:07ID:???
>>312
$aは${a}って書けるのはわかるよね?
なら $$data{'2by4'} は ${$data}{'2by4'} ってなるのもわかるよね?
なら %$data (%{$data}) ってなるのもわかるよね?
そゆこと。
031429902/09/23 20:28ID:???
&make;

sub make{
foreach $data(@file){
$_=split(/,/,$data);
&print;
$a++;
if($a eq 10){last;}
}
}

sub print{
$list=<<"_HTML_";
$list
$_[1]$_[2]$_[3]
_HTML_
}

299です。>>303さんレスありがとうございます。
勉強中の身でもうひとつ…

上記の例で、CSVデータから頭10件を取り出して表示したいのですが、
foreachで強制的に10件カウントしたら終わらせているのですが
こうじゃなくて普通にforあるいはwhileで書いたらどうなりますか?
@fileから取り出す記述が分からないです。
また速度は変わりますか?
どうも適当にかじってるので基本的なものが出来てないです。
031530602/09/23 20:35ID:???
>>314
@fileから最初の10要素を取り出す:
for $i (0 .. 9) {
print $file[$i], "\n";
}
0316nobodyさん02/09/23 20:49ID:iHNT8XWd
質問です。
フォームに入力した文字が半角じゃないといけない所が全角だったり、
入力する数がおかしかったりする時に
間違ってますよと表示するにはどうすればいいですか?
0317さやか02/09/23 21:07ID:UR9fVmIX
http://dream.lib.net/room/cgi/e_ps.html
これのps_user.cgiだと思うんですが588行あたりが
たぶんネックです。
さやかは、後から登録した奴は下に表示したいんです
検索エンジンって、フリーでもらえる奴はみんな
後から登録されたサイトが上に出るじゃないですか
それを逆にしたいんです。
難しいです。こんな質問してるさやかは嫌いですか?
私体も弱いんです。男の人も怖いし。優しい人いないかな?
ちなみに男って言われました。文章が男っぽいのかな?
私の周りにはくわしい人いません。男の人ならくわしい人いそうですが
男の人さやか苦手です。女子高生です!←男の人ってこうかくと
優しくなるらしいですね。うそじゃないですよ。
0318nobodyさん02/09/23 21:24ID:???
>>316
それだけの説明では、こう答えるしかない。

$入力された文字列 =~ /半角を表す正規表現/ or &間違ってますよと表示
$入力された数字 =~ /数字以外を表す正規表現/ or &間違ってますよと表示

それぞれの正規表現は頑張って調べてね。
0319nobodyさん02/09/23 21:28ID:???
>>317
質問者が誰かなんてどうでもいいんだよ。
なんで人を小馬鹿にしたような質問の仕方するかなぁ。
優しい人?そんな聞き方されて喜んで答える奴はタダのスケベだろ。
つーかそんな聞き方されたら答える気無くなるつーの。

答えが欲しけりゃ

  普   通   に   聞   け   。
0320nobodyさん02/09/23 21:34ID:???
>>317
セクースさせてくれるなら今から行って手とり足とり答えてあげますが何か
0321さやか02/09/23 21:42ID:UR9fVmIX
質問の仕方は悪かったです。
でも、さやかにはくわしい人いないの・・・。
迷惑だったですよね・・・。
すいません。一から勉強します。>>320ショックです。
そんな酷い事いわれると。
0322nobodyさん02/09/23 21:46ID:???
>>316
SJISならこんな感じかな

if(length($in{kana}) > $kana_max ||
length($in{eigo}) > $eigo_max ||
length($in{suuji}) > $suuji_max){error('文字多いよ');}
if($in{kana} =~ /[^\x20\xa7-\xdd]/i){error('半角カナで入れてね');}
if($in{eigo} =~ /[^\x20a-z]/i){error('半角英字で入れてね');}
if($in{suuji} =~ /[^\x20\d]/){error('半角数字で入れてね');}

>>321
ここは匿名掲示板だからね
相手の概要はわからないほうが色々と都合が良いのよ
むしろ余計な情報は邪魔
0323nobodyさん02/09/23 21:47ID:???
>>317
> ps_user.cgiだと思うんですが588行あたりがたぶんネックです。

そう考えた理由を説明できる?
0324nobodyさん02/09/23 21:53ID:???
>>317
動作を勉強したいんじゃなくて既製のスクリプトを改造したいのなら
こっちじゃない?
【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/l50
0325さやか02/09/23 21:56ID:UR9fVmIX
>>323 登録するときにlinkdata.dat に書き込みますよね
   seek(ファイルハンドル,0,0)
   これを0→2にしてもだめだったです。
   たぶんこれが悪の正体です↓
   while(<IO>){
if (index($_,">$siteyrl<")!=-1){
@y2=split(//<>/,$_);
close(IO);
とにかくこの辺がキーだと思います。苦しい。

0326さやか02/09/23 22:06ID:UR9fVmIX
>>324さん、そちらに行ってみます。
なんかロールプレイングみたい!
0327nobodyさん02/09/23 22:13ID:???
>>322
> if($in{suuji} =~ /[^\x20\d]/){error('半角数字で入れてね');}
理解して参考にする人はいいが、丸写しする人は困るよな。

$n = '2' . "\x20" . '3';
print $n . "\n";
print $n + 0;

相手が出していない条件を黙って付け加えるのは危険だよ。
0328nobodyさん02/09/23 23:34ID:???
>>318
きみは or の使い方をもっと勉強したほうがいいよ
032931802/09/23 23:58ID:???
ごめん、素で間違えた。

半角→半角以外
or→andだね。
0330nobodyさん02/09/24 01:45ID:???
人の書いたソースを見て思ったのですが
ファイルを読み込み・書き込みする場合、
+<、+>の入出力両用をあまり使用しないのは何故でしょうか?
0331nobodyさん02/09/24 02:19ID:???
もうひとつ
ファイルサイズを求める場合

$size1=(stat( $filename))[7];#statを用いて
$size2=(-s $filename)#ファイルテスト演算子

それぞれの違い・利点は何でしょう?
0332nobodyさん02/09/24 03:24ID:???
>>330
意外と(存在|使い方)を知らない人が多いから。

…じゃ、答にならない?
使える場面では気にせず使えばいいよ。

>>331
# stat の返す 13 要素から成るリストを作り、その 8 番目の要素を得る
$size1 = ( stat $filename )[7];

# ファイルサイズのみスカラー値として得る
$size2 = -s $filename;

perl のソース確認したワケじゃないけど、内部的には大差ない気が。
でもたった一つの要素の為にリスト吐かせるのはバカらしいと思う。
「8 番目」よりは「-s」の方が、パっと見で分かりやすいし。
0333nobodyさん02/09/24 04:11ID:???
>>330
作業を終えるまでオンメモリで行ける小規模なものなら+<は使うが
巨大なログをテンポラリに小出ししながら記録していく場合は
ログへの直書きは必要無いので普通に読みテンポラリに普通に書く。

331は速度的にはどっちも似たようなもんだね。
statは他の情報も取れるし一度使えば後で何度でも結果が
使いまわせるのでタイプが面倒じゃないならstatのが
良いかも。
033429402/09/24 08:49ID:???
質問です。 jcode.plとcgi-lib.plを使って自分で最初からしたら割と出来たような気がするのですが、また何か失敗してしまったようなのです。
$name = $in{'name'};
$a1 = $in{'a1'};
$a2 = $in{'a2'};
$a3 = $in{'a3'};
〜〜〜以下続く
$a15 = $in{'a15'};

$b1 = $a1 * 3;
$b2 = $a2 * 6;
$b3 = $a3 * 5;
$b4 = $a4 * 3;
$b5 = $a5 * 3;
$c = $b1 + $b2 + $b3 + $b4 + $b5;

$b6 = $a6 * 3;
〜〜(略)
$b10 = $a10 * 3;
$d = $b6 + $b7 + $b8 + $b9 + $b10;
(もう一度繰り返して15まで終わらせて、最後の式を$eにします)
$f = $c + $d + $e
として、
print "$name … $c : $d : $e : 「$f」\n";

と示すと、「1、2、3、4、5、1、2、………5」と入力したとすると
名前 … 57 :=@:=@: 「156」 と示されてしまうのです。
ログを見てみると、<>57<>45<>54<>156<>となっていて、同じ数字を入力して同じ計算をしても違う数字になっていて…。一番最初のはあっているのですが。計算の仕方を間違えてしまっているのでしょうか?
0335nobodyさん02/09/24 11:28ID:???
>>334
表示が乱れるのは、変数の直前に全角スペースがあるから。
033633402/09/24 12:18ID:???
>>335
ありがとうございます!急いで修正します。
…では、計算がおかしいのはどうしてでしょうか。
<>57<>57<>57<>171<>にならないとおかしい筈なのですが…。
0337nobodyさん02/09/24 13:59ID:aoR+W3Ks
テキストファイルにCSV形式で
**,***,***,***,**,***
**,***,***,***,**,***
**,***,***,***,**,***
とデータ(データは動的)が入っています。
これを配列data[][]
にいれるのどうしたらいいのでしょうか?
すいません教えてください。
だれかやさしい人お願いします

0338nobodyさん02/09/24 14:29ID:???
open(FILE,$file);
while(<>){
@date=split(/,/,$_);
}
0339訂正02/09/24 14:30ID:???
open(FILE,$file);
while(<FILE>){
@date=split(/,/,$_);
}
0340nobodyさん02/09/24 14:32ID:???
>>337
答えないのはやさしくない人ですか?
最悪な聞き方…
0341nobodyさん02/09/24 14:36ID:???
漏れはやさしくないから答だけ書く (w

my @data;
open F, $csv;
while (<F>)
{
 chomp;
 $data[$. - 1] = [ split /,/ ];
}
0342 ◆AOHU.zVE 02/09/24 14:40ID:???
「だれかやさしい人お願いします」は余計では^^;
(ここ数日変な質問のしかたする人が目立つ気がする)

open(CSV,$filename);
my@data=map{chomp;[split/,/]}<CSV>;
close(CSV);
0343nobodyさん02/09/24 14:59ID:4thlbHdp
つい最近、「すぐわかるPerl」でPerlを勉強し始めたものですが、

# findpattern
while (<STDIN>) {
if (/Jackson$/) {
print;
}
}

findpattern < people.txt
と、本のとおりにやって、Jacksonで終わるデータだけを出力したいのに、
何も出力せずに終わってしまいます。

いろいろ試してみましたが、文字列の末尾にマッチさせる$のときだけ
うまくいかないようです。
原因がわかりません。
どこがおかしいんでしょうか?
0344nobodyさん02/09/24 15:03ID:???
>>343
文字列の末尾にある改行を取り除いてない。
0345nobodyさん02/09/24 15:05ID:???
レンタルサーバに設置した掲示板やチャットの実行速度を測る方法って
どうすればいいんでしょうか。
ベンチマーク?で検索してもいまいちわからないもので..おながいします。
0346nobodyさん02/09/24 15:09ID:???
>>345
下の2行をスクリプトの2行目辺りに置いて
use Benchmark;
$start = new Benchmark;

下の3行をexitする直前にでも置いとけば?
$last = new Benchmark;
$bench = timediff($last,$start);
print timestr($bench);
0347nobodyさん02/09/24 15:11ID:4thlbHdp
>>344
while (<STDIN>) {
    chomp;
    if (/Jackson$/) {
        print;
    }
}

でしょうか?
ダメでした。
0348 ◆AOHU.zVE 02/09/24 15:15ID:???
>>334
入力のパーサーがおかしいのか、処理がおかしいのか、
データを埋め込みにしてみるなりして、どこが問題なのか
切り分けをしてみたらどうでしょう>

>>345
Benchmarkモジュールって標準ではいってなかったけ?
http://search.cpan.org/author/JHI/perl-5.8.0/lib/Benchmark.pm

■ このスレッドは過去ログ倉庫に格納されています