Perlについての質問箱 40箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/05/30(土) 06:14:34"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://pc11.2ch.net/php/)
CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2009/05/30 現在の最新版: 5.10.0
▼ 前スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり
0153デフォルトの名無しさん
2009/06/11(木) 22:55:19あとは人生転落するだけ。
0154デフォルトの名無しさん
2009/06/11(木) 23:07:4480年代に比べれば売上は今の方が大きい。
近視眼的な数値だけみてヤバイヤバイと騒ぐのは愚か。
0155デフォルトの名無しさん
2009/06/11(木) 23:15:1980年代と比べたら、出版数自体が大きく違う
つまり、売れないから一杯出すのスパイラルになってるんだよ
0156デフォルトの名無しさん
2009/06/11(木) 23:16:07その後あんたどうすんの?と言いたくなるような質問が多い。
一冊本を通読した方がよっぽど近道だと思うんだが。
0157デフォルトの名無しさん
2009/06/11(木) 23:30:05いや、danに限らず、新しい本が出た前後、あるいは出る前に
その本について触れているブログを見ると、「献本でもらった」
ばかりという現象さ。
0158デフォルトの名無しさん
2009/06/12(金) 00:26:04Effective Perlは買った
あれはいい本だ
0159デフォルトの名無しさん
2009/06/12(金) 05:58:35昔はいっぱい出版しても置くとこがなかった=売れなかった。
今はロングテールがそれを下支えしてる。
それはどうでもいいとして、現在一定の売上が上がってる以上、
「本が売れてない」って話は違うだろ。
>>158
青らくだくらいは通読しといた方がいいと思うけどな。
perldoc通読する気にはならんだろ。
このスレには青らくだにちゃんと書いてあるような単純なことで騒ぐやつが多すぎる。
0160デフォルトの名無しさん
2009/06/12(金) 08:07:45お前さんは出版業界の人なのけ?
一般的にニュース等で言われてたり、実際に出版業倒産が相次いでたり
そういう事実を否定してまで、「売れてる」と主張する根拠は?
0161デフォルトの名無しさん
2009/06/12(金) 08:47:46うん、全然売れなくなったな。
コンピュータ関係の本は、もう終わりだと思う。
0162デフォルトの名無しさん
2009/06/12(金) 11:52:280163デフォルトの名無しさん
2009/06/12(金) 18:18:44ttp:// にマッチするってどんな風に書けばいい?
0164デフォルトの名無しさん
2009/06/12(金) 18:21:180165デフォルトの名無しさん
2009/06/12(金) 18:47:060166デフォルトの名無しさん
2009/06/12(金) 20:16:280167デフォルトの名無しさん
2009/06/12(金) 20:21:31東野圭吾とか、今回の村上春樹とか、一部の売れっ子作家以外が殆ど売れない。
そこそこ売れる作家 というのが昔に比べてとても減った。
昔に比べ、どんどん娯楽というかエンターテイメントの多様化が進んでるから仕方ない。
0168デフォルトの名無しさん
2009/06/12(金) 22:59:130169デフォルトの名無しさん
2009/06/12(金) 23:14:48どんな入門書にも答えが書いてあるような質問を
こんなとこでするな、ということだ。
答える方も時間の無駄だし、質問してわかった気になっても全然身につかない。
無駄の相乗。
0170デフォルトの名無しさん
2009/06/12(金) 23:17:42my $self = shift;
my $func = shift;
&{$func($self)}
}
こんな感じで変数に入ってるメソッド名を実行したいのですが、
継承ができる書き方を教えてください
0171デフォルトの名無しさん
2009/06/12(金) 23:39:19$self->$func();
…って事ではなく?
0172デフォルトの名無しさん
2009/06/12(金) 23:56:30いけました。ありがとうございます。
sub hoge{
my $self = shift;
my $Function = {};
$Function->{'hoge'} = shift;
no strict 'refs';
#$self->{$Function->{'hoge'}};#ここがわからない
}
実際のコードだとこんな感じなんですが、
一時変数に代入したら{}とか気にせずにいけたんですね。
ちなみに、一時変数使わない場合の書き方とかあるんでしょうか?
後学のためにご存じでしたら教えて欲しいです。
0173デフォルトの名無しさん
2009/06/13(土) 00:27:49http://perldoc.jp/docs/perl/5.10.0/perlobj.pod
> 矢印の右側は典型的にはメソッド名ですが、メソッド名や
> サブルーチンリファレンスが入った単純スカラ変数も使えます。
あとperlrefとperlmodくらいは通読しとくといいよ
http://perldoc.jp/docs/perl/5.8.8/perlref.pod
http://perldoc.jp/docs/perl/5.10.0/perlmod.pod
0174デフォルトの名無しさん
2009/06/13(土) 00:29:35らくだ本を買おう!
0175デフォルトの名無しさん
2009/06/13(土) 00:33:34素敵なマニュアルまで紹介して頂いて重ね重ね感謝します
隅々まで全部読んできます
0176デフォルトの名無しさん
2009/06/13(土) 01:19:501にマニュアル
2にgoogle
3,4が無くて
5に2ch
だろーが!
0177デフォルトの名無しさん
2009/06/13(土) 01:55:530178デフォルトの名無しさん
2009/06/13(土) 02:07:30そういう強迫神経症的逃避法が存在する。
0179デフォルトの名無しさん
2009/06/13(土) 02:36:225.00xベースの改訂版(第2版)の古本でも買って、
新しい情報はperldocで追いかけた方がいいかもな
http://www.amazon.co.jp/gp/offer-listing/4900900486/
実際押さえるべき基本的な部分は5.00xの頃から大差無いし、
細かいところは第3版だと古いしね
0180デフォルトの名無しさん
2009/06/13(土) 03:13:14読んでないから実際にはウロコ落ちまくりかもしれないけど
0181デフォルトの名無しさん
2009/06/13(土) 05:17:02個人のデータ(苗字、名前、性別、住所、部署等)が載ったテキストを処理し、
特定の苗字で、性別が男の場合はその人のデータをすべて削除し、
それ以外はすべて出力するといったようなコードはどう組めばよいのでしょうか?
例えば、
鈴木 一郎 男 東京都大田区〜、営業部
鈴木 花子 女 千葉県浦安市〜、総務部
といったデータが存在した場合、鈴木花子はテキストに残るが、
鈴木一郎に関する全データは削除される、という処理です。
他の苗字の人のデータは性別関係なくすべて出力されますが、鈴木という苗字で男性のデータはすべて削除します。
どなたかご教示よろしくお願いします。使用環境はUNIXです。
0182デフォルトの名無しさん
2009/06/13(土) 05:58:14Perlでリクに答えるスクリプトを作るスレ
http://pc12.2ch.net/test/read.cgi/tech/1086143976/
0183デフォルトの名無しさん
2009/06/13(土) 05:59:59ありがとうございます。
こちらに書いてみます。
0184デフォルトの名無しさん
2009/06/13(土) 12:12:110185デフォルトの名無しさん
2009/06/13(土) 14:28:58grep -v ' 男 ' data.txt > result.txt
0186デフォルトの名無しさん
2009/06/13(土) 15:54:390187デフォルトの名無しさん
2009/06/13(土) 21:32:130188デフォルトの名無しさん
2009/06/13(土) 21:53:58鈴木 男 女 東京都千代田区
膨大なデータ扱ってると何起こるか分かんないからな。
0189デフォルトの名無しさん
2009/06/13(土) 23:59:320190デフォルトの名無しさん
2009/06/14(日) 01:10:050191デフォルトの名無しさん
2009/06/14(日) 08:38:53@kana = ('ァ', 'ア', (中略), 'ン');
とやるのと同じことをもっと賢くやらせるにはどうすれば?
0192デフォルトの名無しさん
2009/06/14(日) 10:30:17sjisならこれでok
@kana = (map {pack "S" , $_} (0x8340 .. 0x8393) );
0193デフォルトの名無しさん
2009/06/14(日) 11:00:28print "@kana";
すると
@・A・B・C・D・E・F・G・H・I・J・K・L・M・N・O・P・Q・R・S・T・U・V・W・X・Y・Z
・[・\・]・^・_・`・a・b・c・d・e・f・g・h・i・j・k・l・m・n・o・p・q・r・s・t・
u・v・w・x・y・z・{・|・}・~・・・< c ャ с ・ ・ �� ・ 宴 潟 泣 激 鴻 祉 純
帥 巣 茶 塔
こんなんなるよ?
0194デフォルトの名無しさん
2009/06/14(日) 11:15:26$ perl | nkf -w
print (map {pack "S" , $_} (0x8340 .. 0x8393) );
@アィイゥウェエォオカガキギクグケゲコゴサザシジスズセ
ゼソゾタダチヂッツヅテデトド ナニヌネノハバパヒビピフブプヘベペホボポマミ$
先頭1バイトが欠けてる上に「ン」まで行ってないなこれ。ちょっと調べる暇ない。ごめん。
0195デフォルトの名無しさん
2009/06/14(日) 11:33:24print join("\n", map {pack "n" , $_} (0x8340 .. 0x836f , 0x8380 .. 0x8393) );
0196デフォルトの名無しさん
2009/06/14(日) 11:37:39・使ってる環境がビッグエンディアンなのを考慮してなかった。
・カタカナに飛び地があるのを知らなかった。
ビッグエンディアンの問題は環境依存すると思うからよしなに。
0197デフォルトの名無しさん
2009/06/14(日) 12:35:16これでいけました
"n" かー。そういえば前にも使った。意味はよく判らない。
0198デフォルトの名無しさん
2009/06/14(日) 13:00:490199デフォルトの名無しさん
2009/06/14(日) 13:38:260200デフォルトの名無しさん
2009/06/15(月) 19:39:11HTML::Templateを使用しているのですが、TMPL_LOOPはハッシュしか扱えないのでしょうか?
配列を回したいのですが、方法がわかりません。
やりかたがあれば、方法を教えていただけると助かります。
0201デフォルトの名無しさん
2009/06/15(月) 22:37:310202デフォルトの名無しさん
2009/06/15(月) 23:52:42配列を使えばハッシュも回せるよ
0203201
2009/06/16(火) 02:16:150204デフォルトの名無しさん
2009/06/16(火) 09:06:57[{ x => ..., y => ...}, { x=> ..., y => ... }, ...]
そして内側のハッシュのキーがTMPL_LOOPのループ内で
見える変数名になる。
ただの配列 @hoge = (1, 2, 3) みたいので回したければ
適当に変数名を決めてやってこれを
[ { x => 1 }, { x => 2}, { x => 3} ]
のように変換すればいいので、
[ map { { x => $_ } } @hoge }
とかでいいんでね。
0205デフォルトの名無しさん
2009/06/16(火) 10:18:190206デフォルトの名無しさん
2009/06/17(水) 13:03:19なにをいっているのかよくわからなかったですけど
今理解できました!!packageしないとuseしなくてもuse lib "lib"してるから
勝手に読んでくれるのですね!?
ありがとうございました!!
0207cmu04e234.cncm.ne.jp
2009/06/17(水) 13:24:25現在、Perlの勉強をしているのですが、ファイルを分割した際の処理がわかりません。
変数の定義を別ファイルにて行おうと考えているのですが、requireすると変数のスコープが呼び出し元まではいらないのか、うまくいきません。
変数を定義したファイルをrequireして実行してみると
Global symbol "$logfile" requires explicit package name at ./admin.cgi line 179.
このようなエラーが多量にでています。
変数定義はmyでもourでも行ってみました。
どうか助言頂ければと思います。
0208デフォルトの名無しさん
2009/06/17(水) 13:46:05裸のlogfileを使おうとしてるね。その場合は、
----------- test.pl ----------
use strict;
our $a;
require 'test2.pl';
print $a;
----------- test2.pl ---------
$a = 1;
1;
とすればスコープが届くようになる。ourはこうやって使う。
myはファイルをまたいでスコープを持つことはできない。
0209デフォルトの名無しさん
2009/06/17(水) 13:54:18変数定義ファイルをスクリプトじゃなくてモジュールにしてExporterを使う
------
0210デフォルトの名無しさん
2009/06/17(水) 15:46:07>>208様にご解説いただきましたとおり、ourを呼び出し元のファイルに設定することで
エラーを出ないようにすることはできたのですが、requireする側のファイルに
use strict;
をすると、変数宣言をしていないためエラーが出てしまいます。
これを解決する方法はありませんでしょうか?
0211デフォルトの名無しさん
2009/06/17(水) 17:19:16> をすると、変数宣言をしていないためエラーが出てしまいます。
質問が良く分からんのだが、以下のは動くぞ。
--------- test.pl ----------
use strict;
our $a;
require 'test2.pl';
print $a;
--------- test2.pl ---------
use strict;
$a = 1;
1;
コードとエラーメッセージ晒してみ。
0212デフォルトの名無しさん
2009/06/17(水) 17:35:58エラーがでるかどうかと、perl -v | head -2の結果をよろ。
0213デフォルトの名無しさん
2009/06/17(水) 18:58:17$aだからエラーが出ないだけじゃ?
0214デフォルトの名無しさん
2009/06/17(水) 20:28:34use strict;
our $var;
require 'test2.pl';
print $var;
--------- test2.pl ---------
use strict;
our $var;
1;
自分も過去試行錯誤したんだけど結局こうするしかなかった。
include的な動作をさせたいならopenでファイルを読んでevalするしかないと思う。
0215デフォルトの名無しさん
2009/06/17(水) 20:29:310216デフォルトの名無しさん
2009/06/17(水) 20:30:39use strict;
our $var = 1;
1;
の間違いです。
0217デフォルトの名無しさん
2009/06/17(水) 22:02:51our取っ払って$varを$main::varに置き換えても同じことなのは
理解してる?
requireがどうしても必要だという場面が想像できない。
0218214
2009/06/17(水) 22:28:07明示的に指定しない場合は必ずmainになるとは限りません(mod_perl環境下など)。
この場合ourを使ってグローバルな領域へアクセスするのが安心・確実で
そうでない場合__PACKAGE__やcallerを使って管理しなくてはいけないので
自分の場合はバグの温床になりやすかったです。
仰るとおりこうしなければならない局面は少なく代替案はいくらでもあると思いますどね。
0219デフォルトの名無しさん
2009/06/17(水) 22:41:35> 明示的に指定しない場合は必ずmainになるとは限りません(mod_perl環境下など)。
だからー示したテストスクリプトの場合だよ。
グローバル領域をやたらと必要とするのは設計のまずさ故だと思う。
バグの温床になるとか言ってるから、正しい使い方はしていないと思われ。
0220デフォルトの名無しさん
2009/06/17(水) 22:42:320221デフォルトの名無しさん
2009/06/17(水) 23:09:32FOO=hoge
BAR=hage
みたいなtxtfile用意して読んで分割してハッシュにぶちこんだら?
CGI臭いけどww
0222デフォルトの名無しさん
2009/06/17(水) 23:23:25それjson/yamlで。
0223デフォルトの名無しさん
2009/06/17(水) 23:53:45提示したテストスクリプトでの場合を書いてますが。
誤った使い方は論外ですがグローバルが必要なケースは少なくありません。
バグの温床云々は貴方の提示したやり方だとバグの温床になりやすいので
私が提示したやり方の方がそうなりにくいと説明したまでです。
ポイントポイント全てで伝わって無くて残念です
0224デフォルトの名無しさん
2009/06/18(木) 00:29:43みたいなのに固執してないか?
0225デフォルトの名無しさん
2009/06/18(木) 01:39:13グローバル変数はできれば使いたくない
0226デフォルトの名無しさん
2009/06/18(木) 05:59:410227デフォルトの名無しさん
2009/06/18(木) 06:37:19能力ないのに口だけは達者な一番面倒なタイプのプログラマだな。
0228デフォルトの名無しさん
2009/06/18(木) 07:16:48お前、テストスクリプトまで書いてくれたヤツに
礼もなしにその重箱の隅つつきはねーだろ。
Camelの例示だって裸の$varが出てきたら暗黙に$main::varを
前提としてるぞ。
0229デフォルトの名無しさん
2009/06/18(木) 08:23:29重箱の隅ってレベルじゃないだろ。
それにどう勘違いしたら馬鹿な例示に感謝するって話になんだよ
0230デフォルトの名無しさん
2009/06/18(木) 09:54:04グローバル変数なんか使わなくても、共通定数(変数)クラスみたいなの作ればいいし
隠蔽性ってOOPの基本だぜ
0231デフォルトの名無しさん
2009/06/18(木) 16:01:04その間違いっていうのを詳しく。
0232デフォルトの名無しさん
2009/06/18(木) 16:48:15use strict;
require 'config.pl';
print config::param('hoge');
print config::param('fuga');
---- config.pl ----
package config;
use strict;
sub param {
return (
hoge => 'abcdefg',
fuga => '12345',
)[$_[0]];
}
1;
設定を1つに纏めたいなら、ourとか考えずに上記のようにしろ。
万が一の確立で、そんな面倒なソースがまわってきたら嫌だ。
0233デフォルトの名無しさん
2009/06/18(木) 17:11:11TMTOWTDI。
エラーが出るっつーから出ないようにしただけじゃん。
ourだってourで出来ないっつーからourで出来る例示をしたんだろ。
最低限の質問には答えてるんでね?最適解を出すのが質問の内容なら話は別だけどさ。
っていうかこの人最初にありがとうって言ってね?それで充分だろ>>228
0234デフォルトの名無しさん
2009/06/18(木) 17:15:17詳しく。
0235デフォルトの名無しさん
2009/06/18(木) 17:23:350236デフォルトの名無しさん
2009/06/18(木) 17:52:01$url = 'http://hogehoge.com/hoge.html';
$serverName = ($url =~ m(http://(.*?)(/|$)))[0];
このコードを別の書き方で書けないでしょうか?
$)が何かの変数だと解釈されてしまい以下のインデントがずれてしまいます。
0237デフォルトの名無しさん
2009/06/18(木) 17:59:03\z
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlreref.html
0239デフォルトの名無しさん
2009/06/18(木) 19:39:56sleep(5);
print "good";
status: が表示され5秒後にgoodが表示されて欲しいのですが、
これを実行すると5秒後にstatus: goodとまとめて表示されてしまいます。
調べてみた所$|=1にすればバッファリングが無効化され逐一フラッシュされるという事が分かりました。
しかしバッファリングを無効化したいのはここだけで、プログラムの他の部分では普通にバッファリングさせたいのです。
なので$|=1としたあと$|=0としなおさなければいけません。手動でflushする事は出来ないのでしょうか。
0240デフォルトの名無しさん
2009/06/18(木) 20:07:38#!/usr/bin/perl -w
use strict;
use IO::Handle;
my($count, $flush) = (0, 3);
for (split //, $ARGV[0]) {
print and sleep 1;
++$count % $flush or STDOUT->flush;
}
__END__
0241デフォルトの名無しさん
2009/06/18(木) 20:24:56出来ました。
ありがとうございました。
use IO::Handle;
print "status: ";
STDOUT->flush;
sleep(5);
print "good";
0242デフォルトの名無しさん
2009/06/19(金) 01:28:35もっと手軽にフラッシュできればいいのに
0243デフォルトの名無しさん
2009/06/19(金) 05:55:58print "status: ";
flush();
sleep(5);
print "good";
0244デフォルトの名無しさん
2009/06/19(金) 11:49:33use Encode;として、後は入力された物を正規表現なんかで置換したりする前に全てdecode("shiftjis",$hoge)とすれば問題は起きないのでしょうか?
0245デフォルトの名無しさん
2009/06/19(金) 12:17:45それ無名配列の一つ目を表示してるだけじゃね?
0246デフォルトの名無しさん
2009/06/19(金) 12:49:17表示させようと思っていますが、実装方法がわかりません。
設計レベルでは以下のようにしようと思っています。
・ウィンドウを生成する
・バックグラウンド処理を実行させる
・バックグラウンド処理は1ループ終わるたびに処理結果を
ウィンドウに書き込む
・ウィンドウは停止ボタンの押下によりバックグラウンド処理を停止させる。
また、開始ボタンにより再度バックグラウンド処理を開始させる。
以上よろしくお願いします。
0247デフォルトの名無しさん
2009/06/19(金) 13:14:00>>4
入出力のときに変換して内部ではutf8文字列で扱う
ように統一したほうが楽だよ。置換のときだけdecode
なんて混乱の元。
0248デフォルトの名無しさん
2009/06/19(金) 16:47:27最初にeucで書くことに逃げた奴がいるから、perlで対処されずに逃げ続ける羽目になる
2byteコードなのかそうでないのかは区別できるように設計されてるコードなんだから、
たまに認識できない文字があるのはperl側の手抜きに過ぎない
既にCPUは十分に速いんだから、まじめに処理しる
0249デフォルトの名無しさん
2009/06/19(金) 17:04:450250デフォルトの名無しさん
2009/06/19(金) 17:09:12本当だw
プロのプログラマーであるような事を言っておいて配列とハッシュの区別つかない初心者レベルとはひどすぐるw
0251デフォルトの名無しさん
2009/06/19(金) 17:31:18だが・・・それでも
100%の確信をもって書く!それがP板住人の気概ってもんさ
0252デフォルトの名無しさん
2009/06/19(金) 19:34:26ウソを正すことを強いられる。
ネットが本質的にウソと怒りと攻撃性に満ちあふれる世界となる理由だな。
■ このスレッドは過去ログ倉庫に格納されています