Perl コーディング初心者質問コーナー Part36
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/07/14 13:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0693nobodyさん
04/08/13 23:27ID:???一番かどうかはともかく一つのやり方として。
コンストラクタでは何もせず、プロパティは全てアクセサ経由で触り、
初期値はアクセサで設定する。
#--- Foo.pm ---
package Foo;
sub new {
my $class = shift;
bless { @_ }, $class;
}
sub color {
my $self = shift;
@_ or return $self->{'-color'} ||= 'red';
$self->{'-color'} = shift;
$self;
}
1;
#--- script ---
use Foo;
my @obj = (Foo->new, Foo->new(-color => 'green'), Foo->new);
$obj[2]->color('blue');
print $_->color, "\n" for @obj;
0694nobodyさん
04/08/13 23:34ID:Dbtrqa9I喧嘩を売っています
0695nobodyさん
04/08/14 03:15ID:HZTk9WgD普通にファイルオープンの open(AAA,"<BBB.txt") のように開いて
データを取得することが出切るのでしょうか?
検索で、解説ページなどを探したのですが良いサイトが見つかりません。
(探し方が悪いだけかもしれませんが・・・・)
どこか良いサイトなどがありましたら、教えてください。
0696nobodyさん
04/08/14 03:19ID:???0697688
04/08/14 10:22ID:???例まで書いていただいてありがとうございます。
買う時には必要でなかったプロパティが、買ってから途中でほしくなった場合のために
プロパティを後から追加できるオブジェクトメソッドを作っておいたらオブジェクト指向の利点がどこかで
失われてしまいますか?
sub additional_propety {
my $class = shift;
$class->{shift} = shift;
}
第2、第3引数に新規に追加するプロパティとその値を期待します。
0698nobodyさん
04/08/14 10:39ID:???そもそもコンストラクタ(new)を「買う」ことだと思ってる時点で、間違ってるな。
まあよくある解説だけどw
人に置き換えて考えてみ?例えば友達に「ジュース買ってきて」って頼むだろ。
そんでその友達がジュースをkって来るのは友達にはそういう振る舞いができるってこと
で、お前はその友達のインターフェースさえ知っていれば何度でもジュースを買ってきてもらえるんだ(買ってこない友達の状態もあるけどな)。
んでこんな時に new=買う ではおかしいだろ?だから new=自分と同一世界にいると認識する
なわけよ。だから認識さえすれば、人の家のテレビだって使えるわけだ。これが自然。
0699nobodyさん
04/08/14 11:03ID:???0702nobodyさん
04/08/14 15:31ID:???$sub
$exit{for}
ここらへんがPerlのいいところですか?(Perlとmysqlしか知らないのでよくわかりませんが、すくなくともSQLでは予約語はdb_name,tbl_name,columns_nameには使えなかった気がしたので)
0703nobodyさん
04/08/14 15:35ID:???0704nobodyさん
04/08/14 15:52ID:???a => 1,
b => 2,
c => 3,
};
このハッシュのキーと値を「=」でjoinして、さらにそれを「&」でjoinしたいんです。
my @a;
foreach (keys %$test)
{ @a = $_."=".$test->{$_} }
$ok = join '*',@a;
undef @a;
わざわざ@aに一度入れるのが、冗長な気がするんですがいれない方法はありますでしょうか?
0706704
04/08/14 16:03ID:???$a = join "&",map{$_."=".$test->{$_}} keys %$test;
0707nobodyさん
04/08/14 16:24ID:???と
$a == undefined && $a =1;
と
if($a == undefined){ $a == 1 }
これってどれが一般的に可読性がよいのですか?僕は結構真ん中の書き方がすきなのですが
みんなでプログラムを組む時などにはどれを使うと喜ばれますか?
0708nobodyさん
04/08/14 16:27ID:???0711nobodyさん
04/08/14 16:55ID:???0712695
04/08/14 17:13ID:HZTk9WgD見つかりはするんですが、内容が難しかったり、関係無いものだったり・・・
わかりやすいページを見つけるにはどういった単語で検索すれば良いのでしょう?
0713nobodyさん
04/08/14 17:20ID:???undefinedじゃなくてundefだろ。
そういうミスを use strict が警告してくれるんだよ。
ちなみに普通はundefは使わず、それぞれ
$a = 1 if ! defined $a;
defined $a or $a = 1;
if (! defined $a) { $a = 1 }
のようにdefinedを使って書く。
また、if ! の代わりにunlessを使って
$a = 1 unless defined $a;
unless (defined $a) { $a = 1 }
のようにも書けるが、一般的にunlessやuntilなどの否定条件文は理解の
妨げになることが多いので使われない。
if ! より字数が多いのもネック。
で、or(または||)やand(または&&)を利用した「式1 or 式2」のような
記述は、副作用を持つ式1の結果如何で式2を評価するというものなので、
副作用のないただの条件式を式1に使うことはない。
#openがよい例
やるなら後付けif文か通常のif文かだが、今は$a=1しかすることが
なくても、後々他の処理も追加する可能性が少しでもあるなら
通常のif文を使うべき。
長文スマソ
0715nobodyさん
04/08/14 17:27ID:???>見つかりはするんですが、内容が難しかったり、
難しいんじゃなくてそれが普通なんだよ。
藻前には無理ってことだからあきらめろ。
0716nobodyさん
04/08/14 17:45ID:???undefined間違えてすみません。
でも聞く限りではuse strictはやっぱり無駄なモジュールなんですね。
一応文法チェックかけるんでそれで十分だと思います。というか何故に毎回そんなモジュールを読み込む必要が
あるのか?です。なんかアフォぽです。
0719nobodyさん
04/08/14 17:55ID:???はstrict.pmとかvars.pmとか色々読み込むので確かに遅くはなりますが、
$a == undefinedとか書いちゃうようなバカにはちょっと遅いくらいが
ちょうどいいと思いますよ。ほんと。
0721nobodyさん
04/08/14 18:07ID:???use strict; に厳しい添削をしてもらって完成したコードが
エラーや警告出なくなったらお引取り願えばいいことも
わからないバカは(ry
0724711
04/08/14 18:15ID:???@a = qw/1 2 3 4/;
$a = "absnd";
%a = (a => 1);
(%a , $a , @a) = undef;
print "$a\n",%a,"\n@a";
これだけできました。でも一応
(%a , $a , @a) = (undef) x 3;
とかしたほうがいいですか?
0725nobodyさん
04/08/14 18:17ID:???0729nobodyさん
04/08/14 18:36ID:???0730nobodyさん
04/08/14 18:44ID:???0734nobodyさん
04/08/14 19:25ID:???0735nobodyさん
04/08/14 19:33ID:???0736724
04/08/14 19:33ID:???それでもできるんですね。
>>733
代入できても、やってはいけないことなのでしょうか?
(%a , $a , @a) = (undef x 3);
これが一番ですか?
0737nobodyさん
04/08/14 20:37ID:???コンマ演算子の優先順位が代入演算子より低いから括弧で括る必要が
あるのであって、代入する要素が一つの場合はわざわざリストにする
必要はない。つまり @a = 'a'; は @a = ('a'); と等価。
>>736
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
(%a, $a, @a) = undef; は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = (undef x 3); は構文エラー。
(%a, $a, @a) = (undef() x 3); は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = ((undef) x 3); は %a = (undef, undef, undef), ($a, @a) = (); と等価。
0738nobodyさん
04/08/14 20:43ID:???もまえは何がやりたいんだ?
(%a , $a , @a) = (undef x 3);
には少なくとも2つの大きな間違いが存在している。
まず、第1にundef x 3は文法エラーとなる。内容は実際に実行してから読め。
そして第2に、
(%a , $a , @a) = (1 => 2, 3, 4);
がどうなるのか考えろ。
0739nobodyさん
04/08/14 20:46ID:???use strictの有用性を説明されても聞かないくせに、
自分の質問にだけは答えてもらおうとする。
さ す が 夏 休 み
0741nobodyさん
04/08/14 21:41ID:???まったく動かない事くらい察してやれよ。
0742nobodyさん
04/08/14 21:49ID:EgOE5Yt9最初は釣りかと思ったが真性包茎みたいだねw
0743nobodyさん
04/08/14 21:58ID:???簡易デバッガみたいな使い方だろ、use strictって
0744nobodyさん
04/08/14 22:01ID:???っていうか、人間の感覚じゃまずわからんだろ。
strictは結構効率良いみたいだ。
Benchmark測ればわかる。
そんなことより、速度が遅いとか、無駄とかアフォとか言う前に、基本を勉強するべ
きで、しかもuse strict;の必要性についても、もっと勉強したりここの上級者の言
うことを信用したりしろっての。
0745黒死犬 ◆EgxBlf8nvc
04/08/14 22:38ID:???従わなかったところで、挙動が変わるわけでは無いし
http://perldoc.jp/docs/perl/5.8.1/strict.pod
0746nobodyさん
04/08/14 22:55ID:???0747nobodyさん
04/08/14 23:00ID:???完結してるんじゃないの?
まあuse strictと書きたくないなら
$^H |= 2|0x200|0x400;
とでも書きなさいっと。
0748nobodyさん
04/08/14 23:01ID:???0750黒死犬 ◆EgxBlf8nvc
04/08/14 23:11ID:???ああ、my変数の typo を教えてくれるという重要な機能がありましたね・・・
sub unko {
my $unko = shift;
$$unchi = $$**$$; # $$unko (ry のつもり
}
0751nobodyさん
04/08/15 00:17ID:ThpZR4YaC-BOARDで、投稿画面に追加したセレクトボックスの
投稿データチェック(未選択不可)を行いたいのですが、
どうすればいいのですか?
下記のところに、新しく追加したら大丈夫だと思うのですが..
チェックの仕方がわかりません。
#── メールアドレスをチェック
length($::FORM{'email'})
&& ($::FORM{'email'} !~ /^[!-?A-~]+@[!-?A-~]+\.[!-?A-~]+$/)
&& push(@error, 'メールアドレスが不正です。');
#── パスワードをチェック
($::FORM{'key'} =~ /[<>&"]/)
&& &::error(\('パスワードに「<, >, &, "」は'
. '使えません。'));
0752nobodyさん
04/08/15 00:33ID:???めんどいから use strict つけたままだけど
俺んとこは mod_perl だから実行時の速度は変わんないし
しかし珍しく本当に「コーディング」の話題だなあ
0753nobodyさん
04/08/15 00:49ID:???■ 自分で改造するアドバイスが欲しい場合には
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/79(テンプレ)
0754nobodyさん
04/08/15 00:57ID:3zveFoKh読み出した文字列が文字化けしたままなのです。
&jcode'convertで文字コードが変換出来ていないようなのですが・・・
どこが原因なのか、良くわからないのです。
お手数ですが、教えてくださいまし。
require "jcode.pl";
open(FI,"aaa.csv") || return 0;
while(<FI>){
$_ = nkf("-ed",$_);
chomp();
split(",");
if($_[0] eq $bbb){
$ccc = $_[1];
&jcode'convert(*ccc, "sjis");
}
}
close(FI)
0756754
04/08/15 06:40ID:3zveFoKh0757724
04/08/15 11:33ID:???とりあえず一回で10個くらいの変数(スカラ、アレイ、ハッシュ入り乱れてます)をundefして
メモリを開放したいんです。
($a,@a,%a) = ();
これで完全に未定義の時と同じメモリ状況になるんですか?一応消えるのは確認しましたが。
0758nobodyさん
04/08/15 12:03ID:???ならんて。
$aは未定義になるがメモリとは関係なし。
@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので
undef @aするとその分の変数領域は解放されるが、システムリソースとしては
喰われたままでPerlが終了するまで解放されない。
過去ログ嫁
0759724
04/08/15 13:05ID:???>$aは未定義になるがメモリとは関係なし。
>@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
>ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので
Perlではundefしてもメモリの開放はできないから、メモリ開放を期待して
ちょこちょこundefする必要はないってことですね。
0760nobodyさん
04/08/15 14:37ID:???0761ぢおぢお
04/08/15 15:24ID:EbxomzZwファイルがあったらというのはどうやってすればいいんですか?
0762nobodyさん
04/08/15 15:28ID:???ファイル検査演算子を使う。
0763nobodyさん
04/08/15 15:31ID:???0764ぢおぢお
04/08/15 15:33ID:EbxomzZw0765nobodyさん
04/08/15 15:36ID:???何をやってダメだったか書いてみ。
winだからって全てのファイル検査演算子が使えないわけじゃない。
tu-ka,環境依存の話なら先にそれを言え。
0766nobodyさん
04/08/15 15:54ID:???0767ぢおぢお
04/08/15 15:56ID:EbxomzZwprint "存在\n";
}
という風に存在したらというのをやったらなりませんでした
0768nobodyさん
04/08/15 16:04ID:???0769ぢおぢお
04/08/15 16:19ID:EbxomzZw0770nobodyさん
04/08/15 16:39ID:LDNVI8I+0771ぢおぢお
04/08/15 17:11ID:EbxomzZwのようなやつで
何々と何々と何々が読み込めたらという処理はどうすればいいんですか?
すみません検索しても分からなかったので
0772nobodyさん
04/08/15 17:29ID:???そ ん な お 前 が
や り た い こ と
直 接 の サ ン プ ル は な い
$aと$bと$cが1以上ならという処理はどうすればいいんでしょうか。
考える気がないだろ。
0773nobodyさん
04/08/15 17:30ID:???@hozonに全部パスを入れとけアフォ
foreach(@hozon){
print "ok" if -e $_;
}
このクソアフォが!?
0775nobodyさん
04/08/15 17:37ID:???0776ぢおぢお
04/08/15 17:44ID:EbxomzZw0777nobodyさん
04/08/15 17:45ID:???if ( $a && $b && $c ){ print "これでよくね?w" }
それとも
if ( $a > 0 ){ if ( $b > 0 ) { if ( $c > 0 ) { print "天山ツームストン" } } }
にするか?いっそのこと
exit || exit;
でいいんじゃん?
0778nobodyさん
04/08/15 17:46ID:???0779nobodyさん
04/08/15 17:47ID:???0780ぢおぢお
04/08/15 18:01ID:YD+WDikbなりませんでした。
0782ぢおぢお
04/08/15 18:10ID:YD+WDikb0784nobodyさん
04/08/15 18:41ID:???foreachのように、毎回スカラにリストの内容を代入する
+
forのように$iに現在のループ回数を入れる。
みたいなことは不可能ですか?foreach側で使うのは keys %hash なのでforの$iとリンクさせる形での
処理はできません。
0785784
04/08/15 18:45ID:???ループ回数が一定の基準を超えると、発動する処理をしたいのです。
0786nobodyさん
04/08/15 18:49ID:???ダサいやつでいいなら
$i = 0;
foreach(@a){
処理〜;
print "2桁キター" if $i > 9;
$i++;
}
で一応できるよ。
0788nobodyさん
04/08/15 19:28ID:???a => 1,
b => 2,
c => 3,
d => 4,
e => 5,
);
@a = keys %data;
delete @data{@a[1..3]};
これが
$data = {%data};
の場合に
delete @data->{@a[1..3]};
としてもうまくいきませんが、何か方法はありますか?
0789黒死犬 ◆EgxBlf8nvc
04/08/15 20:17ID:???こうですね
0790nobodyさん
04/08/15 23:12ID:???read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
のようにすればできたのですが、いきなり$$bufferに代入するとおかしい気がするので(シンボリックリファレンス?なんか非推奨って読んだ気がします)
$buffer = \"";
read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
とかを考えてみました。
0791nobodyさん
04/08/15 23:37ID:???☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
☆ 新規質問は名前欄・メール欄を空にして行え ☆
★ ★
☆ 質問者が返信する際は、名前欄に「最初に質問したレス番号」を入れろ ☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
0792nobodyさん
04/08/16 01:57ID:???■ このスレッドは過去ログ倉庫に格納されています