弐ch編集のPerl講座 (231レス)
上下前次1-新
10: 弐ch編集 02/02/15 09:27 ID:??? AAS
($name1, $name2, $god) = ('mike', 'mary', 'nihen');
@names = ('mike', 'mary', 'nihen');
@names = qw(mike mary nihen);
%data = (name1 => 'mike', name2 => 'mary', god => 'nihen');
%data = qw(name1 mike name2 mary god nihen);
分かるよな?分かるようになれ。代入の話だ。
qwはqqと同じようなもので「配列として扱う」ものだ。空白や改行が区切りとみなされる。
qw[]やqw~~でもOK。
$line = <IN>;
($no, $name, $comment) = split(/<>/, $line);
ファイルを処理するループの中でこんなのを見たことがあると思う。
splitで配列が返ってきてるからそれを代入してるわけだ。
ファイルの中身は「1<>nihen<>i am god.」こんな感じだろうな。
じゃあちょっとひねってみるか。
($log{'no'}, $log{'name'}, $log{'comment'}) = split(/<>/, $line);
ハッシュに入れてる。OK?さて。ここでハッシュの配列を表すいい方法がある。
@log{('no', 'name', 'comment')} = split(/<>/, $line);
これだ。これをハッシュスライスという。そのままハッシュのいくつかを並べた配列、だな。
見ればなんとなくやってること分かるだろ?勘のいいお前ならこうもいけることに気付くはず。
@log{qw(no name comment)} = split(/<>/, $line);
な。
だがqw(no name comment)をスクリプトのいろんな場所にいちいち書くのはコピペでも面倒だし、
途中で要素、例えばmailとかが増えると全部書き換えなくてはならない。女関係なみの面倒臭さだ。
そこでこうしてみる。
@format = qw(no name comment mail);
$line = <IN>;
@log{@format} = split(/<>/, $line);
これで@formatを書き換えるだけでこいつを使う全ての個所に対応できるようになった。俺のようにCOOLだろ?
11: 名無しさん@お腹いっぱい。 02/02/15 09:42 ID:??? AAS
これ以上Perlスレ増やして何する気だ?
12(1): 賛成の反対の反対ナノだ! 02/02/15 09:53 ID:??? AAS
> 9
> だからor dieの時、つまりopenが失敗した時には
> ファイルは空、しかも書き込みもできずっていう最悪パターンだ。
>
openが失敗したのにファイルが空になるのか?
ファイルが空になるということは空文字を書きこめたということでは?
詳しく説明しろYO!
13: 弐ch編集 02/02/15 10:13 ID:??? AAS
print OUT join('<>', @log{@format}),"\n";
書き込みは当然こうなるはずだ。分かるな?次はrequire。
#! /usr/local/bin/perl
require './mytext.pl';
print qq|Content-type: text/html\n\n|;
print qq|<html><body text="#FF0000">$text</body></html>|;
exit;
mytext.plを読み込んでる。イメージとしてはスクリプトのその場所に
指定したファイルが展開されてる感じだ。つまりmytext.plが
$text = 'MegabbsXP!';
1;
なら、スクリプトが
#! /usr/local/bin/perl
$text = 'MegabbsXP!';
1;
print qq|Content-type: text/html\n\n|;
print qq|<html><body text="#FF0000">$text</body></html>|;
exit;
と書かれているようなイメージ。なせmytext.plの最後に1;があるかというと、requireは自分が
成功したのか失敗したのか知る時にファイルの最後の式の真偽で判断するからだ。
だから最後にわざと真をおいてやるわけ。まったくうちの子のように手がかかる…。
で、こうもできる。
# mytext.pl
$text = $text . '?';
1;
#! /usr/local/bin/perl
$text = 'MegabbsXP!';
require './mytext.pl';
print qq|Content-type: text/html\n\n|;
print qq|<html><body text="#FF0000">$text</body></html>|;
exit;
出力はMegabbsXP!?になる。簡単だ。
14: 弐ch編集 02/02/15 10:55 ID:??? AAS
>>12
ああ、書き方がおかしかったな。flockとrenameを抜いてしまっていてはな。
print中にスクリプトが停止された場合というべきだった。
そうするとログが破壊される。途中までしか書けてないから。
15: 弐ch編集 02/02/15 11:01 ID:??? AAS
#! /usr/local/bin/perl
use strict;
$text = 'MegabbsXP!';
print qq|Content-type: text/html\n\n|;
print qq|<html><body text="#FF0000">$text</body></html>|;
exit;
use strictとは文字通りstrictというものを使うという意味だ。
てきとうにいうとstrictとは未知の値が出てくるとスクリプトエラーになる能力を
持っているライブラリってとこかな。この状態でスクリプトを組んでいけば
エラーが分かりやすくなって開発効率もあがる。
ちなみにこのスクリプトもエラーになるはず。なぜなら$textが
いきなり出てきているから。どこの誰なのか明確にしてやる必要があるわけだ。
my $text = 'MegabbsXP!';
これでOK。「どこ」なのかは分からないが、メインスクリプトで「どこ」はmainだということになっている。
そしてmainがmy $text、つまり私の$textですと言ってるわけ。
# mytext.pl
package MyText;
use strict;
my $text = 'god';
1;
#! /usr/local/bin/perl
use strict;
my $text = 'MegabbsXP!';
require './mytext.pl';
print qq|Content-type: text/html\n\n|;
print qq|<html><body text="#FF0000">$text</body></html>|;
exit;
「どこ」はpackageで宣言できる。mytext.plではMyTextだな。たしかあらたにpackageが
宣言されるかファイルの終わりまでがMyTextの世界。出力は「MegabbsXP!」…分かるよな?
暗黙で自分のpackageの変数が呼ばれるからだ。つまりmainもpackageのひとつにすぎなかったということ。
MyTextの$textは正式名称「$MyText::text」だ。どこの誰か、だ。
よく見かける&jcode::convertがいい例だな。あれはpackage jcodeの中のconvert関数という意味。
16: 賛成の反対の反対ナノだ! 02/02/15 11:31 ID:??? AAS
> 15
> MyTextの$textは正式名称「$MyText::text」だ。どこの誰か、だ。
>
my $text と局所化されているのでパッケージもヘッタクリもないダロウ?
17: 弐ch編集 02/02/15 11:37 ID:??? AAS
my %tmp = ();
@tmp{qw(no name com)} = split(/<>/);
my $log = \%tmp
これで$tmp{'no'}は$log->{'no'}とも表せるようになった。リファレンスだ。
\%tmpで%tmpのアドレスが取得でき、それが$logに代入されているわけだが…
簡単には「○○のところの」が$logに入ったわけだ。$logの指すところのno。つまり$tmp{'no'}。
だから$log->{'no'}を変更すると$tmp{'no'}も変わる。
my %log = %tmp;
の場合、これは単純なコピーなので$log{'no'}を変更しても$tmp{'no'}は変わらない。別物だから当然だ。
%tmpはマイドキュメントにあるフォルダで$logはデスクトップに置いた%tmpへの
ショートカットだと言えば分かるか?%logはデスクトップにフォルダごとコピーしたってとこだな。
my $log = [];
my $log = {};
これで@tmpや%tmpなどを使わずいきなりリファレンスが作れる。上は配列、下はハッシュ。
$logを元のもののように扱うのには@$log、%$logなどとすればいい。簡単だ。
見やすく分かりやすくする意味で@{$log}、%{$log}としてもいいかもな。
具体的には
push(@{$log}, 100);
@{$log}{qw(no name com)} = split(/<>/);
などと使える。
push(@{$log}, \%tmp);
とした時に$log->[0]->{'no'}は$tmp{'no'}だということが分かれば上出来だ。
そうそう、$log = \$textなら$$logか${$log}、な。
で、なぜこんなものを使うかという話だが。一番単純にはメモリだ。
上の例でいえばHDDがもったいないからということ。
まあ他にもいろいろあるがそれは使っていくうちに分かるだろう。
使える場面では使っていったほうがいい。
18: 賛成の反対の反対ナノだ! 02/02/15 12:01 ID:??? AAS
ゴメン、やっぱり飽きたからやめるよ (=´Д`=) じゃっ
19: 賛成の反対の反対ナノだ! 02/02/15 12:17 ID:??? AAS
> 1
> なんか俺の偽者がいるから俺の本命Perlでたててみた。
>
18に漏れの偽者もいるんだけど スレはたてないでおこう。
20: 名無しさん@お腹いっぱい。 02/02/15 12:28 ID:??? AAS
このスレは一体何がしたいんですか?
間違った知識をひけらかして。
21: あぼーん [あぼーん] AAS
あぼーん
22: 名無しさん@お腹いっぱい。 02/02/16 17:51 ID:??? AAS
まじめな話、無茶苦茶な話をするのは勘弁してくれ。
23(1): 名無しさん@お腹いっぱい。 02/02/16 21:03 ID:??? AAS
わかんね。
24: 名無しさん@お腹いっぱい。 02/02/16 21:13 ID:7dTs20wP(1) AAS
>>1さん、勉強になります!
25: 名無しさん@お腹いっぱい。 02/02/16 21:13 ID:??? AAS
>>23
理解する必要なし。バカにされるっす。
26: あぼーん [あぼーん] AAS
あぼーん
27: ” [!] 02/02/17 12:11 ID:??? AAS
姫ハケーン!!!ハァハァw
28: 名無しさん@お腹いっぱい。 02/02/17 15:41 ID:??? AAS
>>1
偽物の方が役に立っていたのだが。
29(1): 名無しさん@お腹いっぱい。 [0d] 02/02/17 17:38 ID:??? AAS
>>1
とりあえずホンモノの姫の方は、
姫萌え野郎どものために
スカートをめくってパンチラを見せてあげることだ。
30: 名無しさん@お腹いっぱい。 02/02/17 17:39 ID:??? AAS
>>29
胸だけはだけての方がいいなぁ・・・はぁはぁ。
31: あぼーん [あぼーん] AAS
あぼーん
32: あぼーん [あぼーん] AAS
あぼーん
33(1): 名無しさん@お腹いっぱい。 [11] 02/02/17 18:21 ID:??? AAS
open(OUT, "> ./log.dat") or die;
print OUT "姫の尻穴チェーック!!\n";
close(OUT);
34: 名無しさん@お腹いっぱい。 02/02/17 18:25 ID:??? AAS
>>33
まさにディスクのゴミだなw。
35(1): 名無しさん@お腹いっぱい。 [11] 02/02/17 18:57 ID:??? AAS
open(OUT, "> ./log.dat") or die;
print OUT "「ふしぎの海のナディア」って感じでやってみるかな。
現在決定したキャストは、
ナディア=弐編姫
ネモ=ひろゆき
ガーゴイル=切込み
かな。
いや、
ネモ=切込み
ガーゴイル=ひろゆき
かな。現実上の役職では、
ガーゴイル=切込み
ネモ=ひろゆき
だが。
\n";
close(OUT);
36(1): 名無しさん@お腹いっぱい。 02/02/17 18:59 ID:??? AAS
>>35
文字列に改行入れるなよ・・・レベルがばれるぞ。
37: 名無しさん@お腹いっぱい。 02/02/17 19:04 ID:??? AAS
/∵∴∴,(・)(・)∴| うるせー馬鹿!
38(1): 名無しさん@お腹いっぱい。 [11] 02/02/17 19:30 ID:??? AAS
>>36
本当なら\nっていちいち書くよ、無論w
39(1): 名無しさん@お腹いっぱい。 02/02/17 19:38 ID:??? AAS
>>38
はあ、何逝ってんのオマエ?? 白痴は消えろや
上下前次1-新書関写板覧索設栞歴
あと 192 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.008s