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

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/02/09 00:24ID:s0tpWWxg
初めに→「perl」その物のスレです。

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

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


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

あとは>>2-10。
0666nobodyさん03/03/08 20:15ID:???
>>663
$b{} はハッシュの要素を指す
! は論理否定
$_ はデフォルトの対象となる変数
(この場合はgrepによって第二引数=リストの一部が設定される)
++ はオートインクリメント(この場合は後置:式の評価後、インクリメントが発生)
066766403/03/08 20:19ID:???
>>665
OKでした。
2行目にも$comの記述があるから、と消そうとしなかった僕はアホですね。
ありがとうございました。
066866303/03/08 20:43ID:???
>>665
>>666
ありがとうございました
0669名無しのmakoto君(名前あるじゃん03/03/08 21:23ID:???
質問てか教えてなんだけど、簡単なアクセスカウンターの作り方
教えてください<(_ _)><(_ _)>ペコペコ
検索してもよく出てきませんでした(恥
お願いします(たたかれてもメゲマセン←ハァ?
0670nobodyさん03/03/08 21:32ID:???
>>669
あっちで答えてやったのでは不満か?傷ついた。
0671nobodyさん03/03/08 21:49ID:???
>>669
はいよ〜
http://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=perl+%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9&lr=
0672nobodyさん03/03/08 21:57ID:???
windows環境でperl勉強しています。
フルパスからファイル名を取得したいので
以下のように作りました。
一応機能的にはokなんですが、もう少し格好良くperlっぽいやり方があれば教えてください。
なんか無駄が多いような・・

$_=$0;
$_=~ s/^(.*)\\(.*)$/\2/;
print "$_\n";

0673nobodyさん03/03/08 22:03ID:???
>>671
ワラタ
0674名無し.net03/03/08 22:05ID:HY3rXLfE
はじめまして。
連想配列(?)についての質問なんですが、
$temp->{'001'} = "1";
$temp->{'002'} = "2";
$temp->{'003'} = "3";
という配列があり、これを通常の連想配列(ハッシュ)で
while (($name, $value) = each(%temp)) {
print "$name = $value<br>\n";
}
とやるのと同じ事をしたいのですが、可能なのでしょうか?
ご存知の方がいらしたら是非教えてくださいm(__)m
%tempを$tempにしたら、500 Internet Server Errorになってしまいました。
0675nobodyさん03/03/08 22:08ID:???
>>672
十分Perl臭い。
0676nobodyさん03/03/08 22:12ID:???
%{$temp}
だっけ…、ちと動作させてないから動くかわからん。
0677名無し.net03/03/08 22:14ID:HY3rXLfE
>> 676
おお。
出来ました。
ありがとうございましたm(__)m
0678 ◆hMJAPH9PWA 03/03/08 22:19ID:???
>>672
use File::Basename qw(basename);
print basename($0);

>>674
普通にハッシュを使うのではいけないのかな?
$temp{'001'} = '1';
# ...

まぁ、普通にデリファレンスすればいいんだけどさ。
while(my($name, $value) = each %$temp){
# ...
}
でも、サーバーで実験するのはやめたほうがいいよ。
ローカルマシンにperlを入れなさい。
0679nobodyさん03/03/08 22:21ID:???
>>672
$_=$0;
($_)= /.*\\(.*)$/;
print "$_\n";

んーいまいち
0680nobodyさん03/03/08 22:25ID:???
ローカルサーバでテストしてるのかも。
CGIとして実行するとエラーは全部500になっちゃうから、ちゃんと
エラーメッセージの見られる環境を用意したほうがいいよ。
(コマンドラインで実行させるとか、CGI::Carpモジュールを使うとか)
0681nobodyさん03/03/08 22:35ID:???
来訪者のホストを表示させるスクリプトを教えて下さい。
0682名無し.net03/03/08 22:36ID:HY3rXLfE
>> 678
Subroutineを梯子して使っているので変数形式のほうがいいかなぁと思いまして・・・。
っていうか、連想配列でのやり方知らないので(苦笑。

すいません。
一応、perlはインストールしてありますが、アップロードして実行して動くか調べてます(ぉぃ
やっぱサーバーに悪影響ですよね・・・。
0683nobodyさん03/03/08 22:56ID:???
>>681
表示させるって、「どういう環境で?」「どこに?」「どういうとき?」

質問するほうが省略してどうする!
0684nobodyさん03/03/08 23:02ID:???
>>683
それくらい自分で考えろ低脳。
0685nobodyさん03/03/08 23:06ID:???
>>683
すいません。
トップページを開いた時画面内どこでもいいですので表示させたいのです。
0686nobodyさん03/03/08 23:11ID:???
>>684は自分ではないです。
0687nobodyさん03/03/08 23:16ID:???
>>685
SSIは使えるの?
0688nobodyさん03/03/08 23:25ID:???
Perlと関係ない質問には答えんなってば。
>>681みたいなのはどうせクレクレ厨なんだから、技術的なアドバイスしても
徒労に終わるぞ。
068968703/03/08 23:29ID:???
そういえばここはPerlスレか。
0690nobodyさん03/03/08 23:42ID:???
>>687
つかえます
0691nobodyさん03/03/09 00:42ID:???
来訪者のホストを表示させるスクリプトを教えて下さい。

なにこの質問
このスレを舐めてるの?
0692nobodyさん03/03/09 01:39ID:???
書き込まれた内容を逆から表示したいのですが(例えば「あいうえお」を「おえういあ」)
reverseで反転すると日本語が化けてしまいます。
1バイト文字、2バイト文字が混在していても上手く反転して表示するには、どうすればいいのでしょうか?
また、改行(<br>)とかあっても正常に改行されて、且つ文字化けしない・・・。

よろしくお願いします。
技術的に難しいですか?
0693nobodyさん03/03/09 01:39ID:???
print $ENV{REMOTE_HOST};
0694nobodyさん03/03/09 01:41ID:???
>>692
文字コードは何なのか?
モジュールは使っていいのか?
perlのバージョンはいくつか?
0695nobodyさん03/03/09 02:36ID:teyBWd6E
use Benchmark;
timethese(10000,{
'ex1'=>sub {
print "テスト\n";
},
'ex2'=>sub {
print << "EOM";
テスト
EOM
}
});

をDOSプロンプトで実行すると

テスト
テスト
テスト
テスト
・・・・
テスト
ex2: 0 wallclock secs ( 0.60 usr + 0.00 sys = 0.60 CPU)

となります。
ex1: の結果をex2:のすぐ下にでも表示させたいのですが、
どうすればよいのでしょうか。
この結果(ex1: ex2:)はどこかの変数に入っているんですか?
アホな質問ほんとスミマセン・・・・。
0696nobodyさん03/03/09 02:42ID:???
>>692

print &jreverse('一応作ってみた。Shift-JIS限定。<BR>とか改行は考慮してないんでそのへんはうまく修正してちょ。');

sub jreverse {
my $str = shift;
my ($i, $f, @jchar) = (0, 0, () );
foreach (unpack('C*', $str)) {
$jchar[$i] .= chr($_);
if (!$f && (($_ > 0x80 && $_ < 0xa0) || ($_ > 0xdf && $_ < 0xfd))) {
$f++;
} else {
$f = 0;
$i++;
}
}
join("", reverse @jchar);
}
0697nobodyさん03/03/09 03:26ID:???
>>695
my $r = timethese( 略 );
foreach(keys %{$r}){
  my($sec, $usr, $sys, $cnt) = @{$r->{$_}}[0,1,2,5];
  printf "%10s: %2d wallclock secs (%5.2f usr + %5.2f sys = %5.2f CPU) @ %.2f/s (n=%d)\n",
  $_, $sec, $usr, $sys, $usr+$sys, $cnt/($usr+$sys), $cnt;
}
069869703/03/09 03:33ID:???
書き忘れ
どんなモジュールでも質問する前にドキュメント読むように。
perldoc モジュール名

で、usr+sys = 0 のとき上のルーチンではエラーになるので
適当に直して使ってください。
069969503/03/09 04:53ID:xiqLThI6
>>698
ありがとうございます。
perldoc も読み、更にその日本語訳もネットで読みましたが
まったくわかりませんでした。

そして usr+sys=0 のとき というのがどんな時なのかも
わかりません。よって直し方もわかりません。逝って来ます。
0700nobodyさん03/03/09 08:51ID:???
>>692
# shift-JIS 限定
$s = "こんにちは、世界!";

$s =~ s/([\x81-\x9f\xe0-\xfc])([\x40-\x7e\x80-\xfc])/$2$1/g;
$s = reverse($s);

print $s;
070170003/03/09 08:58ID:???
しまった、またしても…。
<br>は適当に処置をよろ。s/>rb</<br>/g;とか。
0702nobodyさん03/03/09 09:14ID:???
もしかしたらperl云々の問題かもしれませんが、
unlink ファイルを削除
rmdir ディレクトリを削除
のディレクトリってのは要するにフォルダのことでしょうか?
今まで同義のような曖昧な解釈でしたので一度ビシっと言ってやってください。
0703nobodyさん03/03/09 09:25ID:???
ディレクトリのことをウイソ厨はフォルダと呼ぶらしい
0704nobodyさん03/03/09 09:29ID:???
そのウイソ房に気が向いたら説教してくだせぇ
0705nobodyさん03/03/09 09:36ID:???
>>704
ERROR:長すぎる行があります!って怒られたから、URLをうまく貼れないかもしれん
URLを改行して途中で改行した

http://www.google.com/search?as_q=%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%A8%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E9%81%95%E3%81%84
&num=10&hl=ja&ie=UTF-8&oe=UTF-8&btnG=Google+%E6%A4%9C%E7%B4%A2&as_epq=&as_oq=&as_eq=&lr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=

070670403/03/09 09:37ID:???
URLは前半だけでもうまく貼れるんだなぁ ぉぃ
070770403/03/09 09:45ID:???
って擦れ違いじゃねーか!
こんな香具師にレスつけるなんて…
ダメボ…。
0708真性70403/03/09 09:48ID:???
>>706-707
暇だね・・

>>705
アリガトウございました。よくわかったようなわからないような。
これからチャント理解できるように詰めていきます。
0709nobodyさん03/03/09 10:45ID:???
use constantを使う場合と変数を使う場合では速度に差が出たりするのでしょうか。
また、ourなるものがありますが、皆さんどういう場面で使われるのですか?
0710名無し.net03/03/09 10:58ID:???
>> 705
※ディレクトリとフォルダの違い
ありません。ローカル側で「フォルダ」と言っているのをサーバ上で「ディレクトリ」と言っているだけです。それだけの違いです。
http://www.ayavv.net/d/beginner_hp/022.htm より
↑こんなこといっているサイトがありますけど(−−
0711nobodyさん 03/03/09 11:01ID:???
>>710
初心者にはそう説明したくなる気もわからんではないがな。
0712nobodyさん03/03/09 12:21ID:???
>>710
取りあえず掲示板に数人がかりで理路整然と論理を突きつけてみるのはどうか?
0713nobodyさん03/03/09 13:10ID:???
>>710
http://hp-design.net/beginning/lecture/html.08.html

こいつと同じこと言っているな(笑)
0714nobodyさん03/03/09 15:30ID:???
print "abc","def";
は
print "abc";
print "def";
と同義ですか?それとも
print <<EOM
abc
def
EOMと同義ですか?

鯖負荷を軽減させようとEOM使うのはやめたんですがカンマ区切りだと意味がないような気がしてきたので
書籍を見てもPerlだとメモリーの使い方は書いてなかったりする(欝
0715nobodyさん03/03/09 15:46ID:???
>>714
Perlがどうメモリ管理をしているのか知りたかったら、Perlのソースを読め。と言ってみる(藁
0716nobodyさん03/03/09 15:51ID:???
>>714
どちらかというと前者。
しかし、メモリの使用量云々を気にするなら、
print文の使い方より変数の使い方を気にすべき。
0717nobodyさん03/03/09 16:01ID:???
>>714
処理時間的には前者の方が早いね
0718nobodyさん03/03/09 16:13ID:???
>>716
いやむしろPerlを使うな(ry
0719nobodyさん03/03/09 16:24ID:???
>>718
そういうツッコミは無知を露呈するだけだと思うがどうか
perlスレだし
0720nobodyさん03/03/09 16:26ID:???
>>719
Perlで実行速度や消費メモリを気にしすぎる方がどうかしていると思うが。
0721nobodyさん03/03/09 16:30ID:???
どんな言語でもコーディングで効率化は図れると思うが。
インタプリタやスクリプトなら最適化が難しい分余計に。

他の言語を使えというのはひとつのソリューションだろうが、
このスレの趣旨ではなかろう。
0722nobodyさん03/03/09 16:49ID:???
だから(ryってしてるんだと思うよ。多分。
0723nobodyさん03/03/09 17:04ID:???
>>714
深読みしすぎかもしれんが、

<<EOM;
EOM

この記法は「EOM」じゃないからね。
ソース出さずに「EOM云々〜」って質問すると恥かくから気をつけよう。
0724nobodyさん03/03/09 17:05ID:???
>>723
End Of M?
0725nobodyさん03/03/09 17:17ID:???
>鯖負荷を軽減させようとEOM使うのはやめたんですが
これどういう意味なんだ?
0726nobodyさん03/03/09 17:24ID:???
>>724
End Of Message かなあ。
>>725
ヒアドキュメントのほうが負荷が大きいと判断したのかと。
0727nobodyさん03/03/09 17:40ID:???
>>726
思いこみというやつ?
0728nobodyさん03/03/09 17:54ID:???
どっち使ったところで殆ど変わらんのじゃ?
0729nobodyさん03/03/09 18:06ID:???
>>695 = >>714 じゃないかな。
ヒアドキュメントのほうがオーバーヘッドが大きいのは確かだが。。。

>>728 に一票。
0730nobodyさん03/03/09 18:06ID:2bzPHLiw
便乗質問なんですが、HTML出力をprint文で書く時
print <<"HTML";
<html>
ほげほげ
</html>
HTML
と書いているのですが、どこかで「HTML」と書くのは"格好悪い"
と書かれていた気がします。。
慣例的にはなんと書けば良いのでしょう?
EOFとかになるんでしょうか?
0731nobodyさん03/03/09 18:12ID:???
>>730
print <<"NULLPO";
<html>
ぬるぽ
</html>
NULLPO
0732nobodyさん03/03/09 18:18ID:???
  ∧_∧
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/     
 (_フ彡        / ←>>731
0733nobodyさん03/03/09 18:19ID:???
>>730
別にいいんでないの?
asm{}みたいなもんだし。
0734nobodyさん03/03/09 18:26ID:2bzPHLiw
asm{}???
「HTML」格好悪くないですか??
できれば慣例とか知りたいです。
そういう慣例ページみたいのあればうれしいんですが。。
0735nobodyさん03/03/09 18:31ID:???
>>734
それは公開されている数々のスクリプトを見ればいいと思うけど。
0736nobodyさん03/03/09 18:41ID:???
慣習というか、一般的には結局終わりを示すわけで
END_OF_???
EO?
こんなのが多いと思うけどさ。

ラベルと一緒でそれとわかれば何でもいいんじゃないの?
0737nobodyさん03/03/09 19:27ID:vWAYxQig
>>735
ごもっともです。けど見てみたら同じHTML出力でも
統一されてないようだったのでいったい何の略だ?
と思いまして。。
>>736
なるほど。勉強になりました。EO?をよく見ると思ったら
そういう理由だったのですか。こういうのはEOM、こういう場合は
EOFとか暗黙の常識?みたいのがあると思ってました。
(ある程度はそういうのがあるのでしょうけど)
ありがとうございました。
0738nobodyさん03/03/09 20:20ID:???
print <<"おわり";
日本人なら日本語で。
おわり

# ネタだからね、多分!
0739nobodyさん03/03/10 00:09ID:???
慣習的にEOFをずっと使ってた……。
このスレ読むまで意味を考えたこともないことに気付いた。

HTMLはダサくないと思う。
むしろ、そこはHTMLの出力部分であることを明示する意味で、
ソースの可読性に貢献してると思う。

俺も少し考えてみるか……
074071403/03/10 01:07ID:???
実行共用サーバーを使っているので消費メモリは気にしたいんです
実行速度は確認画面などで時間稼ぎをすればある程度はごまかせますが
機械は誤魔化せないのが辛いです

ちなみに漏れはEOM=End of Messageだと思ってます
EOFは本来ファイルの終わりをさす言葉なので途中で書くことはためわれます

ヒアドキュメントを使うというのは@array=<FH>同様に一気にメモリーを使って実行してしまう書法
対してprint "abc"; print "cde";はwhile()同様にメモリーの消費を抑えて実行する書法だと思っているのですが
だと思っていましたが間違いでしょうか?
074171403/03/10 01:11ID:???
あ、意味不明なたとえにしてました
@array=<FH>;
print @array;
がメモリーの無駄遣い
print <FH> while(<FH>);
ということで、考えてみてください

ついでに695ではありません
0742nobodyさん03/03/10 02:21ID:???
別になんだっていいんじゃないの、自分の好きなので。<HTMLでもEOMでも
そんな些細な事にいちいちカコイイ!!とかカコワルイ!!とか言ってる方が何か変よ。
0743nobodyさん03/03/10 02:59ID:???
>>740
メモリの消費と言うが、ヒアドキュメント程度でperlがシステムから確保する
メモリを使い切るようなコードを書いてるならそっちが問題だろう。
特にサイズを指定しない場合のメモリサイズ知ってるか?

そうそう、答え

>間違いでしょうか?
間違いです。メモリに格納はされません。

>>741
考えるまでもない例えだろ。
074471403/03/10 04:24ID:???
>>743
メモリを確保しないでどうやって書き込むんですか?
0745nobodyさん03/03/10 04:51ID:???
>>744
リダイレクト
0746nobodyさん03/03/10 08:12ID:???
まぁ、結局View記述言語はPHPとかJSPな感じの記述法が最適な訳だが。
0747nobodyさん03/03/10 09:44ID:???
>>746
IIS+ActivePerl で PerlScript 使えばよろし
0748nobodyさん03/03/10 13:37ID:???
こんばんは。
PerlにはPHPのstaticに相当する関数ってありますか?
それなりにPerlを扱ってきたにもかかわらず、今まで知り得なかったので
もしあったら便利だなーと。
0749 ◆hMJAPH9PWA 03/03/10 14:08ID:???
>>748
perlfaqにあるね。staticキーワードは無いが、実現は出来る。
perldoc -q static
...
BEGIN { # BEGINが不要なケースもある。が、あったほうが安全
my $counter = 42;
sub prev_counter { return --$counter }
sub next_counter { return $counter++ }
}
...
0750nobodyさん03/03/10 14:21ID:???
>>748
13:37にこんばんわって日本に住んでないのか?(w
0751名無し.net03/03/10 19:23ID:???
こんばんは。
Perlで半角カタカナを文字化けさせないように利用するにはどうすれば良いでしょうか?
jcode.plを使うと文字化けが発生するのですが・・・。
全角カタカナに直す以外の方法で教えてください
0752nobodyさん03/03/10 19:27ID:???
>>751
無い。
0753名無し.net03/03/10 19:58ID:???
>> 752
そんなぁ〜(><)
0754nobodyさん03/03/10 20:30ID:???
>>751
全部SHIFT-JISで処理を行う
0755名無し.net03/03/10 21:03ID:???
Shift-JISならjcode.pl使っても文字化けしない?
0756T女の竹田03/03/10 21:22ID:???
>>755
Shift-JISで通すならjcode.plはいらない。
もちろんEUCでデータを送られたら化ける。

ところで、ページをSJISで表示してるのに、フォームからEUCで送られてくるってこと
あるのかな?前から疑問なんだけど。
0757名無し.net03/03/10 21:32ID:???
>> 756さん
出力はJhift-JISにしてますけど、コードやDBはEUCを使ってます。
あと、メールを使うときはjisに変換したり・・・。
なのでjcode.plをどうしても使ってしまいます。
0758nobodyさん03/03/11 09:23ID:???
100行くらいのテキストファイルがあったとして、
そのファイルの50行目の値が欲しい時、直接50行目の値を取得することできるんでしょうか。
49回スルーさせるんじゃなくて。
0759名無しさん@Meadow03/03/11 09:24ID:i+lsKHdV
>>757
Jcode.pmにしれ。
0760nobodyさん03/03/11 09:33ID:???
当然シフトJISで通したら正規表現は転ける。encodeプラグマ使えば別なんだろが。
そもそもネットで半角(ry
>758
固定長ならseekで。可変長なら無理ぽ
0761Fox03/03/11 10:58ID:eJEHBp/l
たしか、、半角カナは日本特有のコードだから化けるんじゃなかったカナ〜
0762nobodyさん03/03/11 11:02ID:???
>>761
漢字だって日本特有のコードですが。
0763nobodyさん03/03/11 11:33ID:???
>>756
ブラウザの実装次第になってしまうのでありうる。

>>757
EUCで半角カナをどう扱うか考えてみましょう。
無理ぽ

>>758
head -50 text.txt | tail -1
0764nobodyさん03/03/11 11:43ID:???
前にもここにかいたのですが、
掲示板にはいる前のページとかに
最後に書いた人の名前と時間が表示されてるのがつくりたいです。
ちなみにiモードでやりたいです。
0765nobodyさん03/03/11 11:44ID:???
>>764
だからどうぞ作ってくださいな。と。
■ このスレッドは過去ログ倉庫に格納されています