"The duct tape of the Internet" こと、Perl についての質問箱です。
"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 あたり
# [Perl 日本語処理の基礎の基礎] # このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。 # このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。 # 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。 # まず、以下の行を先頭に入れて下さい。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; # ※1 use Encode; # 次に、あなたが実行したい処理の内容を入れて下さい。 $file = 'C:/なんたら/かんたら.txt'; open my $fh, '<', encode("cp932", $file) or die $! ; # ※2 print <$fh>; # 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう # おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。 # 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、 # ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。 # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、 # この例のように cp932 でエンコードする必要があります。
おちんちんかゆい
8 :
デフォルトの名無しさん :2009/05/30(土) 12:58:12
perlって変数は必ずmyつけたレキシカル変数にするのがセオリーなんですか?
>>8 「セオリー」の使い方が間違ってるような木が駿河・・・
use strict を宣言すると、変数を my で宣言することを強制される。
スクリプト言語系にありがちな
変数名の単純なタイプミスを事前に防げるわけだ。
必須ではないが、長いスクリプトを書くなら use strict と my は使用した方がいい。
短いスクリプトならどうでもいいいよ。
VB の Option Explicit みたいなもん
短いものならourとか使う必要もないだろうし
みんな our って使ってるの? なんか $::abc って書いてしまう。 明確な理由はあるけど長くなるから書かない。
$::abcだとmod_perlの時に困る
処理体系にかかわらずPerl内部のtime_t型をlong long intで扱うことは可能ですか?
15 :
デフォルトの名無しさん :2009/06/02(火) 11:11:02
splitで分割したときの挙動でよく分らないのですが ----------------------- my @a = split(',', ',,,'); print scalar(@a), "\n"; # 「0」と表示される。 ----------------------- my @b = split(',', 'a,,,a'); print scalar(@b), "\n"; # 「4」と表示される。 ----------------------- 最初に書いた split(',', ',,,')でなぜ空の配列が返ってくるのが よく理解できません。 split(',', 'a,,,a'); で4つ返ってくるなら、',,,'なら3つか4つ 返って来そうな感じがするのですが、教えて頂けないでしょうか。
>>15 split [pattern [, expr [, limit] ] ]
でlimitを省略すると、最後の空フィールドは返されない。
split(',', ',,,')は全て空フィールドだから空のリストが返ってくるのだと思われる。
splitの第一引数がパターンというのは慣れるまで違和感あるな そっちの方が便利なのは判ってるけど、 普通は区切り文字が決まってるから、 わざわざ遅くなりそうな正規表現で書くのに抵抗がある
18 :
デフォルトの名無しさん :2009/06/02(火) 18:33:33
言語云々以前の問題なんですが さっきインストールファイルをダウンロードしたんですけど 実行しようとすると "インストールパッケージを開くことができませんでした。アプリケーションベンダに問い合わせ、 このパッケージが有効なWindowsインストーラパッケージであることを確認してください。" が出て先に進めないんですけどどうしたらいいんですか?教えてください。
壊れてるんじゃね MD5チェックサムとかあれば試してみれば? まあブラウザのキャッシュ消してからDLし直せばいけると思うけど。
20 :
デフォルトの名無しさん :2009/06/02(火) 20:18:14
>>19 perlのバージョンを落としたら 5-10-0 1004 (?)から 5-10-0 1005
に変えて実行したらできました
なんだったんでしょうか・・・
21 :
sage :2009/06/02(火) 20:19:04
すいません20ですが 1005から1004でした 1レス無駄にしてすいませんでした。
>>20 ダウンロードの時にファイルが壊れたんだろ。
23 :
デフォルトの名無しさん :2009/06/03(水) 00:26:58
>>16 ありがとう御座います。
最後の空フィールドは返されないって仕様なんですね。
my @member = qw/あ い う え お/; print $member[0],"\n"; print $member[4],"\n"; これを実行したんですが、 結果が あ お と表示されるはずが あ い う え お と表示されるんですがなぜなんですか?
デバッグすればわかる
2chからスクリプトをコピペしたら謎のエラーで動かなくて、 ちょうどそれが漢字の取り扱いで困ってた時だから、 インデントの全角スペースがエラーだと言われてるのに暫く気付かなかったことがある
>>24 「あ」と「い」の間が全角スペースになってるだろ。
>>26 俺は全角スペースは下線が出るようにエディタの設定をいじってる。
0とOも0に斜線がつくなどマ向けのフォントを使用。
全角スペースは薄く四角で表示するようにしてたけど、 うざいから止めたな .plの時だけ設定しとこう
29 :
デフォルトの名無しさん :2009/06/03(水) 12:21:21
use LWP::Simple;
use threads;
for(1..10){
push @A,threads->new(sub{get"
http://www.2ch.net/ "})
}
for(@A){$_->join}
このコードのどこが間違ってるんでしょう?
間違ってなくない?
pushの最後にセミコロン忘れてるとか?
DDoSの試みなんじゃねえの。
34 :
29 :2009/06/03(水) 13:12:55
前スレでレスしようとしたら規制食らっちゃってできなかったんだけど 29のコードをcygwinの上で実行するとsegmentation faultが発生します。 cygwinの上でのPerlではスレッドは使っちゃいけないということにして おいた方がいいのかな?めんどくさいけどC#ならこんなことはないので
うだうだ書いてる暇があったら、実行環境をかけよ。 女か?
前に threads で遊んでたとき、初めは29みたいな書き方してたけど何か不具合が出て threads::joinable なものだけ join() するように書き換えた記憶がある。 不具合の詳細は忘れた。 ていうか、use Socket で直接投げるよりはウェイトかかるけど、撃つな。
たまに思うのだが、 最後はセミコロン無しでもいいよ、って仕様になんか意味があるんだろうか。 ワンライナー?
区切りなんだから、無いのが正解 pascalとかは、余分なセミコロンはエラーになる
セミコロン区切りのCSVで、行末にセミコロンが無いのと同じ
>>37 Larry Wallは、
for(1..10){print}
みたいな書き方ができるから、とも言ってた。
逆に、 $a = { 'abc' => cde, 'fgh' => ijk, 'lmn' => opq, }; の余計なカンマは(Larry Wallが個人的に)推奨している。
42 :
37 :2009/06/04(木) 07:26:48
なるほどなあ。 >41 それが出来ない文法って、軽くイラッ☆と来るよな。 昔のCのenumとか。
43 :
29 :2009/06/04(木) 11:18:53
ActivePerlでやったらなんの問題もなかったです パスの扱いだけは注意が必要ですが Windowsでは今度からなるべくこっち使うことにします
コンマが余計でもokなのって多数派?
多数かどうかは知らんが、嬉しい配慮ではあるな。
>>44 コンマは余らせない方針の人って見たことないよ。
Perlのコミュニティってなんかこあい>< 知識の少ない学生がおいそれと入っていっても歓迎される…少なくとも冷遇されないもんなんでしょうか 共有されてる情報は欲しいんだけど一歩を踏み出せないです
言語仕様だけ見ても、上手い書き方がピンと来ないケースが多いんだよな 試行錯誤した末に、最適の書き方が出来るように最初から作られてることに気付く Cとかの固い言語では有り得ない
cのパーサはコンパイラの授業を取った学生なら作れなきゃ不可だけど、 perlのパーサは無理だよね。
>>48 Cはコンパイラに都合のいいようにできてるから。
Perlは書く人主体で設計されており、本来コンパイラには不要な冗長性も
沢山含まれてるから当然と言えば当然。
prel の祖先は ed などのテキストエディタだからな。 ed に sh が合体したみたいなもん。 進化の系譜を書くとすると、こうなる。 ed --> sed --> awk --> perl sh ------------+
>>51 ちょっとその図には賛同しかねる。そんな単純な話じゃないと思うが。
じゃぁ、おまいが図を示せ。待ってるぞ。逃げるなよ。
こんなところであっさり示せたら「単純な話じゃない」という意見が嘘になるのでは。
sed --> awkはまちがい
こまけぇこ(ry
パーツを教えてやるよ。あとは自分で考えな。 sed C awk sh -->
sed --+--> perl --> php C --+ awk --+ sh --+ 簡単簡単
おまえら全然ちげーよ これくらい常識で考えたら素人だってわかんだろーが 金 --> 銀 --> perl -->プレゼント こうだよ!
perlの鬼があらわれた!
えーと、桃太郎伝説?
おまいら、よっぽどやることないんだな。
if ($a == 1) {$a = 0} は、どうして if $a == 1 {$a = 0} と書けないんだろう 紛れないと思うんだが
$a = 0 if $a == 1;
{$a = 0; $b = 0} if $a == 1; はできないけどな
>>63 if $a == $b{$a = 0}
は紛らわしくない?
$a=$a==1?0:$a;
$a == 1 && $a = 0;
指定したディレクトリにあるファイル、ディレクトリを全部他のディレクトリへ移動しようと思っています また、移動先にファイル、ディレクトリがあったばあいは再帰的にマージしたいです現在はlinuxのmvコマンドを呼んでなんとかしてるんですが、 指定したディレクトリの最後が同一でない場合なんかに対応してないし、マージ機能を持ってないし、持ち悪い処理がいっぱいあってダメダメな感じです こういうディレクトリの処理を簡単にできるモジュールはありますか?
>>63 ツッコミ所は色々あるが、たとえば、
if sub {$a = 0};
っていうことされたら困るだろ。subと{}は結合力が最も強い「項」であるので先に結合してしまう。
従って無名関数への参照が条件とコンパイラが解釈してしまう(んで構文エラー)。
loop_or_condition(xxx){yyy}の()と{}はセット。
>>70 通るが。
perl -e "print 'ok' if sub { $v = 1 }; print qq/\n/"
>>71 そりゃ通るでそ。。。
$ perl -e 'if sub {$a = 0}'
syntax error at -e line 1, near "if sub "
Execution of -e aborted due to compilation errors.
>>71 話読んでた?それは通るよ。
>>70 で言う所のyyy loop_or_condition xxx構文じゃんかそれ。
>>70 いまいち理解できんけどそれじゃ
if(sub){$a = 0}
って文になるんじゃね?
sub のところに任意の関数をいれるってなら話は分かるが無名関数のくだりがようわからん
( )を必須にするんじゃなくて、 紛れない限りは通すのがperlらしい気がする
>>74 確かに。式中のsubは{...}が必須っぽいから
if sub {...} はエラーで当然だし、通すには if sub {...} {...} って書けばいいだけ
まぁ、これとは別に、ifに括弧を必須としている曖昧な構文が存在することは間違いないだろうけど
>>74 Perlの文法には「優先順位」ってのがあってだな。
「項」の結合は何よりも優先されることになっているのよ。
これはPerlの一貫した言語仕様。だから、
if sub {$a = 0}
は、残念ながらif (sub {$a = 0})と解釈されることになる。
Perlはそういうものなので、変な例外があると余計ユーザが混乱する。
これを覆したいなら自分で新しく言語作ってそこでやって下さい。
>>75 >>70 に紛れるケースを示したが?
>>76 > まぁ、これとは別に、ifに括弧を必須としている曖昧な構文が存在することは間違いないだろうけど
詳しく。
>>77 いや、そういうことじゃなくて
if sub {$a = 1}
が意図してることが
if(sub){$a = 1}
となるんじゃないかと思った
それだったら普通に最初から通らんよね?
それで、例えば
foreach(@hoge){
if rmtree {$a = '/'}
}
なら言ってることが理解できるって話
んで結局何の話だったんだっけ
次のバージョンで括弧なくてもいいことにしても、互換性は失われないよな
Perl では未だ、bareword が非推奨ながら、しかしデフォルトで許されています。 従って、 if bareword { ... }; などとした時、名前空間に bareword() が存在すると、見た目の曖昧さを生じます。 # 個人的に Perl に限れば括弧が必須でなくなっても書いてしまう気はします。
今やってるプロジェクト、 KENTを彷彿とさせる、Perl4なコード いかにもPerlって感じの、省略の美学バリバリのコード Cライクなコード オブジェクト指向っぽいコード が混在している……。もうやだ……。
そんなもん屁の河童にこなしてこそPerl Wizard
Perlなんて大キライ! 仕事だから、仕方なくやってるだけなんだからね!
自分で作る という方向性だと、簡単な方がいいし、 他人に作らせる だと、オブジェクト指向バリバリになる まあ、オブジェクト指向だからといって、 タイプ数を増やさなければならないという法は無いのだが
可読性を取るのか効率を求めるか 今後このコードはどうゆう使われ方、扱われ方をされるのか・・・ ざっくり言えばニーズにマッチしたモノを作れるようになりたい ってかこれって様々な言語、いや職種にすら限らない仕事一般の話だな
ディレクトリを取得する際、 $cur_dir = Cwd=getcwd() . "\\"; で取得しているのですが、ディレクトリ名に"("が含まれていると それ以降の文字列が取得できなくなってしまうのですが、 対処法はありますでしょうか?
91 :
90 :2009/06/08(月) 19:58:53
しまった文がぜんぜん足りてない・・・
>>90 はその変数に格納された内容にバッチファイルのアドレスを足して
system($bat_pass);
みたいな形で使用しています。
(までしか認識さず、実行できない状態になっております。
ん? use Cwd; print $0, "\n", getcwd(), "\\\n"; C:\test(1)\test.pl C:/test(1)\
文字列の連結の演算子 '.' を誰も使わない
>>89 迷った時は保守性の高いほう。
性能とのトレードオフが生じる時(いまどきそんなに多くない)はベンチマークで測定して、看過できないボトルネックが解消できると分かった場合にのみコメントの上チューニング。
大抵は迷っているので大抵は保守性の高いほうを選ぶ。
そうしない部分のほうを特例扱いにしてコメント及びドキュメントで注意喚起しておく。
経験上それが最も安く付く。
経験上そうもいかないことも多いが。
>>93 アレには若干のオーバーヘッドがあるのです。
本当に連結してひとつの文字列に変化させたい場合には使います。
>>94 スクリプトの使用期間が1ヶ月で、特急の受注でも同じ書き方するか?
規模にもよるが、俺だったら少々スパゲティでもいいから納期優先するな。
1ヶ月の間だけなら多少のスパゲティの内容の把握くらいできる。
97 :
デフォルトの名無しさん :2009/06/08(月) 22:27:31
すいませんperl初心者です。 ある二つのテキストファイルがあって、 ファイルAは名前と住所 田中東京 佐藤千葉 鈴木埼玉 のようにあって、 もうファイルBは 田中 鈴木 など名前だけがあります。 ファイルAから、ファイルBに名前がある人の所(上の礼では「田中東京」)などと とりだしたいのですが・・・どのようにしたらよいでしょうか・・・。 マッチングやgrepを考えたのですがうまくいかないので。 実際は生物の遺伝子名で膨大なのでPerlなどプログラムを書かなければならないのですが・・・・
>>97 ?
ファイルBから1行読んで
あとはファイルAを1行づつ読んではファイルBから読んだ1行と先頭一致するかどうかだけでは?
それAはともかくBも膨大だったらちょっと苦しくないか?
>>97 何がどう「うまくいかなかった」のか書かないと返事のしようがないな。
とりあえず自分が書いたコードをさらせ。
>>97 田中と東京に区切り文字はないの?
あれば区切ってデータベースにでも突っ込んで少しずつ検索すればいいんじゃね?
情報少なすぎ マッチングやらgrepとか言っといて初心者だとか どうやったらうまくいかなかったのかとか 取り扱いデータは改変されてるし 聞きたいならネタ隠すなよな・・・
>>97 ちなみに、
> 実際は生物の遺伝子名で膨大なのでPerlなどプログラムを書かなければならないのですが・・・・
こういう用途は古くからPerlが多用されていた分野だから、十分なライブラリと
ノウハウの蓄積があるぞ。
DB入れれば一番簡単
>>96 そもそも普通に書いてスパゲティになるのはおかしいw
たしかに書いてくるコードがことごとくスパゲティの奴って
いるんだが、どうしてできるのか不思議でしょうがないよ。
素直に書く方が圧倒的に楽だろ?
素直厨w
Encodeモジュールの質問です。 shiftjisで書かれたファイルから文字列を読み込んで、utf8でdecodeした場合、文字列の内容は復旧できないのでしょうか? utf8でencodeしても元の文字列には戻らなくて困っています。 サンプルです。test.txtはshiftjisで書かれています。 use Encode; open IN, "test.txt"; my $str = <IN>; print $str; my $miss = decode 'utf8', $str; my $recover = encode 'shiftjis', $miss; print $recover ; コマンドプロンプトで実行しても元に戻りません。
shift-jisのファイルをutf8でdecodeしてまともになると思うほうがどうかしている。
テンプレ読めよアホウ。
use lib "lib"; use App::Config; で、自作のpmを使いたいんだけど上手く読めない…。 Configにsub testって関数があって print test(); ってやると Undefined subroutine &main::test called at index.cgi line 11. ってなる。 App::Config::test();ならちゃんと動く。 ちゃんとuse App::Config;って書いたのになんでエラーが出るんですか? 分かる方たすけてください!!
>>111 うまくエクスポートされていないだけだろ。
>>112 どおいうことですか?
是非詳しく教えてください!
>>111 Exporter 使ってる?
つかってるならlib 以下のディレクトリとパッケージ名がマッチしてない予感
WindowsXP Pro BlackJumboDog ActivePerl 5.10.0 Build 1005 の環境で行ってます。
packageの後にExporterでシンボルをエクスポートする必要がある。 Exporterのマニュアル見れ。
>>117 えええ、いままでこんなことしてなかったのに…
ありがとうございます。
全てのサブルーチンをエクスポートするとした場合には
@EXPORT = qw(sub1 sub2 sub3 ...);って永遠に書かなきゃダメですか?
それと、use constantで定義した定数とかもuse Config;したところで
使えるようにしたいのですが、そういった場合はどうすればいいですか?
require使ったほうが早いですかね?
気のせいでした… 今までApp::Config::test();ってアクセスしてました(汗。 とっても勉強になりました!ありがとうございました!
>>118 > 全てのサブルーチンをエクスポートするとした場合には
そんな変なことをしたいのだったら、そもそもpackageするなよ。
どうしてもやりたければ our @EXPORT = grep {defined &{$_}} keys %Hoge::; とでもしとけばいいんでね? 勧めないが。
PHPコミュニティの方が厨房が多い。 Perlコミュニティはオッサンばっかりだ。 Rubyコミュニティは若いがなんかキモイ。
html::template 2.9の使い方が書いてある日本語サイトとかないですか?
新しいモジュールを使う度に解説を探すけど、 日本語でまともなのが見つかった試しがない
古い版の日本語マニュアルを見つつ、適当に差分を探すのがいいんじゃない?
解説かけるぐらいの人になると英語マニュアルで足りるので よっぽどのモチベーションがないと日本語の解説って作られない 気がする。
ドキュメントの翻訳は、きちんと制度化しておかないと、元の更新に追従するのが 困難という法則。
簡単な部分は英語でも簡単に読めるし、 ニュアンスが微妙な部分は訳さずに原語を残した方がいい 結局、訳す意味がない
実際に動かしてみてから英文マニュアルやチュートリアルを眺めてみると、Jojoに英文が解せるようになってくるかと。
古ぼけた翻訳があることは、翻訳がないことより悪い。
つかよドキュメント文章、そんな難しくない多い。 でもよたくさん読む日本語速い
優秀サンプルあればドキュメント要らない
それはそうだね cpanのドキュメントとかも、サンプルコードがあれば、ほぼ目的は達成できるしな
簡単な英文なら頑張れば読めるけど、検索とかが自分には難しいッス…
googleが記号を無視してくれるせいで、 特定の使い方について調べように見つからない
優秀なマニュアルは英語も簡単 この英文難しいなって感じたらそれはマニュアル書いた奴が説明下手ってことにしてる
書籍は買ったほうがいいよ〜 場合によっちゃ使い勝手はネットより良いw Perlバリバリ使えるけど本なんか買ったことねーよって人いるかな? おいらは駱駝とクックとエフェクティブくらいしか持ってない
ラクダは買ったけど、ほとんど読んでないな リャマは続と併せて結構読んだ でも一番読んだのは、フクロウだな。
フクロウっつーと正規表現だっけ?
>>142 perldocより青らくだ買えとは言わないが、
「本はネットがあるからいらない」って人は考えを改めた方がいい。
本でしか手に入らないものもあるし、ネットだと不便な情報もある。
本ってそんなに売れてないのか
>>146 じゃあなんでAmazonがブイブイ言わせてるんだ?
こないだも村上春樹が速攻で100万部突破したそうじゃねーか。
>>147 Amazonは本だけじゃないよ
村上春樹は、かなり異例。出版業はかなりやばいよ
>>148 Amazonは元々本が出発点だ。手を広げただけ。
そりゃ媒体が増えたからある程度は仕方ない。
音楽産業の凋落よりはマシだろ。
>>149 そんなの誰でも知ってるだろ。何得意げに語ってるの?
Amazonがブイブイ言わせてるのは、書籍の売り上げじゃないっていう話だろ?
ブログを見ると、 「献本でもらった」「献本でもらった」「献本でもらった」 「献本でもらった」「献本でもらった」「献本でもらった」「献本でもらった」 「献本でもらった」「献本でもらった」「献本でもらった」 ばかりなので、本を買う気なくした。
もっと悪い例を出してそれよりマシとか言い訳するようになったら、 あとは人生転落するだけ。
つーか書籍の売上は落ちてるけど、1995年がピークだっただけで、 80年代に比べれば売上は今の方が大きい。 近視眼的な数値だけみてヤバイヤバイと騒ぐのは愚か。
>>154 80年代と比べたら、出版数自体が大きく違う
つまり、売れないから一杯出すのスパイラルになってるんだよ
ここへの質問にしても、その質問に答えをもらったとしても、 その後あんたどうすんの?と言いたくなるような質問が多い。 一冊本を通読した方がよっぽど近道だと思うんだが。
>>152 いや、danに限らず、新しい本が出た前後、あるいは出る前に
その本について触れているブログを見ると、「献本でもらった」
ばかりという現象さ。
基礎の本はネットで間に合うから買ったことない Effective Perlは買った あれはいい本だ
>>155 昔はいっぱい出版しても置くとこがなかった=売れなかった。
今はロングテールがそれを下支えしてる。
それはどうでもいいとして、現在一定の売上が上がってる以上、
「本が売れてない」って話は違うだろ。
>>158 青らくだくらいは通読しといた方がいいと思うけどな。
perldoc通読する気にはならんだろ。
このスレには青らくだにちゃんと書いてあるような単純なことで騒ぐやつが多すぎる。
>>159 お前さんは出版業界の人なのけ?
一般的にニュース等で言われてたり、実際に出版業倒産が相次いでたり
そういう事実を否定してまで、「売れてる」と主張する根拠は?
>>146 うん、全然売れなくなったな。
コンピュータ関係の本は、もう終わりだと思う。
.plはポーランドのドメインです
ちなみに新聞も売上げヤバイよ
コンピュータ関係の書籍は、ずっと縮小を続けている分野だよ。
小説もね。 東野圭吾とか、今回の村上春樹とか、一部の売れっ子作家以外が殆ど売れない。 そこそこ売れる作家 というのが昔に比べてとても減った。 昔に比べ、どんどん娯楽というかエンターテイメントの多様化が進んでるから仕方ない。
なんのスレやねんここ
まあ、「本なんていらね。webに全部書いてある」とか言う人間は、 どんな入門書にも答えが書いてあるような質問を こんなとこでするな、ということだ。 答える方も時間の無駄だし、質問してわかった気になっても全然身につかない。 無駄の相乗。
sub hoge{ my $self = shift; my $func = shift; &{$func($self)} } こんな感じで変数に入ってるメソッド名を実行したいのですが、 継承ができる書き方を教えてください
>>170 $self->$func();
…って事ではなく?
>>171 いけました。ありがとうございます。
sub hoge{
my $self = shift;
my $Function = {};
$Function->{'hoge'} = shift;
no strict 'refs';
#$self->{$Function->{'hoge'}};#ここがわからない
}
実際のコードだとこんな感じなんですが、
一時変数に代入したら{}とか気にせずにいけたんですね。
ちなみに、一時変数使わない場合の書き方とかあるんでしょうか?
後学のためにご存じでしたら教えて欲しいです。
>>173 素敵なマニュアルまで紹介して頂いて重ね重ね感謝します
隅々まで全部読んできます
はぁ・・・出版業界よろしくPerl界の凋落もここまできたか・・・ 1にマニュアル 2にgoogle 3,4が無くて 5に2ch だろーが!
らくだ高いっつの
勉強する代わりに本を集めまくる。 そういう強迫神経症的逃避法が存在する。
でも大半は既に知ってることのような 読んでないから実際にはウロコ落ちまくりかもしれないけど
181 :
デフォルトの名無しさん :2009/06/13(土) 05:17:02
Perlのテキスト処理で質問があります。 個人のデータ(苗字、名前、性別、住所、部署等)が載ったテキストを処理し、 特定の苗字で、性別が男の場合はその人のデータをすべて削除し、 それ以外はすべて出力するといったようなコードはどう組めばよいのでしょうか? 例えば、 鈴木 一郎 男 東京都大田区〜、営業部 鈴木 花子 女 千葉県浦安市〜、総務部 といったデータが存在した場合、鈴木花子はテキストに残るが、 鈴木一郎に関する全データは削除される、という処理です。 他の苗字の人のデータは性別関係なくすべて出力されますが、鈴木という苗字で男性のデータはすべて削除します。 どなたかご教示よろしくお願いします。使用環境はUNIXです。
183 :
デフォルトの名無しさん :2009/06/13(土) 05:59:59
>>182 ありがとうございます。
こちらに書いてみます。
OpenOfficeのオートフィルタでいいんじゃね
>>181 grep -v ' 男 ' data.txt > result.txt
鈴木 花子 女 青森県男鹿市~、男性用出版物販売業
残念だがその行はちゃんと残るよ。
やるならこうだよな。 鈴木 男 女 東京都千代田区 膨大なデータ扱ってると何起こるか分かんないからな。
それは理想的ではあるが現実的ではないという
おかまは残りますか?
ァからンまでの全部のカタカナのリストをsjisで作る時に、 @kana = ('ァ', 'ア', (中略), 'ン'); とやるのと同じことをもっと賢くやらせるにはどうすれば?
>>191 sjisならこれでok
@kana = (map {pack "S" , $_} (0x8340 .. 0x8393) );
んー、 print "@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 ャ с ・ ・ ・ 宴 潟 泣 激 鴻 祉 純 帥 巣 茶 塔 こんなんなるよ?
んー、 $ perl | nkf -w print (map {pack "S" , $_} (0x8340 .. 0x8393) ); @アィイゥウェエォオカガキギクグケゲコゴサザシジスズセ ゼソゾタダチヂッツヅテデトド ナニヌネノハバパヒビピフブプヘベペホボポマミ$ 先頭1バイトが欠けてる上に「ン」まで行ってないなこれ。ちょっと調べる暇ない。ごめん。
これでどーだ print join("\n", map {pack "n" , $_} (0x8340 .. 0x836f , 0x8380 .. 0x8393) );
原因: ・使ってる環境がビッグエンディアンなのを考慮してなかった。 ・カタカナに飛び地があるのを知らなかった。 ビッグエンディアンの問題は環境依存すると思うからよしなに。
map {pack "n" , $_} (0x8340 .. 0x837e , 0x8380 .. 0x8393); これでいけました "n" かー。そういえば前にも使った。意味はよく判らない。
utf8フラグが憎い
じゃあ取れば良い。
200 :
デフォルトの名無しさん :2009/06/15(月) 19:39:11
質問させていただきます。 HTML::Templateを使用しているのですが、TMPL_LOOPはハッシュしか扱えないのでしょうか? 配列を回したいのですが、方法がわかりません。 やりかたがあれば、方法を教えていただけると助かります。
え? むしろハッシュって回せたっけ?
甘いな 配列を使えばハッシュも回せるよ
203 :
201 :2009/06/16(火) 02:16:15
そんなマジレスされても…
ハッシュの配列しかまわせないと言うのが正解。 [{ x => ..., y => ...}, { x=> ..., y => ... }, ...] そして内側のハッシュのキーがTMPL_LOOPのループ内で 見える変数名になる。 ただの配列 @hoge = (1, 2, 3) みたいので回したければ 適当に変数名を決めてやってこれを [ { x => 1 }, { x => 2}, { x => 3} ] のように変換すればいいので、 [ map { { x => $_ } } @hoge } とかでいいんでね。
結局>200の意図は何だったのかしら? >204かねえ?
>>120 なにをいっているのかよくわからなかったですけど
今理解できました!!packageしないとuseしなくてもuse lib "lib"してるから
勝手に読んでくれるのですね!?
ありがとうございました!!
207 :
cmu04e234.cncm.ne.jp :2009/06/17(水) 13:24:25
Perlについて質問させていただきます 現在、Perlの勉強をしているのですが、ファイルを分割した際の処理がわかりません。 変数の定義を別ファイルにて行おうと考えているのですが、requireすると変数のスコープが呼び出し元まではいらないのか、うまくいきません。 変数を定義したファイルをrequireして実行してみると Global symbol "$logfile" requires explicit package name at ./admin.cgi line 179. このようなエラーが多量にでています。 変数定義はmyでもourでも行ってみました。 どうか助言頂ければと思います。
>>207 裸のlogfileを使おうとしてるね。その場合は、
----------- test.pl ----------
use strict;
our $a;
require 'test2.pl';
print $a;
----------- test2.pl ---------
$a = 1;
1;
とすればスコープが届くようになる。ourはこうやって使う。
myはファイルをまたいでスコープを持つことはできない。
209 :
デフォルトの名無しさん :2009/06/17(水) 13:54:18
>>207 変数定義ファイルをスクリプトじゃなくてモジュールにしてExporterを使う
------
210 :
デフォルトの名無しさん :2009/06/17(水) 15:46:07
皆様ありがとうございます。
>>208 様にご解説いただきましたとおり、ourを呼び出し元のファイルに設定することで
エラーを出ないようにすることはできたのですが、requireする側のファイルに
use strict;
をすると、変数宣言をしていないためエラーが出てしまいます。
これを解決する方法はありませんでしょうか?
> use strict; > をすると、変数宣言をしていないためエラーが出てしまいます。 質問が良く分からんのだが、以下のは動くぞ。 --------- test.pl ---------- use strict; our $a; require 'test2.pl'; print $a; --------- test2.pl --------- use strict; $a = 1; 1; コードとエラーメッセージ晒してみ。
つーかバージョン違いの挙動のような気がするから、
>>211 を打ち込んでみて
エラーがでるかどうかと、perl -v | head -2の結果をよろ。
--------- test.pl ---------- use strict; our $var; require 'test2.pl'; print $var; --------- test2.pl --------- use strict; our $var; 1; 自分も過去試行錯誤したんだけど結局こうするしかなかった。 include的な動作をさせたいならopenでファイルを読んでevalするしかないと思う。
$aと$bの恐怖ktkr!!
--------- test2.pl --------- use strict; our $var = 1; 1; の間違いです。
>>214 our取っ払って$varを$main::varに置き換えても同じことなのは
理解してる?
requireがどうしても必要だという場面が想像できない。
218 :
214 :2009/06/17(水) 22:28:07
>>217 明示的に指定しない場合は必ずmainになるとは限りません(mod_perl環境下など)。
この場合ourを使ってグローバルな領域へアクセスするのが安心・確実で
そうでない場合__PACKAGE__やcallerを使って管理しなくてはいけないので
自分の場合はバグの温床になりやすかったです。
仰るとおりこうしなければならない局面は少なく代替案はいくらでもあると思いますどね。
>>218 > 明示的に指定しない場合は必ずmainになるとは限りません(mod_perl環境下など)。
だからー示したテストスクリプトの場合だよ。
グローバル領域をやたらと必要とするのは設計のまずさ故だと思う。
バグの温床になるとか言ってるから、正しい使い方はしていないと思われ。
Filter::Macro
もうさ FOO=hoge BAR=hage みたいなtxtfile用意して読んで分割してハッシュにぶちこんだら? CGI臭いけどww
>>219 提示したテストスクリプトでの場合を書いてますが。
誤った使い方は論外ですがグローバルが必要なケースは少なくありません。
バグの温床云々は貴方の提示したやり方だとバグの温床になりやすいので
私が提示したやり方の方がそうなりにくいと説明したまでです。
ポイントポイント全てで伝わって無くて残念です
なんか知らんがrequire一発で設定取り込めるぜ! みたいなのに固執してないか?
グローバル変数にせんでも、ふつうにmyで定義したスカラーとかハッシュに読み込めばいいと思うが グローバル変数はできれば使いたくない
なんでuse使わんの?
>>223 能力ないのに口だけは達者な一番面倒なタイプのプログラマだな。
>>223 お前、テストスクリプトまで書いてくれたヤツに
礼もなしにその重箱の隅つつきはねーだろ。
Camelの例示だって裸の$varが出てきたら暗黙に$main::varを
前提としてるぞ。
our語る上で重要な部分で例示の限定的な状況下でも明らかな間違いなのに 重箱の隅ってレベルじゃないだろ。 それにどう勘違いしたら馬鹿な例示に感謝するって話になんだよ
ourも$main::varも使ったことないな グローバル変数なんか使わなくても、共通定数(変数)クラスみたいなの作ればいいし 隠蔽性ってOOPの基本だぜ
---- test.pl ---- use 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とか考えずに上記のようにしろ。 万が一の確立で、そんな面倒なソースがまわってきたら嫌だ。
>>232 TMTOWTDI。
エラーが出るっつーから出ないようにしただけじゃん。
ourだってourで出来ないっつーからourで出来る例示をしたんだろ。
最低限の質問には答えてるんでね?最適解を出すのが質問の内容なら話は別だけどさ。
っていうかこの人最初にありがとうって言ってね?それで充分だろ
>>228
238 :
236 :2009/06/18(木) 18:19:01
>>237 そんな方法があったんですね。
うまくいきました。
即レスありがとうございました。
print "status: "; sleep(5); print "good"; status: が表示され5秒後にgoodが表示されて欲しいのですが、 これを実行すると5秒後にstatus: goodとまとめて表示されてしまいます。 調べてみた所$|=1にすればバッファリングが無効化され逐一フラッシュされるという事が分かりました。 しかしバッファリングを無効化したいのはここだけで、プログラムの他の部分では普通にバッファリングさせたいのです。 なので$|=1としたあと$|=0としなおさなければいけません。手動でflushする事は出来ないのでしょうか。
>>239 #!/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__
>>240 出来ました。
ありがとうございました。
use IO::Handle;
print "status: ";
STDOUT->flush;
sleep(5);
print "good";
めんどいなあ もっと手軽にフラッシュできればいいのに
sub flush {$|=1;$|=0;} print "status: "; flush(); sleep(5); print "good";
Perlで日本語(shift-jis)の文字列を扱いたいんですが、 use Encode;として、後は入力された物を正規表現なんかで置換したりする前に全てdecode("shiftjis",$hoge)とすれば問題は起きないのでしょうか?
>>232 それ無名配列の一つ目を表示してるだけじゃね?
Win32::GUIで作成した画面に、バックグラウンド処理の結果を定期的に 表示させようと思っていますが、実装方法がわかりません。 設計レベルでは以下のようにしようと思っています。 ・ウィンドウを生成する ・バックグラウンド処理を実行させる ・バックグラウンド処理は1ループ終わるたびに処理結果を ウィンドウに書き込む ・ウィンドウは停止ボタンの押下によりバックグラウンド処理を停止させる。 また、開始ボタンにより再度バックグラウンド処理を開始させる。 以上よろしくお願いします。
>>244 >>4 入出力のときに変換して内部ではutf8文字列で扱う
ように統一したほうが楽だよ。置換のときだけdecode
なんて混乱の元。
文字列としてもsjisで取り扱って、コードもsjisで書くのが一番素直なんだけどな 最初にeucで書くことに逃げた奴がいるから、perlで対処されずに逃げ続ける羽目になる 2byteコードなのかそうでないのかは区別できるように設計されてるコードなんだから、 たまに認識できない文字があるのはperl側の手抜きに過ぎない 既にCPUは十分に速いんだから、まじめに処理しる
日本語でおk
>>245 本当だw
プロのプログラマーであるような事を言っておいて配列とハッシュの区別つかない初心者レベルとはひどすぐるw
レスの内容なんていい加減で当たり前、それが2chの書き込み・・・! だが・・・それでも 100%の確信をもって書く!それがP板住人の気概ってもんさ
半可通がウソを教え、詳しい人は、その気もないのに時間もないのに、 ウソを正すことを強いられる。 ネットが本質的にウソと怒りと攻撃性に満ちあふれる世界となる理由だな。
出るところに出たら通じないから、こういう場所で頑張るわけだしね。
各言う俺も礼儀正しく何も分からない初心者のように質問した後、
舌の根も乾かないうちに偉そうなこと書くよ。
というわけでどちら様か
>>246 を答えてくださらないでしょうか?
さもなければもうらくだかクックブックを参照するしか・・・
参照すれば?
またunixでしかうごかんよプギャーとかのってそうで怖くて・・・
「書籍を一通りあたってみましたが、わかりませんでした。だから質問します」 ならわかるけど、なんで逆なんだろうな。
これがゆとりってやつか
自分で調べる ⇒時間がかかる ⇒⇒人件費がかさむ ⇒⇒⇒上司ににらまれる 他人に聞く ⇒即、解決。おわり。
モチは餅屋っていうじゃん
>>259 ところがその「時間がかかる」の部分でついでに身につくあれやこれやが
とてつもなく大きいんだよな。実力の半分以上はそれで付くってくらいに。
だから、特定の問題一つの解決までの道のり「だけ」を比較しても、あまり意味が無い。
上を繰り返すことで減少していく立ち止まりが、下ばっか選んでいると一向に減らないという点で、
トータルでは上のほうがロスタイム少なかったりするんだな。しかも下は嘘つかれ易いし。
もちろん、自分一人で延々悩んでいても埒が開かない場面ってのもあるけれど。
>>260 でもこの場合は質問者も餅屋だから。餅屋としての修行態勢は整えておこうよっていう。
>>260 > モチは餅屋っていうじゃん
金払う気あるってこと?
ここじゃ誰も金はらってないだろ
とりあえず楽しても身につかないから 成長したかったら努力しろ
人にただ働きさせて自分の仕事を肩代りさせようという魂胆だったわけだ。
>>261 青いな
その理屈はせいぜい社会人3年目くらいまでだろ。
何をするにもコストは発生する。成果物が明らかである以上、コストは
最小に抑えるにこしたことはない。
gtk-demoのdialog.plをwperlで実行するとちゃんと動くのですが、 ppでexe化して実行すると下記のようなエラーが出ます。 解決する方法どなたか教えていただけないでしょうか? C:\Documents and Settings\takeshi\デスクトップ\dialog>pp dialog.pl -o dialog.exe -l Glib.dll -l Cairo.dll -l Gtk2.dll -M Glib -M Cairo -M Gtk2 C:\Documents and Settings\takeshi\デスクトップ\dialog>"C:\Documents and Settings\takeshi\デスクトップ\dialog\dialog.exe" GLib-GObject-CRITICAL **: g_object_steal_qdata: assertion `quark > 0' failed at script/dialog.pl line 94. GLib-GObject-CRITICAL **: g_object_set_qdata_full: assertion `quark > 0' failed at script/dialog.pl line 94. Can't locate object method "signal_connect" via package "Gtk2::Window" at script /dialog.pl line 100.
>>265 仕事してる人間がここに書き込んだことあるの?
お前ら当たり前の話しすぎ
>>266 つまり勉強始めて3年以内に「自分でやるコスト<人にやらせるコスト」まで
スキルアップできなかった奴は金で解決しろって事だよな。
違います 3年やって駄目な奴は辞めて下さい
ちがう。 車輪、それも質の悪い奴を再発明しまくっているのに自覚のない オナニー野郎は悪害だから辞めて下さいという意味
273 :
267 :2009/06/20(土) 00:51:44
なんかスレ違いだったようです 失礼しましたm(__)m
聞けば済むことと、自分で見つけることに意義があることがある 優秀な教育者は、それを見極めて教えたり教えなかったりするが、 多くの先輩はそんなことは考えておらず、面倒なら教えないし、気が向けば教える
勤務時間中に勉強なんかするな! 勉強は学校でするもんだろ? 会社は、勉強した成果を発揮する場所であって 勉強する場所ではない! おまえは給料ドロボーかっ!
なんだ、このスレにはニートしかいないのか
>>265 最近プロっぽい人が初心者相手に親切に教えてくれてんじゃん。
265じゃなくて
>>268 だった。
貴重な時間割いて教えてくれてるんだから感謝しないとな。
perlの案件なんて基本的にないんです
同期を取るためにプロセス間でIO::Fileなんかのインスタンスを共有したいです 黒魔術的な所業で可能だったりしませんでしょうか あれば他のことにも応用できそうでいいかんじではないでしょうか
POEに投げる、じゃいかんの?
>>279 増えてきてる実感だけど。
PHPが大きいプロジェクト抱えすぎて破綻寸前なイメージがある。
PHPのフレームワークはフリーウェアをインストールした状態では
重くて使い物にならないしな。
まあCatalystも重いんだけど。Catalyst>>>>PHPのフレームワーク、だし。
>>274 そんな当たり前なこと偉そうに語るな
このスレは、それでも聞いちゃう人のスレ
そんな質問を見たり、答えたりして楽しむ人のスレ
画像を分割するモジュールはありませんか? ImagerとかGDとかImageMagickという画像編集のモジュールがあることは知っていますが、それ以上のことは知りません
>>281 ググってみました
今やろうとしてることにはたすきに長すぎる感がありますが面白そうですね
そっちに興味が移りました
ありがとうございます
バッチファイルの案件なんて基本的にないんです だからバッチファイルが書けなくても困りません
>>285 ImageMagickでcloneしてcropなりchopすれば見た目は分割になるImageMagick
>>285 画像の分割って画像編集なわけだが
ImagerとかGDとかImageMagickを使ってみればいいじゃん
>>278 感謝するべきプロの書込ってこれのこと?
>>208 >>232 スコープの話するのに$a使うような馬鹿がプロのわけないだろ。
232なんかourは使うなって書いたコードがour使うよりも劣る糞コード。しかも意図通り動作しない。
真偽を判断する事が出来ない初心者にあたかも上級者であるよう装って馬鹿な事を教えるような奴は
感謝するどころか消えて欲しい。
>>290 何故、そんな明らかなtypoに、レスして熱くなってるんだ?
もうちょっと本質について、語ってみろよ。
>>208 が$aでは無く$varで、
>>232 が[$_[0]]では無く{$_[0]}だとしたら
何が問題で、
>>290 ならどう解決するかを語って欲しいものだ。
どうでもいいようなtypoを偉そうに煽るだけのような奴こそ消えて欲しい。
typoの意味を間違えてるね。
「本質」
=>って書けば連想配列になると思っちゃったんだろうね。カンマと同じなのに。 291さんはPerl歴何ヶ月ですか?
>>211 どうでもいいようなtypoで自ら$aの罠にはまってるという。もはやギャグとしか思えんw
Perlerの内紛が醜いインターネットですね
学生さんたちがきたんだろ
無知で失礼な奴は2chだろうがリアルだろうが叩かれるからなぁ
300 :
デフォルトの名無しさん :2009/06/22(月) 01:02:55
HTML::Templateで $hoge->param( TEST => @test); $hoge->param( TEST2 => $test2); としていた場合、 <TMPL_LOOP NAME=TEST> <TMPL_VAR NAME=TEST2> </TMPL_LOOP> みたくすると、LOOPの中ではTEST2が呼び出せません。 呼び出す方法はありませんか?
何が問題かって配列に対して{$_[0]}したら構文エラーで動きませんよ。 配列やハッシュの基本的な事覚えたいならオライリーから出てるはじめてのPerlマジお勧めです
303 :
300 :2009/06/22(月) 01:55:19
解決しました globalフラグを建てればいいのですね。
@aの要素を得る書き方が、 @a[0]でなく$a[0]なのは、言語仕様のバグとしか思えない
分かりづらいですよね。Perl6では@a[0]になるらしいけど。 結局typo修正したちゃんと動くコードは教えてくれないのかな
>>304 > @a[0]でなく$a[0]なのは、言語仕様のバグとしか思えない
スカラーだから$になるでしょ。
>>304 @a[0]は、@aから要素0を取り出した配列って意味になるだろ。
結果ほぼ同じになるけど。
ハシュのスライスは、はじめ判らなかった。。。@Perlfaq4#How can I remove duplicate elements from a list or array? hash slice: @hash{ @array } = ();
判る必要なんかない覚えればいいんだから
>>301 リンク先見たけど「僕は馬鹿です^^」って宣言してるの?
=~ m//のオプションであるmやsはそれぞれ何の頭文字なんでしょうか。 multiとsimultaneous? >perldoc -f regular expressionとしてみましたが見当たりませんでした。 ご存知の方教えて欲しいです。
perldoc perlre ですよ。
multiple lineとsingle lineという事でした。
しかしperlreという言葉は思いつきませんでした。
どうやらPerlにおける正規表現の実装を総括した名前のようですね。
>>312 さんありがとうございました。
($a) = /(pattern)/; みたいなことをして、マッチすればそれが$aに入るけど、 マッチしなかったら何もせずに$aを保存、みたいな書き方ってできない?
if elseで書けばいいんじゃね?
$aを保存の意味がわからん
>>314 /(pattern)/ and $a = $1;
さて問題
>>314 のコードでマッチしなかった場合$aには何が入ってるでしょう
>>318 1個ならそれでも大差ないけど、
($a, $b, $c, $d) =
みたいな書き方が出来るのに、$1, $2, $3, $4とあんまり書きたくない
do { (my @tmp = /(pattern)/) and ($a, $b, $c, $d) = @tmp; } ($a, $b, $c, $d) = @{[/(pattern)/]} || ($a, $b, $c, $d);
だから$aを保存の意味がわからんつってんんだろ
保存=preserve 割と基本的な概念だ
KENTはここ来んなよ。
いえーい、ケント・デリカットさん見てるー?
質問スレなんだから、判らない人は黙ってればいいのに
$kosuu = "1,000"; $kakaku = "2,500"; $kosuu =~ s/\,//g; $kakaku =~ s/\,//g; print "$kosuu\n$kakaku\n\n"; # 複数の変数に対して同条件の置換を行いたいのですが # なにか簡潔な方法はありますか?もしあれば教えてください。 # ($kosuu,$kakaku) =~ s/\,//g;ではできませんでした。
$$_ =~ s/\,//g for(\$kosuu, \$kakaku);
map { s/,//g } ($kosuu, $kakaku);
あれだけ無様な姿晒しといてまた書き込みするわけなかろうて
>>329 リファレンスは知っているだけで全く使っていませんでしたがこういう使い方が出来るんですね。
$_ =~ s/\,//g for($kosuu, $kakaku);でも動くようなんですが、これでは何かまずい事があるんでしょうか。
>>330 map知りませんでした。配列処理に役立ちそうです。
お二方レスありがとうございました。
>>332 forは参照渡しだからリファレンスにする必要はない。
$_ が参照じゃないのってどんな時?
perlでwindowsでタイマーイベント発生させるにはどうすればいいのでしょうか? Time::HiResのalarmとか試みましたが貴様のプラットフォームではつかえねーよと拒否られました。 または定期的に処理を実行させる方法でもいいです(その場合時間経過と共に実際の時計との 差が広がらないのが条件です) よろしくお願いします。
>>336 定期的にというのが、分以上なら
cronNTとか使えばだろうだろう
あとは、
全体を
$time = 5;
for(;;) {
sleep($time);
(処理)
}
としたものを起動するとか。
これは、5秒置きに実行してるわけじゃないので注意。
あくまでも処理が終わってから、5秒置いて、再度実行してるだけね。
>>337 レスありがとう御座います。
定期的は秒ですね。
ちなみに後者のが時間がたつにつれてずれが大きくなっていく可能性がある実装の典型ですね。
cronNTというのは初耳なのでちょっと調べてみます。
その考え新しいな
あー、ファイルが同時に更新されるってか。そらあったら便利だ。
行単位で伸び縮みするのは怖い
>>336 なんでそんなに厳密な間隔で実行させたいの?
あほだろ
じゃなくてタイマーでした
つまり、 0:59→0:58→0:57 ・・・ って感じに表示したいってことかな? だったら、タイマーイベントを使うなんてのはアプローチからして間違ってる。 現在の時刻(から求められた文字列)をループさせて表示させる方がいい。 my $start = 60; my $startTime = time(); while(1) { my $past = time() - $startTime; printf "%d", $start - $past: (ここ、CRで同行表示に出来るよ) exit if $past <= $start; }
ちょっとミスがあったので改訂版 my $start = 60; my $startTime = time(); while(1) { my $past = time() - $startTime; printf "%d\r", $start - $past; exit if $past >= $start; } これで60〜0まで、同じ行でカウントするよ 描画ってのがラインとか図形って意味なら、printfの行を、図形を描画するルーチンに変えればいいだけ。
while(1)でまわしっぱですか。 CPU食いすぎじゃないですか?
じゃあ間をとってタイマーイベントでシステム時刻を取得して描画でええんちゃうん?
だから結局タイマーイベントなんですよね? んでタイマーイベントの発生のさせ方がわからんのですよ。
だからそこは Time::HiRes::alarm(ry while(1) の高速ぐるぐるが嫌だったら Time::HiRes::sleep 辺りで寝かせればどう?
やってみりゃ分かるが、そんなことでCPUは食わない while(1)で回し続けるなんて、デーモンじゃ普通にやること。 $pastが変わらなかったらprintしない方がいいけど、 そういうこと言いだすとコードが複雑になっていくか
>>353 sleepは必須だけど、デーモンってのは当にwhile(1)
355 :
348 :2009/06/23(火) 22:17:34
my $start = 60; my $startTime = time(); my $pastOld; while(1) { select(undef, undef, undef, 0.1); my $past = time() - $startTime; exit if $past > $start; printf "%d\r", $start - $past; $pasOld = $past; } これでいいかい? なんつーか、考え方だけをシンプルに書いただけだから 細かい制御は自分で考えてくれよ
356 :
348 :2009/06/23(火) 22:18:56
あーまたぬけた。 my $start = 60; my $startTime = time(); my $pastOld; while(1) { select(undef, undef, undef, 0.1); my $past = time() - $startTime; exit if $past > $start; printf "%d\r", $start - $past if $pasOld == $past; $pasOld = $past; }
357 :
348 :2009/06/23(火) 22:20:54
おっと。また訂正。つーかもう寝る。 if $pastOld != $past; $pastOld = $past;
なぜかsleepやselectいれると表示されないんですよね。 最後に想定した時間に終了するので動いてはいるっぽいですが。 まぁタイマー表示は飾りみたいなもんなのでtimeつかって 定期的に描画するとします。 ありがとうございました。
flush
my $start = 60; my $startTime = time(); $|=0; while(1) { # sleep(1); my $past = time() - $startTime; printf "%d\r", $start - $past; exit if $past >= $start; } このコードは秒が描画されるけどsleepのコメントアウト外すと描画されなくなるね。 不思議。なんででしょうか?環境依存?:This is perl, v5.8.8 built for MSWin32-x86-multi-thread
>>360 普通に表示される。
This is perl, v5.8.6 built for i386-freebsd
コンソールが追いついてないんじゃない?
学校の宿題だろうけど、LinuxなりBSDなり使ってやれば?
なぜ$|=0なん? やるんなら $|=1だろ。バッファに たまっちゃうよ。 sleep(1)をとるとものすごい勢いでprintされるから すぐにバッファあふれて描画されるだろうけど、 そうじゃないと1秒に一回2,3バイト書くだけなので、 全部バッファにたまっちゃう。終了時にまとめて 出たのも多分一瞬でシェルのプロンプトに上書き されて見えなくなるだろう。
flush
>>363 \rでflushされるんじゃなかったっけ?
この手のコードは $|=1; するのがセオリー。 なのに、あえて、わざわざ $|=0; してるのは、何か理由があるのか? たぶん、意味も知らずにコピーしてきたコードなんだろうな。 もういちど、1行1行、意味を考えながらコーディングしようよ。
368 :
360 :2009/06/24(水) 16:38:10
>>361 This is perl, v5.8.8 built for i486-linux=gnu-thread-multiでも再現するなぁ。
>>362 俺タイマーの質問者じゃないよ。
>>363 あぁなるほど、バッファがあふれているんですか。
\rすると以降の文字が上書きされ始めるからバッファがあふれることは無いと思っていたけど、
それは表示上だけの問題で実際のバッファの中には%d\rが積もり積もっていくんですね。
$|=1だとsleepの有無に関わらず表示されるのは分かりきった事ですが、
$|=0にするとsleepの有無で表示結果が変わってしまうのが気になりました。
そこを示す為に原文に無い$|=0を書き足したんですが言葉足らずでした。
よく分かりました。レスどうもありがとうございました。
俺はそのタイマーの質問者ですが、学校の宿題じゃないです。 windowsならどこでも実行可能なプログラムを作成する選択肢として PerlでPARつかうのが楽なのでPerlを選んだというセオリーです。
Cで書けバカ
PerlとJavaしかしらんので^^;
なんという俺
timerってどうやって実装すんのがいいのかな〜 ↓ 猫でもわかるをみる ↓ なるほどWM_TIMERがきたらWM_PAINTを呼ぶのか。 Perlでもそれくらい楽勝で真似あるよな。 ↓ みあたんねーおかしいな。じゃぁPerlでは同じことするとき いったいどうやるの? というセオリーです。
PerlとCじゃレベルが違うだろ・・・
Unix/Cなら割と問題ないけどね。 Win32APIだったらWin32::API使ってゴソゴソ作るか、 CPANでWin32系のモジュール漁るしかない。
376 :
デフォルトの名無しさん :2009/06/24(水) 18:45:23
へたくそな説明ですみません。変数に数値は入っているようにみえて、 実際には数値が入っていない事ってあるのでしょうか? メインとなる「index.cgi」と他のモジュールを分けて使いっています。 最初に別のファイルでPOST/GETデータをエンコードさせ、 「return %hash;」の形で下記ように戻しました。 %reEnc = ENC::enc(); そのファイルを再び下記のように別のファイルに渡しました。 fileLoad::FileSet(\%reEnc); その後に見た目上は滞りなく処理が進むのですが、 サーバーのログには下記のようにエラーが出てしまいます。 (※確かにエラー行では"reEnc"からデータを取り出し"$value"に入れてます。 index.cgi: Use of uninitialized value $value in string eq at fileLoad/FileSet.pm line *. 当然何かおかしいと思い色々と弄っていたのですが、基本となる「index.cgi」上で、 「%reEnc」のデータを「print」してみたのですが、それは画面上には表示されます。 しかし、if構文で処理させようとすると、その数値が「ない」と判断されてしまいます。 print $reEnc{'pointA'}; ← これは「pointA」の値がちゃんと表示される。 if(!$reEnc{'pointA'}){ print "ない";} ←しかしこの構文では「ない」が表示されてしまう。 でも、何故か表示上は最後まで処理がされてしまうのです。これは一体全体何故でしょうか? どう考えてもいろいろ駄目な感じはしますが、何カ所かでエラーチェックはかけていますし、 その数値が無ければファイルが呼び出せない「はず」の部分も存在します。 が。何故か処理が進んでしまうのです…。解せぬ。ということで、ご教示願いしまう。
肝心のエラー行のコードが書いてないって一体なんなの
>>377 最初それをやっていて、「自分大馬鹿」と思っていたのですが、
アルファベットにしても同じでした。
>>378 エラー行というほどの物でもなく、>
>>376 にある通りに、
画面に表示させると表示ができる。
変数として使おうとすると、何故か存在しなくなるのです。
もしかしたら別ファイルにあるサブジェクトに渡すところで、
何かしらの問題がでているのではないかとも思ったりと…。
>(※確かにエラー行では"reEnc"からデータを取り出し"$value"に入れてます。 だからここのコード晒さないのが質問者の態度か? 答えて欲しいなら勝手な判断でネタ隠すな
>>379 use strict してないから変数名間違っててもわかんないとか?
なんにせよどこでデータがとんでるかプリントデバッグしたらわかるんじゃね?
>別ファイルにあるサブジェクト
別モジュールのサブルーチンの事だよな?
WebProgへ誘導しないのは暇つぶしに使おうとしてるのか?
$reEnc{'pointA'} = "UNKO"; print $reEnc{'pointA'}; if(!$reEnc{'pointA'}){ print "ない";} 「UNKO」とだけ表示される。「ない」は表示されない。
「ない」だけじゃなく、変数も表示させてみろよ。
387 :
376 :2009/06/25(木) 11:35:53
さて…ソースも出さない、
>>1 も読めない愚かな
>>376 は、
>>382 の発言でようやく色々なモノに気付き旅に出ます…。
スレ汚しすみませんでした。"Perl"の質問じゃねぇよ。コレ…。
388 :
デフォルトの名無しさん :2009/06/25(木) 19:13:11
ハッシュを使ってデータ処理をしているのですが ハッシュのキーは同じで値を区別したいので三つのハッシュを使って データの処理を行っています。データ処理の結果を表示するときに困っています。 具体的にはデータファイルの書式が aho,34,23,32 baka,31,22,11 manuke,32,22,11 aho,22,22,33 となっており3つのカンマでデータがそれぞれ区切られてます。 そこで1列目(aho,baka,manuke)をキーにして2列目、3列目、4列目の値を 3つのハッシュ(%a,%b,%c)を使って縦方向に足し算しています。 ファイルの終わりにきたら結果を表示するために foreach $name (sort keys %a){ print "$a[$name]"; } としてひとつひとつハッシュの値を表示してるのですが、 できればforeachの中に%bと%cのハッシュ値を%aの値と同時に表示したいのですが どうすればいいでしょうか?
考え方が変。 $hash->{aho} = \ qw/34 23 32/; $hash->{baka} = \ qw/31 22 11/; $hash->{manuke} = \ qw/32 22 11/; for $n (0..3) { for $name (keys %$hash) { print $hash->{$name} , $hash->{$name}->[$n]; } }
あ、出したい形が違うかな? その場合は、for文順序逆で。
>>388 どんなことがしたいのかよくわからん。
aho,34,23,32 →34+23+32を出力
baka,31,22,11 →31+22+11を出力
manuke,32,22,11→32+22+11を出力
aho,22,22,33 →22+22+33を出力
こういう事?
いや単純に foreach $name (sort keys %a){ print "$a[$name] $b{$name} $c{$name}\n"; } でよくね?
何がしたいかわからんな 現状のソースを貼って、同じ結果になるより良い方法を教えて下さいと書くべき
394 :
デフォルトの名無しさん :2009/06/25(木) 19:53:32
>>391 すいません。
期待する出力としては
2列目の値を足し算
aho:34,22 →34+22を出力
baka:31 →31を出力
manuke:32 →32を出力
3列目の値を足し算
aho:23,22 →23+22を出力
baka:22 →22を出力
manuke:22 →22を出力
4列目の値を足し算
aho:32,33 →32+33を出力
baka,11 →11を出力
manuke:11 →11を出力
これの結果として
aho,56,45,65
baka,31,22,11
manuke,32,22,11
を得たいです。
単純に
>>392 さんの方法でできました。
お騒がせしました。
重複する行の項目を足し合わせて1行にしたいって事か。 解決したなら良かった。
cpanでPlaggerインストールしようとしたら途中でハングしました。 以下ハング箇所最新5行のログです。 C:\strawberry\perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib', 'blib\arch')" t/*.t t/100_load.t ...... ok t/110_compare.t ... ok t/120_single.t .... ok t/200_bl_ex.t ..... 5/22 ※5からすすみません。もう何十分か経過しています。 メモリ使用量をみると、じわじわと増加しています。 これがリークなのかテストしているのか分かればいいのですが。 このまま待つべきでしょうか? ちなみに環境はXPsp2のstrawberry perlです。
それです。更にさっきのログの上数行がこれです。 Writing Makefile for File::NFSLock cp lib/File/NFSLock.pm blib\lib\File\NFSLock.pm C:\strawberry\perl\bin\perl.exe "-Iblib\arch" "-Iblib\lib" File-NFSLock.spec.PL File-NFSLock.spec BBB/File-NFSLock-1.20.tar.gz C:\strawberry\c\bin\dmake.EXE -- OK Prepending blib/arch and blib/lib of 38 build dirs to PERL5LIB; for 'test' Running make test では無視するにはどうすればいいのでしょうか?ctrl+cでいいんでしょうか?
とっくにctrl+c実行しています。終了です。
$|=1; print `grep aaa *.txt`; みたいなことをして、結果を逐次表示させたいんだけど、 全部終わってからに一気に表示される 本当は print $result = `grep aaa *.txt`; みたいにしたいけど、とりあえずその前段階で詰まってる なにかいい方法は無いかな 環境はXPでactiveperl
>>400 パイプでどうだ。
open(GREP, "grep aaa *.txt |") or die;
while (<GREP>) {
print $_;
}
1行ずつは無理だけど。grepの出力バッファサイズごとに、ドカッ、ドカッ、と出てくるはず
んー がんがん出力がある状態だと大差ないけど、 ちょろちょろとしか出力が無いと、結局最後に全部まとめて、みたいなことになる
open(GREP, "| grep aaa *.txt") or die; そういう時はパイプを前に付けるといいよ。何でかは誰かが答えてくれる。
パイプを前て 意味が判らない でもちゃんと動いている
すげえ
$|=1; print 1+2; みたいなことをして、結果を逐次表示させたいんだけど、 全部終わってからに一気に表示される 本当は 1 2 3 みたいに表示したいけど、なぜか 3 だけ表示されて困ってる なにかいい方法は無いかな 環境はXPでactiveperl
>>406 > $|=1;
> print 1+2;
だけなら 3 だけ表示されるに決まってるけど?
「逐次表示」させたくてどんなコードを書いてるのかを晒さなきゃ。
試しに
$| = 1;
for (1..3) { print $_, " "; sleep(1) }
というコードで実行したら、ちゃんと1秒ごとに1 2 3が順次表示されました。
まぁ、そのなんだ・・・アレだな
>>406 それ1+2が計算されてその結果の3が出てるんだよ。
$|=1;
print "1 ";
sleep(1);
print "2 ";
sleep(1);
print "3";
釣りを警戒してない善意のスレだと、こんなんでも釣れるもんだな
しししまった、釣られた
3レス読めば忘れるんかい
釣りよりも、馬鹿が出現する方がよっぽど頻繁だしな 単にもっと馬鹿が来ただけの話
417 :
デフォルトの名無しさん :2009/06/29(月) 12:42:08
すみませんが教えてください。 下記のコードの3行目と5行目が何をしているのかわかりません。 特に3行目の@{ $form_data{$name} }っていう書き方を見たことがないので どういう配列を作っているのかがわかりません。 なぜrefで判定する必要があるのかもわからないので 詳しい方教えて下さい。 if(exists $form_data{$name} ) { if(ref $form_data{$name} ) { push @{ $form_data{$name} } , $value; } else { $form_data{$name} = [$form_data{$name} } , $value ]; } else { $form_data{$name} = $value; }
418 :
417 :2009/06/29(月) 12:50:47
$form_data{$name}がリファレンスだった場合は、 たとえば、$form_data{$name}の値が0x1919だったら 3行目で@0x1919っていう名前の配列を作っているということなんでしょうか? その辺がいまいちわからないのです
perldoc perlreftut の説明やサンプルを見てみるといいよ
ようは配列に入れてるだけだろ
無名配列
>>417 my %form_data = (
a => 'b',
c => [ 'e' ],
);
こういう感じのハッシュがあった時に$nameがcだとすると、$form_data{'c'}は配列のリファレンスだから
ref $form_data{$name}は真になる。
で、その配列の次の要素に$valueを入れたいから3行目の書き方になる
push @{ 配列のリファレンス }, value
要は@{ 配列のリファレンス }が配列を表してる。@arrayと同じだと思えばいい。
push @array, value
と同じ。
で、$nameがaだとすると、ref $form_data{$name}は偽になるので5行目にいく
bをそのまま残したいから配列のリファレンスを作って、その次の要素にvalueを入れてる
つか、配列かどうかを考えるならわかりやすいように2行目を
ref $form_data{$name} eq 'ARRAY'
って俺なら書くな。HASHの場合がないからこういう書き方なんだろうけど。
リファレンスわからないなら
my $array_ref = [0, 1, 2];
for (@{ $array_ref }) { warn $_; }
my @array = (0, 1, 2);
for (@array) { warn $_; }
とか、簡単なのを色々実行して実際に試したらいいよ。
use Data::Dumper;
print Dumper 変数;
ってやると変数がリファレンスかどうかもわかるし
>>417 if( !exists $form_data{$name} ) {
$form_data{$name} = $value;
} elsif( ref $form_data{$name} ) {
my $ref = $form_data{$name};
push @$ref, $value;
} else {
my $ref = [];
push @$ref, $form_data{$name};
push @$ref, $value;
$form_data{$name} = $ref;
}
上記のようにした場合、どこが不明なのか?
その不明な部分をperldocから参照しろ。
425 :
417 :2009/06/29(月) 15:56:25
423 よーくわかりました ありがとうございます。
426 :
デフォルトの名無しさん :2009/06/29(月) 18:30:23
あるCGIプログラムを実行したところ Can't locate CGI/Carp.pm と出ました。 どうやら use CGI::Carp qw(fatalsToBrowser); でエラーが出るようです。 ところが、 find `perl -e 'print "@INC"'` -name '*.pm' -print でモジュール一覧を見たら /usr/lib/perl5/5.8.0/Carp.pm とCarp.pmが入ってるようです。 こんな事ってあり得るのでしょうか? また、どのようにしたら、エラーが起こらず動作するようになりますか? RHE3 perl5.8.0 です
な、なんだってー!?
CGI::CarpはPerl5.4からコアモジュールなので特別な事をしない限り 入ってるはずなんだけどな。 /usr/lib/perl5/5.8.0/CGI/Carp.pm が存在するのなら動作しているスクリプトで@INCにちゃんとディレクトリが 含まれているか確認した方がいいと思う。 あとset uidしてtaint modeになってる場合は@INCに制限が掛かる。
430 :
デフォルトの名無しさん :2009/06/30(火) 05:16:49
Perlでファイルのロックの方法をいろいろ調べています。 flockが一番手軽で確実そうだと思ったのですが、どこを見ても環境に依存してしまうためあまり使われていないとの記述がありました。 具体的に動作しない環境はどのようなものになるのでしょうか? 現在Perlコードを動作させる予定のターゲット環境は複数あるのですが、基本的に全てGNU/Linux(一番古いもので、RedHat7.0位)か*BSD(FreeBSDかNetBSD)になります。 Perlのバージョンは、全て5以降になります。 このような環境でも、使用できない場合などございますでしょうか?
ウェブのレンタルスペース(特に無料のもの)じゃなければ、問題ない気がする
ttp://d.hatena.ne.jp/hide-K/20090619/1245401465 を見て
YAMLでシリアライズ/デシリアライズする実験をしていました
以下に示した上のコードを端末から実行したところ、Undefined subroutine &main:: called at -e line 7. と言われました
下のコードを実行したときはちゃんと "hello\n" が表示されました
$yamlをダンプした結果は上下とも、sub{ print "hello\n"} が入っていました(なぜか下では use strict 'refs' が頭に入っていました)が、
$obj2 = YAML::Load($yaml); の後のタイミングでダンプしてみると 上のコードでは hello => undef でした
違いは use strict のみだと思うんですが、どうして下で hello が undef になるようなことが起こったのでしょうか
my $obj = { hello => sub { print "hello\n";}, name => "hgoe"};
use YAML; $YAML::UseCode = 1;
my $yaml = YAML::Dump($obj);
warn $yaml;
my $obj2 = YAML::Load($yaml);
$obj2->{hello}->();
use strict;
my $obj = { hello => sub { print "hello\n";}, name => "hgoe"};
use YAML; $YAML::UseCode = 1;
my $yaml = YAML::Dump($obj);
warn $yaml;
my $obj2 = YAML::Load($yaml);
$obj2->{hello}->();
>>430 unix系OSでローカルファイルシステムならまず大丈夫。
NFSで共有したファイルを複数のホストからロックする
とかいうときには問題になりやすいけど。
>>430 >>433 に同意。flockはNFSを使わないBSD/SystemV/Linux系ならまず大丈夫。
NFSの場合はlockfを使うんだっけか。
Windowsは知らん。
文字列が漢字・ひらがな・(カタカナ)を含んでいるかどうか判定するにはどうすればいいですか
文字コードによる UTF-8なら、Unicodeブロックでぐぐれ
437 :
435 :2009/06/30(火) 18:58:36
Shift-JISです UTF-8へエンコードしてからUnicodeブロックを用いて検索しましたが、エンコード周りでうまくいかなかったようでダメでした 代わりにShift-JIS用の正規表現ライブラリ「ShiftJIS::Regexp」を見つけてそれを使って解決しました
環境に依存しないファイルロックならロックファイル方式がいいよ! CGIじゃ常識だよ?
Q.環境が限定出来るので簡単・強固なflockを使うのは問題ないか? A.環境に依存しないファイルロックならロックファイル方式がいいよ!CGIじゃ常識だよ?
>GNU/Linux(一番古いもので、RedHat7.0位)か*BSD(FreeBSDかNetBSD) とターゲットを限定しているけど、どうせ開発・デバッグはWindowsでやるんだろ? 悪いクセをつけないためにも、OSに依存するような実装は避けた方がいいよ。 「今さえよければいいんだ、将来どうなっても知らない。明日のことは明日考えればいいんだ。」 そんな気持ちじゃダメだな。
OSに依存しないファイルロックなんてできないわけだが…
443 :
デフォルトの名無しさん :2009/07/01(水) 08:18:45
ファイルハンドルを変数にするのと、FILEみたいなのにするのとでは どうちがうのですか?
> とターゲットを限定しているけど、どうせ開発・デバッグはWindowsでやるんだろ? そんな馬鹿な
>>443 前者は任意のスコープを取り得るが、後者はlocalスコープしか取れない。
>>441 > どうせ開発・デバッグはWindowsでやるんだろ?
自分がそうなんですね、分かります。
wordpadでCGI書いてるタイプですねw
use strict; my $func1 = 'Fuge'; my $func2 = 'Hoge'; no strict "refs"; *{"$func1"} = \&{"$func2"}; Hoge; Fuge(); #これを上のやつみたいに()省略して呼ぶにはどう書けばいいんでしょう sub Hoge{ print 'hogehoge'; }
*{"$funk1"}= sub { $funk2 }; こんな感じでは無理? 実験してないから知らんけど
レスありがとうございます。 どうにも上手く動かない模様です。
無理。つうか、いまどきシンボリックリファレンスなんか使うな
>>448 コンパイル時にサブルーチンだとわかってないとbaar wordに
なってしまいカッコは省略できない。そもそも元のプログラムじゃ
sub Hogeの定義が遅いのでHoge;もエラーになるだろ。
1. Fuge;の呼び出しより前の位置でBEGINブロック内でやる。
BEGIN {
*{"$func1"} = \&{"$func2"};
}
2. Fugeという名前がわかってるんだからプロトタイプだけでも宣言しておく。
sub Fuge;
>>452 完璧な解答ありがとうございます。
どちらの方法でもうまくいきました。
454 :
デフォルトの名無しさん :2009/07/03(金) 22:35:55
再帰アルゴリズムを用いて5!の計算結果を求めたいのですがなぜか値が返されません。 print "func(5)"; #5×4×3×2×1 sub func() { (my $n) = $_; if($n = 1){ return 1; } else{ return $n * func($n); } }
釣り針だらけに見えて仕方がない。
宿題は自力で。
457 :
デフォルトの名無しさん :2009/07/03(金) 22:55:47
454です。おかしなとこがあったので一部修正しました。 #!/usr/bin/perl $ans = func(5); print "$ans"; #5×4×3×2×1 sub func() { (my $n) = $_; if($n == 1){ return 1; } else{ return $n * func($n-1); } } exit;
釣られてやる。 > (my $n) = $_; ここがおかしいからマニュアルをよく読みなおせ。 あとは問題ない。
459 :
デフォルトの名無しさん :2009/07/03(金) 23:09:38
ヒントありがとうございます。おかげさまで謎が解けました。 subルーチン内では特殊変数$_ではなく配列にコピーされるんですね。 #!/usr/bin/perl $ans = func(5); print $ans; #5×4×3×2×1 sub func() { (my $n) = $_[0]; if($n == 1){ return 1; } else{ return $n * func($n-1); } } exit;
>>459 宿題やる。
・コード
$ans = add(1,5);
print "$ans";
・結果
6
関数addを定義してみ。
461 :
デフォルトの名無しさん :2009/07/03(金) 23:14:41
>>450 #!/usr/bin/perl
$ans = add(1,5);
print $ans;
sub add()
{
(my $n1, my $n2) = ($_[0],$_[1]);
return $n1 + $n2;
}
exit;
462 :
デフォルトの名無しさん :2009/07/03(金) 23:15:28
my ($n1, $n2) = @_ でいいよ。きもい。
sub add() {〜} は「引数なしの関数」だぞ。use strict; ではエラーになる 値渡しの引数を2個とる関数は sub add($$) {〜} と書く
>460 $ans = add(1,5); print $ans; sub add() { return $_[0]*10-$_[1]+1; }
無難に sub add { } にしとけばいいのに
467 :
デフォルトの名無しさん :2009/07/03(金) 23:59:21
>460 sub add($$) { my $n1 = shift @_; my $n2 = shift @_; return $n1 + $n2; } sub add($$) { return $_[0] + $_[1]; } sub add(){ my $wa = 0; foreach(@_){ $wa += $_; } return $wa; } sub add(){ my($n1,$n2) = (shift, shift); return $n1 + $n2; } sub add(){ my $n1 = pop; my $n2 = pop; return $n1 + $n2; }
>>460 sub add(){
shift;
shift;
return 6;
}
>>468 return 6ってwww
ドンだけ決めうちww
470 :
デフォルトの名無しさん :2009/07/04(土) 00:17:11
配列について質問です。 @array = ('aiueo',"hoge",'muge'); 配列の各要素に'aiueo''hoge''muge'が格納されてますが、 この後使い終わって不要になったら @array = (); とすることで中身を空にできます。 C言語のmallocみたいにOSからメモリ借りて使い終わったらfreeで返す のと似てるんですが、実際のところどうなってるんですか。 @array = ()とすることでメモリが溜めていたメモリが解放されるんだと 思っていいです?
>>470 メモリは解放されないけど、基本的には正しい。
参照しなくなったデータはガベージコレクションの対象になる。
ただし、C言語のfreeしてもOSに返すわけじゃないし、freeしてもプロセスの
使用メモリサイズが減ることもない。
>>469 perl ではないが、実際これに近い例があった訳だがw
程度の差はあれ、よくあるケースだよね。
>>460 のテストケースだけだったら、彼等ならやりかねない。
474 :
デフォルトの名無しさん :2009/07/04(土) 18:33:24
無名配列や無名ハッシュは値を渡すときなどに使うのはわかるのですが、無名関数の使い道がいまいちわかりません 具体的にどういうときにつかうのでしょうか?
例えば関数をプロットするような関数とか? sub plot ($$$$){ my ($fn, $min, $max, $step) = @_; for ($min; $min <= $max; $min += $step){ for (my $num = &$fn($min); $num > 0; --$num){ print '*'; } print "\n"; } } &plot( sub{ my $x = $_[0]; return $x * $x; }, 1, 5, 2 #1〜5まで2刻みで無名関数にデータを渡してプロットさせる );
>>475 そういうのをやるときは、「関数が渡される引数」のプロトタイプを"&"にしとくとカッコイイよ
sub plot(&$$$) { #最初の引数を"&"に変えた
my ($fn, $min, $max, $step) = @_;
for (my $num = $min; $num <= $max; $num += $step) { print '*' x $fn->($num), "\n"; }
}
plot(sub { return $_[0] ** 2; }, 1, 5, 2); #
>>475 と同じ呼び出し方
plot { return $_[0] ** 2; } (1, 5, 2); # こういう省略形でも書けてうれしい
477 :
デフォルトの名無しさん :2009/07/05(日) 16:39:51
配列の要素を、カンマ区切りでスカラーにしたいのですがどのような方法がありますでしょうか? ( "foo","bar","baz",) とあったとすると、 "foo,bar,baz" としたいです。 私が考えたのは、foreachでカンマ区切りで文字列結合をしていく方法ですが、他に方法があればと思い質問させていただきました。
478 :
デフォルトの名無しさん :2009/07/05(日) 16:44:13
Windows XPの端末からサーバに対してSSHで接続してコマンドを実行する Perlプログラムを作っているのですが、下記のようなエラーが出てうまく動きません。 Can't locate Net/SSH/Perl.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) test_ssh.pl内の「use Net::SSH::Perl;」の行でエラー出てます。 PPMを使ってNet-SSH(ver0.09)をインストールしてますが、何が悪いのか良く分かりません。。どなたかご教授願います。 ActivePerlはv5.10.0です。
>>477 ずばりjoin
print join(",", ("foo", "bar", "baz",));
481 :
デフォルトの名無しさん :2009/07/05(日) 16:57:09
配列のリファレンスを渡す関数があるのですが、スカラー値をスマートにその関数に渡す方法はありませんか。
483 :
477 :2009/07/05(日) 17:00:41
>>479 , 480
何か簡略した記法があるかと思い質問させていただいたのですが、まさにまんまの関数が用意されていたのですね・・。
助かりました。ありがとうございます。
>>481 スカラーを渡したら「要素数1の配列のリファレンス」とみなすってことか?
485 :
デフォルトの名無しさん :2009/07/05(日) 17:21:19
>>484 どうせつめいしたらいいのかわからないのですが、現在は
my @array = ( $scalar)
hoge( \@array);
とクッションをおいてわたしているのですが、スマートな方法はありませんか。
hoge([$scalar]);
>>481 よく分からんけど書いてみた
my $ref = [qw(foo bar)];
my $scl = 'hoge';
huga($ref);
huga($scl);
sub huga($){
my @ary;
ref $_[0] eq 'ARRAY' ? push @ary, @{$_[0]} : push @ary, $_[0];
print join ', ', @ary;
print "\n";
}
490 :
デフォルトの名無しさん :2009/07/05(日) 20:04:47
おまいらアンカー使い過ぎ
既出の問題なのですがぐぐってもわからなかったので質問させてください。 perlとMechanizeのバージョンを上げたところ内部でUTF-8に自動変換 されるようになったようでEUCで書かれたサイトからGETしても $mech->content()するとUTF-8にデーコードされた内容が返ってきます。 とりあえず一部応急処置的に「$mech->response->content()」 とやる事で受け取る側の処理は問題なくなったのですが $mech->field("hoge"=>"EUCコードの文字"); とやるとEUCコードがUTF-8に変換されて自動送信され 相手側の方で文字化けした状態で表示されます。 UTF-8ではなくEUCコードでPOST or GETしたいような場合はどのようにすればよいでしょうか?
493 :
デフォルトの名無しさん :2009/07/07(火) 19:43:25
リファレンスの先も含めて、変数が配列かスカラーかハッシュかを調べる方法はありませんか?
ref
495 :
デフォルトの名無しさん :2009/07/08(水) 10:59:03
CGIの制作を行おうと思っているのですが、ファイルのコピーについてわからないことがあります。 サンプルスクリプトを見ていると、画像のアップロードを行った後にFile::Copyにてファイルをディレクトリにコピーしているのですが、コピーしているということは元ファイルがあるのでしょうか? それともCGIの引数で渡されたものが、メモリに格納されているだけでディスク上にはなく、メモリからコピーしていると考えていいのでしょうか?
モジュールが標準モジュールか、自分でいれたモジュールかを調べる方法はないでしょうか?perldocを見てみたのですが、そのような記載はないようでした。 また、perldocに振られている番号の割り当てを調べたのですが、一覧がありませんでした。 番号の一覧を書いているサイトはありませんでしょうか。
new CGI されて生成されたオブジェクト周辺の ファイル出力を見てみ
インストール直後のディレクトリを走査しときゃいいんじゃない?
>>495 File::Copyはファイルからファイルにコピーしかしないので、
そこに到達する前のどこかでファイルに書いているんだろう。
例えば標準のCGIモジュール使ってたら自動的にやってくれる。
>>496 Module::CoreList使うのは?
501 :
496 :2009/07/08(水) 11:59:03
>>498 , 500
ありがとうございます。
私が行いたいことを書いてなかったので、うまく説明ができていなかったようですので、さいど書き込みをさせていただきます。
私が行いたいことは、現在Perlを利用したプログラムを作成しているのですが、あるモジュールがどのバージョンから標準モジュールとして取り入れられているかがしりたいです。
これは、そのプログラムの動作環境としてPerl単体のバージョンの表記を行いたいためにかんがています。
どのバージョンからコアモジュールになったか調べられる Module::CoreListがコアモジュールになったのはPerl5.8.9からです。
503 :
デフォルトの名無しさん :2009/07/09(木) 02:41:19
ABCDEFGHI・・・・ と表示させたいので for(65..90){ my $i = sprintf "%X", $_; print "\x"."$i"; } としてみたのですが、 [NULL]41[NULL]42[NULL]43・・・・・ と表示されてしまいます。(\xと数字がペアになってくれない) 何か良い方法はありませんか?
for(65..90){ print pack 'C',$_; }
print chr for (65..90);
print chr for 65..90;
処理速度を速くするテクニックにはインライン展開以外になにがありますか?
最適化でググれ
>>507 まずはプロファイラでどこに時間がかかってるか調べること。
話はそれからだ。
>>513 相対性理論によると、移動中の物体を地表から観測すると移動中の物体は
時間がゆっくり進んでいるように見えるはずだが。
>>508-510 うは…手厳しい…
ガチでシステムの処理速度を改善しようってわけではなく、
とりあえず最適化ってやつの練習をしてみようと思いたった次第です
自作セッション管理モジュールで実験したところそれなりに高速化できたと思われるので、
更なる高速化を目指し、インライン展開以外に何か劇的に改善するためのポピュラーな手法がないのかなと…
それは距離間も関係する 500m 先を 300km で走る新幹線よりも 1m 先を 100km で走る自動車の方が速い
Perlのコードを手動でインライニングしてんの? ただのアホだろ
ベンチ取りながら地道にいじってみるとか。
ラクダ本の24章Perlの常識はオススメ。
うちのラクダ本2nd Edition(´・ω・`)
>>515 おそらくあなたの書くコードは、インライン展開なぞするまえに
やるべきことが100くらいあるはず。
>>507 インライン展開すると速くなるってのは自分で調べたの?
winのactiveperlで、 文字列をバイナリで読み込んで、 $str =~ /[\x00-\x1f]/ という表示できなさそうな文字チェックをした時に、 \x1a を含んだ文字列がしれっとパスしてしまいますが、何故ですか
>>518 ありがとうございます
とりあえずやってみてます
mapのほうがforeachより速かったのはビックリでした
>>519 やっぱりラクダ本は必要ですか。。。
Perl6のが出るまで我慢しようかと思ってましたが。。。
>>522 そうです
どこかで聞きかじってはいたんですが、具体的にどうすれば展開されるかは調べるまで知りませんでした
>>524 その文字列をバイナリダンプしたら、含まれてる筈の\x1aが無かったりしないか?
とりあえず再現コードくらいは書け。
>しれっとパス 他人にもわかるように書けよ
>>524 なんかのミスだろ。Perlは0x1Aを特別視しないし。
#!/usr/bin/perl
$str1 = "123". chr(0x1a);
$str2 = "123";
print "str1 has 0x1a\n" if $str1 =~ /[\x00-\x1f]/;
print "str2 has 0x1a\n" if $str2 =~ /[\x00-\x1f]/;
__END__
% perl test.pl
str1 has 0x1a
_
あれ 現象だけを抽出したサンプルを書こうとすると、ちゃんと動く 多分、getc 周りだったんだと思う
>>530 > 現象だけを抽出したサンプルを書こうとすると、ちゃんと動く
それは質問する前に最低限しておくべきことだろ。
自分は正しいと思う心が原因不明のバグの一番の発生源だからな。
>>529 うちも問題なく動いた
% cat > a.pl
#!/usr/bin/perl
$str1 = "123". chr(0x1a);
$str2 = "123";
print "str1 has 0x1a\n" if $str1 =~ /[\x00-\x1f]/;
print "str2 has 0x1a\n" if $str2 =~ /[\x00-\x1f]/;
__END__
^C
% perl a.pl
str1 has 0x1a
どうでもいいけど ^C じゃなくて ^D 使おうな
535 :
デフォルトの名無しさん :2009/07/11(土) 14:10:03
で、Perlで複数のファイルから参照する変数をひとつのファイルにまとめる場合、どうするのがいいの。
>>535 よく分からんけどモジュール化して使うとこで use してやればいいんじゃないかな
>>536 だな。簡単なコード書いてみた
#---------------------- main.pl
use strict;
use MyData;
print "$scalar\n";
print "@array\n";
print "@{[%hash]}\n";
#--------------------- MyData.pm
package MyData;
use strict;
use Exporter;
our @ISA = qw(Exporter);
our $scalar = 1;
our @array = (1 .. 5);
our %hash = (foo=>6, bar=>7);
our @EXPORT = qw($scalar @array %hash);
1;
538 :
デフォルトの名無しさん :2009/07/11(土) 19:34:54
他にないの。 変数が数十になると、めんどいじゃないか。
なんでそんな変数ばかり公開する必要があるんだ
なんだ、前にこんな楽しいやりとりがあったのか
ていうか、
>>209 で答が出てるじゃん
こういうのは、フツーの方法を使っとけばいいんだよね
>>538 ハッシュにして渡せばそんなにたくさん渡さなくていい上にグローバルな変数だってことが一目瞭然
とゆうことは変数を設定するコードを書かなくても変数が設定されるよなコードを書けばいいんだな? wizardでも難しいぞこれ
>>232 でプロの方が教えてくれてるじゃん。
現行スレの過去レスくらい読めよ
@ISA アイサってなにさ、とずっと思ってた。イズアだったのか
最初に思いついた答えにしがみつき、他の可能性を考えもしない > バグ生成機
長い処理を fork するってのは有効な手段だとは思いますが、 fork したプロセスが正常に終わったのかとか、まだ起動中なのかとか、 調べるための手段ってあるんですか? 手前の日記スクリプトで検索の機能付けたんですが、現状2000ほどの テキストファイルを総スキャンして検索するとタイムアウトが起きてしまいます。 なので今は投稿したエントリを検索用の1つのファイルにまとめて逃げては 居ますが、この現状を打破したいと考え、その前段階として fork にて伺いました。
>>547 基本的にはwaitすれば子プロセスの終了コードが$?に入る
でもシグナルの設定とかいろいろ面倒なこともあるから、
perldocでperlipcを読みながらちょっとずつ練習するといい
549 :
548 :2009/07/14(火) 14:25:04
>>547 まさか2000のファイルを総スキャンてレンタルサーバでのな話?
だったら無謀なのでやめれ。ファイルスキャンはIO負荷が高すぎ
自分のマシンでならご自由に
>>548 perlipc っていうキーワードを元にあっちゃこっちゃうろついてみます m(_ _)m
自鯖です
P!!! 1GHz ってのも、なかなか辛くなってまいりました orz
素直に DB にぶちこんだほうがいいんですかね・・・
ただ 512MB のマシンに DB とか自滅するようなもんだし困ったもんですw
>>550 > 素直に DB にぶちこんだほうがいいんですかね・・・
全文検索エンジンインストールすればいいだけだろ。
っていうけど車輪の再発明せずにどうやってスキルをあげると言うんだ
車輪を観察するんだ
>>553 なにも車輪を再開発しなくても、車輪を実現した考え方を盗めばいい。
>>553 車輪をばらしてもっかい組み立てるんだよ。
再開発もいい勉強にはなるが、結果には繋がらない。
既存の車輪を見て愕然とするのが落ち。
車輪の再開発は有効 それすらやらないやつほどイレギュラーに弱い
仕事ならなにやってんだよってとこだが、勉強なら大いにやるべきだな。 やっぱり手を動かしてから見ると理解の深さが違うしね。
車輪の再開発と車輪の再発明を混同するやつは優秀なバグ生成者
>>559 プログラマは一語一句を正確に読みとってこそだというのはその通りだが、
しかし、「開発」と「発明」の違いがわかっていないバカもいるぜ。
と自演
さーて 今日もPerlで発明するか
さーて 今日もPerlを発明するか
565 :
デフォルトの名無しさん :2009/07/15(水) 15:45:02
なにこのスレ
@INCについて質問です。 @INCがどのように組み立てられるか知っている方がいたら教えてもらえますか。 perl本体をコンパイルした時に@INCが決まると思うのですが、以下のようにコンパイルしたところ、 $ sh Configure -des \ -Dcc='gcc' \ -Doptimize='-O2' \ -Dinc_version_list=none \ -Dcf_email='root@localhost' \ -Dperladmin='root@localhost' \ -Dotherlibdirs=/usr/local/lib/perl5/i686-linux:/usr/local/lib/perl5 @INCの中に2重で読み込まれるpathが出てきました $ ./perl -e 'print join "\n", @INC' /usr/local/lib/perl5/5.10.0/i686-linux /usr/local/lib/perl5/5.10.0 /usr/local/lib/perl5/site_perl/5.10.0/i686-linux /usr/local/lib/perl5/site_perl/5.10.0 /usr/local/lib/perl5/i686-linux /usr/local/lib/perl5/5.10.0/i686-linux /usr/local/lib/perl5/5.10.0 /usr/local/lib/perl5 . # 以下の2つが重複しています。 /usr/local/lib/perl5/5.10.0/i686-linux /usr/local/lib/perl5/5.10.0 で、既にインストール済みのperl5.10.0が同じ@INCなのでこれを読み込んでいるのかな? と想像しているのですが、実際にどういう動きをしているのかわからないので質問しました。 重複しないようにコンパイルする方法はありますでしょうか? というか、そもそも何で重複したのかがわからないのです。
あるディレクトリにperlスクリプトファイルとそれ以外のテキストファイルなどが混在しています。 ファイルの先頭行が #! /usr/bin/perl で始まるファイルにだけ実行属性を付与(chmod +x)したいのですが、良い方法はありますか?
>>567 perl -e '<>; `chmod +x $0` if qr(^#!/usr/bin/perl);' *
とか?動くかしらんけど。
>>569 残念ながらうまくいきませんでした。が、とても参考になりました。後は自力でなんとかなりそうです。ありがとうございました。
perlのソースだからってperlでやらなくてもw
572 :
566 :2009/07/15(水) 17:41:30
/usr/local/lib/perl5/5.10.0/i686-linux /usr/local/lib/perl5/5.10.0 が@INCに重複する件ですが、この2つのディレクトリが存在する時に起こるみたいです 2つのディレクトリを消して実行してみると@INCは重複しておらず、 mkdirで空のディレクトリを作成すると@INCが重複してしまう。 どういう仕組みになってるのかわからなくて気持ち悪いのと、何で中途半端な順番で重複するのかというのと。。
ソースを読まずに仕様を突き止めるクイズでもやってるの?
my ($tmpDATE, $tmpKEN, $tmpHALL, $tmpTICKET, $tmpPROGRESS, $tmpMEMBER, $tmpNOTE) = split(/\t/, $line); たとえばこんな感じで split した際に、$tmpHALL が空だった場合に '-' を入れておくような感じにできますか? 今は強引に $tmpHALL = '-' if !$tmpHALL; $tmpNOTE = '-' if !$tmpNOTE; とかやってます orz
これでちょっと楽になるかな? my ($tmpDate, …略…) = map { ($_ eq "") ? "-" : $_ } split(/\t/, $line); データに"0"がないことが確実なら … map { $_ || "-" } … でもいいけど、たいてい"0"が入ってきて破綻するw
あ〜、なるほど。そういう書き方か。 データには 0 は 100% 無いので、この書き方使わせてもらいます m(_ _)m
perl6の//演算子があれば楽なんだけどね
そんなものないが、単に\Q...\Eで囲えばいい。
quotemeta
× 5.8.10 ○ 5.10.0 だな、すまん
最初の設計の段階で、 なんで '0' を通しちゃう仕様にしたんだろうな
その疑問より、なんでいまだにPerl使いつづけてるんだろうな? という 疑問の方が、より妥当。
trueとfalseとして、'1'と'0'が使えることにあんまりメリットを感じない
>>586 正直それは思う。
なんか古い馴染みのスナックみたいだな。いまさら別の店に浮気すんのもアレだし。
でもPerl6が出たら、Pythonに乗り換えようかなw
もう何をやるにもオブジェクト指向だから、 どうせ何を使ってもそこそこ面倒くさい
>>585 0をfalseにしないと、数値コンテキストで偽がなくなっちゃうから。
そして'0'を偽にしても、ファイルの末尾が0で終わって改行がないという
特殊な場合以外、発生しうる問題は全て回避可能だとLarry Wallが判断したから。
>>586 PHPが腐りかけのミカンみたいになってきてる上、
PerlはCatalystとMooseが来てCPANが異常に充実してきてるので、
Webプログラミング界隈はいずれPerlに再移行すると読んでるのだが。
ここんとこPerl関連のコミュニティもなんかやたら熱いし。
アフォでもコーディング出来てアフォでも高速に動かせる仕組みが無いと Perlに回帰することは無いよ
改行コードの0x0Aだけを使いたいのだけど win版じゃ無理?外部ファイルから読み込んでも0D0Aになってしまう
数値コンテキストで偽がなくなると困るの?
今さらなくなったら困るだろ while (--$count) { ... } とかを while (--$count != 0) { ... } みたいに書き換えなきゃならない
ああ、それは確かに困る 「ゼロになるまで」はループの基本だしな
その条件ならfor使うかなあ、俺
カウンタは増えたり減ったりするから、for では書けないな
>>599 for( $count = 10; $count > 0; $count--){}
for( $count = 0; $count < 10; $count++){}
で何か問題あるのか?
>>598 はforeachの略じゃないと思うぞ
perlのforとforeachは同じだろうが
そ ん な か っ た る い こ と い ま さ ら で き る か よ !
その条件ならjavaに乗り換えるかなあ、俺
その条件ならドットネットwに乗り換えるかなあ、俺
その条件ならCOBOL(死語)に乗り換えるかなあ、俺
foreachって書いたことないな
>>599 for (1..$loopcount) で間に合う場面も多いだろ。
ループ中にループ変数が不規則な変化をするような場合には使えないけど。
print foreach(@array); とかしない?
>>607 だから増えたり減ったりって書いてあるだろ
>>608 print for(@array);
ならする
print foreach 0..9; とか for my $i (0..9) { print $i } とか foreach ($i = 0; $i < 10; $i++) { print $i } って動くんだw
print for (@ary); って print @ary; とどう違うの?
$,とか$\
open(F,"text"); print <F>; print <F>; print <F>; 2回目以降何も表示されないのだれけど毎回openしないとだめなの? 変数代入せずにprintしたいんだけど
一回目でEOFになるからな
my @arr = <F>;
cpanからのインストールについて教えてください。 cpanからXML:RSSをインストールしたが、いざuse XML::RSSを使うと、 Can't locate XML/RSS.pm in @INCとエラーになる。 じゃあインストールされていないのかと >cpan i /XML:RSS/で調べると、 モジュールの一覧が出てくるのでインストールは出来ているみたい。 ただしperldoc XML::RSSで調べるとNo documentation found for "XML::RSS". と出るので、何らか問題はあるみたい。 どうしたらいいでしょうか?
>>618 なぜそういう事態に至っているのか調べる
モジュール一覧にインストールされている事を示す記号がついていないというオチだろうな。
\0って0x00じゃないの? 0x00はどうやtって出すの?
自己解決しました スミマセン。
623 :
598 :2009/07/18(土) 18:02:55
forとforeachは何となく使い分けてるなあ。 やってることは同じだし、Perlの美学からは外れてるかもしれないけど。 >599 カウンタがループ中でも増減するという状況なら、 自分も while を使うかもしれない
foreachを使ったことがない
ぐちゃみそparser言語の筆頭たるPerlにしては、珍しく冗長な記述だから 気になるんだよね>forとforeach
「forでもforeachでもどっちでもいいっす」というぐだぐだこそPerlの真髄
初歩的な質問なんですが、 perlで組んだプログラムはhttpサーバーを通さないと動かせないの?
httpアプリならhttpサーバを通さないと動かない。 httpじゃ無いアプリならhttpサーバを通さなくても動く。
>>628 テストコードもろくに書かない主義ですか。
>>630 おいおい・・・・
いまどきコード書いてはブラウザリロードして開発してるわけ?
その分じゃ開発手法もレガシーだろうから、相当工数損してるな。
ねぇ、なんでそんなことでマジレスしてんの?
>>629 その「テストコード」とやらは、httpアプリなの?
>>632 perl ならその程度のテストが一番お似合いだとおもうけど。
>>635 おまえは死ぬまでブラウザリロードしてろw
すんません、教えてください。 ブラウザでリロードする以外に、どんな開発手法がありますか? あと、「perlとはCGIなり、CGIとはperlなり。perlとはCGIの代名詞である」 って認識で合ってますよね?
>>637 合ってるような合ってないような
今時のPerlは、mod_perlプログラミングだから。
mod_perlがあることで、PHPに対して優位性を保ってると言える。
テストコード云々の話は、ブラウザで結果を確認しなくてもいいような
ドライバのようなもの作るという話でしょ。PerlやWebに限った話でもない。
>>636 オートリロードしてくれるように設定できるの知ってる?
>>640 マジックコード埋め込んでテスト楽になったと喜んでたら、
そのままリリースして、リロード繰り返すページになってしまって顰蹙、
という話ですね。わかります。
だめだこりゃ
>あと、「perlとはCGIなり、CGIとはperlなり。perlとはCGIの代名詞である」 >って認識で合ってますよね? ⊂ミ⊃^ω^)アウアウ
コナミコマンドですね わかります
お前はあまりにもわかりすぎる。
mod_perl もCGIだコノヤロー!
Perlスクリプトが$ENV{HTTP_REFERER}を期待していた場合、そのPerlスクリプトは、 CGIに依存してる。 use CGI;はCGIに依存してる。
>>634 モジュールを叩くCLIだろjk。
>>637 CLIでデバッグ
Catalystで言うscript/app_server.plなどで動作チェック。
t/*.tでロジックに瑕疵がないかチェック
完成したなと思ったらhttpd+ブラウザで連結テスト。
Apacheとブラウザリロードで開発してるとかいう奴はServerError出たらどうしてんの?
Apacheのログわざわざ見るわけ?malformed headerとか出てたらどーすんの?
原因がSQLエラーだったら今度はsqllog見るわけ?
泣けてくるな。いつの時代だよ。
> あと、「perlとはCGIなり、CGIとはperlなり。perlとはCGIの代名詞である」
PerlはPHPと違ってWebプログラミング言語ではないよ。親和性が高かっただけ。
あとCGIとは何かWikipediaでも何でもいいから勉強しなされ。
>>647 > Perlスクリプトが$ENV{HTTP_REFERER}を期待していた場合、そのPerlスクリプトは、
> CGIに依存してる。
え?REFERERは元々ブラウザのオレオレ実装だろ。
ttp://hoohoo.ncsa.illinois.edu/cgi/env.html
PerlがCGIの代名詞なのは、まあいいかなと思う自分がいる。 最近CUIツールにしか使ってないけど。
>>648 > In addition to these, the header lines received from the client, if any,
> are placed into the environment with the prefix HTTP_ followed by the header name.
> Apacheとブラウザリロードで開発してるとかいう奴はServerError出たらどうしてんの? > Apacheのログわざわざ見るわけ?malformed headerとか出てたらどーすんの? use CGI::Carp qw(fatalsToBrowser); > 原因がSQLエラーだったら今度はsqllog見るわけ? use DBI; use DBD::***; my $dbh = DBI->connect("……") or die $DBI::errstr; $dbh->prepare($sql_euc); die $dbh->errstr if $dbh->errstr; これでそのとき投げたSQLとともにエラーがブラウザ上から見えます。 もっとも動かす前に perl -wc しとくのがいいけど、実行時エラーはわからないから。 いきなりサーバで動かすと、うっかり無限ループになってあわててsshでログインして プロセス殺したこともあるけどorz
板違いだろうが。お前等全員池沼か?
perl は sed の発展系と思っているオレは異常か?
>>654 元々がawkの代替で、その後sedだのCだのshだののいいとこどりした言語だからな。
>>652 それなりに工夫はしてるわけだ。
例えば1つモジュールをいじったら、波及するページを
全部表示させて毎回連結テストしてるわけ?
>>648 >CLIでデバッグ
perl を .NET でデバッグできるんですか。知らなかった。
もう少し調べてみます。ありがとう。
>完成したなと思ったらhttpd+ブラウザで連結テスト。
でも結局は httpd で実行してブラウザでリロードしてんじゃんwww
>>627 >perlで組んだプログラムはhttpサーバーを通さないと動かせないの?
ま、それが正しいってことだな。
659 :
デフォルトの名無しさん :2009/07/19(日) 13:11:35
UTF-8の旧字をISO-2022-JPに変換したい。どうやったら変換できるの? 以下はエラーします。 #!/usr/bin/perl use Encode ; my $char = "" ; Encode::from_to($name,"utf8","euc-jp",Encode::FB_XMLCREF ) ; print $char ;
なぜ"euc-jp"なのw
661 :
デフォルトの名無しさん :2009/07/19(日) 13:17:54
>>659 訂正。エラーってのは日本語のミスです。コードが出ます。
あと6行目の$nameは$charの間違いm(_o_)m
662 :
デフォルトの名無しさん :2009/07/19(日) 13:19:26
>>660 すまん。いろいろ試行錯誤している途中のものを出してしまいました。
6行目は以下ですm(_o_)m
Encode::from_to($char,"utf8","iso-2022-jp",Encode::FB_XMLCREF ) ;
ソースコードを utf8 で保存してないとか?
664 :
デフォルトの名無しさん :2009/07/19(日) 13:46:33
from_toはencode/decodeの組み合わせと同じらしいから、 とりあえずencode/decodeがちゃんと動いてるか確認してみては use Encode ; my $utf8 = sprintf("%c%c%c", 0xE3, 0x81, 0x82); # UTF-8で"あ", 適当に変えてみて my $octet = Encode::decode("utf8", $utf8); # 内部コード。たぶんUTF-8と同じ my $sjis = Encode::encode("sjis", $octet); my $eucjp = Encode::encode("euc-jp", $octet); my $iso2022 = Encode::encode("iso-2022-jp", $octet); print "utf8: ", unpack("H*", $utf8), "\n"; # e38182 print "octet: ", unpack("H*", $octet), "\n"; # e38182 print "sjis: ", unpack("H*", $sjis), "\n"; # 82a0 print "eucjp: ", unpack("H*", $eucjp), "\n"; # a4a2 print "iso2022: ", unpack("H*", $iso2022), "\n"; # 1b244224221b2842
>>659 その字って、JIS X 0208にもJIS X 0212にも含まれてない文字なのでは?
自分なら(JIS X 0113に対応している)NKF ver2.0.7以降に投げて変換してもらう。
もしかしたらEncode::JIS2Kモジュールが使えるかも。
>>648 > PerlはPHPと違ってWebプログラミング言語ではないよ。親和性が高かっただけ。
ちがうな。あのタイミングで他に適切なのが無かっただけだ。
へぇ〜 PerlはWebプログラミング言語ですか、そうですか。
また読解力の無い奴が恥かきに来たな。
> Perlは〜ではない > ちがうな 否定の否定、つまり肯定だよな。 どう考えても、「PerlはWebプログラミング言語ですぅ!」とほざいてるキチガイにしか見えない。
邪魔
「「Web言語ではない」かつ「Webとの親和性が高い」」の否定は
「「Web言語である」または「Webとの親和性が高くない」」だ
つまり「Webとの親和性が高くない」が
>>668 の真意であるなら
「Web言語である」という命題はおまえの存在と同じぐらいどうでもいい
小学生並の読解力を披露したあと何をどう言い繕えば格好が付くか、 必死に考えた結果がその駄文すか。
ppppppppppとか aaaaaaaaaaみたいに 同じ文字が10個続いてるのにマッチする 正規表現を教えてくださいな
p{10}
すいません… aaaaaaaaaaにもbbbbbbbbbbにも!!!!!!!!!!にも マッチするやつが欲しかったんです
後方参照使うしかないな
(.)\1{9}でとりあえず動くかな。何か変だが。
>>657 お前その思考回路と読解力でプログラム書けるのか?
用語はググれ。完全に世に遅れを取ってるぞ。
つーか.NETがどーのっていちゃもん自体ググって調べたんじゃないか?
その知識のなさを見ると。
> でも結局は httpd で実行してブラウザでリロードしてんじゃんwww
Webアプリケーション作ってるのにWebで確認しないアホがいるか。
しかしテストにリロードは原則不要だ。
>>perlで組んだプログラムはhttpサーバーを通さないと動かせないの?
> ま、それが正しいってことだな。
CGIスクリプトなんかはコマンドラインから起動するとそっちのモードに切り替わるように
設計しないか普通?俺はめっきりCGIスクリプト書かなくなったから良く覚えてないけど、
use CGIしたら自動的にそうなったりしなかったっけ?
知らないならレスしないでください
>>682 分かったよ調べたよ。
use CGI qw(-debug);
でコマンドラインから実行できる。これで文句ないだろ?
タイムスタンプ見ればわかると思うが30秒で調べてレスまで書けるような ごく簡単なことなんだがな・・・。お前ら大丈夫?
じゃぁ、まとめる。 質問: perlで組んだプログラムはhttpサーバーを通さないと動かせないの? こたえ: コマンドラインから実行できる 満足かい? おまいら一生、コマンドラインで動く掲示板、コマンドラインで動くショッピングカートで 遊んでな!
686 :
デフォルトの名無しさん :2009/07/20(月) 14:49:58
>>665 ,666,667
ありがとう。
nkf --oc=ISO-2022-JP-1 で所望の変換をしてくれるようです。
Perlではこれに相当するライブラリは無いってことですかね。以下では
変換できずにコードが出力されてしまいました。
Encode::from_to($char,"utf8","iso-2022-jp-1",Encode::FB_XMLCREF ) ;
ちなみに665の実行結果は以下です。
utf8: efa79c
octet: dc
sjis: 3f
eucjp: 3f
iso2022: 3f
結局さ、汎用のライブラリを使うと、こういうときに困っちゃうんだよな。 ライブラリの作成者がメンテナンスを放置しちゃうと。 プログラミングの経験の浅い人は、ナニがなんだかわからない現象に悩まされる。 ライブラリを信用しきっちゃってるからな。
かと言って自力で作ろうとすると、車輪の再開発は無駄とか言われるんだぜ?
それはたぶん情報が瞬時に伝わるみたいな仮説を前提とした理論上では無駄だってこと
目的とした動作をするライブラリが無いのなら、 再発明でも再開発でもないだろう。
再開発と再発明の区別がつけられない奴は優秀なバグクリエータ
汎用のライブラリを自分で修正すると言う発想が出てこないところが怖い。
はっきり言って、CGI.pmとEncode.pm周りはいじりたくない。
発明は「発見して明らかにすること」なのだから、プログラムに関しては 「再発明」ってのは無いだろうw その時点で再発明とか言ってる時点でアレ
「車輪の再発明」とその言葉の使い方から解説しないといかんのか?
多分おまえが言おうとしてることは再開発
えと、お前ら語源知らないわけ? reinvent the wheelの訳語だから、「車輪の再発明」の方が正しい。 存在しないと思って新たに作っちゃってるつもりの状態を再発明と表現したんだろ。 一応常套句だから、「車輪の再開発」はいいまつがいかもじり。 あると分かっていて、ソースの汚さや遅さや、単に後学のためにわざと再開発することはある。
699 :
696 :2009/07/20(月) 17:36:23
俺か? "reinventing the wheel" 日本語訳は「車輪の再発明」。 同じ技術や同じ物が作られるときに、比喩として使われる慣用句だな。 慣用句に突っ込まれても困るわけだが。 と、書いてたら出遅れた。
wikipedia 大活躍wwwwwww
701 :
696 :2009/07/20(月) 18:08:55
おまえがwikipedia駆使のクセにwwwwww
よく話がループしますよね。
Strawberry PerlでPPM使うときに設定とかっている? どうみてもsite/libにファイルが増えてない・・・
>>700 車輪の再発明は語源も含めてらくだ本に何度も出てくるだろ・・・。
なんつーレベルの低いスレだよ。
まっかw
何をやっても「再発明」と冷たく言われる最近の若者哀れ
711 :
デフォルトの名無しさん :2009/07/21(火) 02:10:00
CGIを作っているのですが、<input type="file" name="file">の扱いがよくわかりません。 ファイルが入力されているかいないかの判別を、definedで判別できるかと思ったのですが、 $cgi = new CGI; if( defined( $cgi->param( "cgi"))) {} これだと、いつもifの中にはいってしまいます。 わたしが謝ったコードを書いているのでしょうか? 今は、 if( 4 < length( $cgi->param( "cgi"))) で処理していますが、通常はどのような条件分岐を行うのでしょうか? (上記の条件分岐は、ファイルをzipファイルをアップロード対象としているため、拡張子の分のファイル名を4文字と考えています。
>>712 ありがとうございます。
defined等の関数の知識が足りていないのかと思いこちらに書き込みをさせていただいたのですが、
ご指摘いただきましたので、移動させていただきます。
自分のIPを調べて$hostに入れるにはどうすればいいですか?
ルーターやら絡んでわからない時は Dynamic DNSのサイトから取ってたな もっといい方法があるんだろうな
ローカルIPアドレスなら use Sys::Hostname; my $ipaddress = join(".",unpack("C4",gethostbyname(hostname()))); print "$ipaddress\n";
my $str = `ifconfig eth0 |grep "inet addr:"`; $str =~ s/addr:(.+)\s?//; my $host = $1;
$1を空にするには
720 :
719 :2009/07/22(水) 20:47:09
解決しました
LWPつかってmixiをブログシステムのように扱えますか?
722 :
721 :2009/07/22(水) 20:51:02
解決しました
723 :
デフォルトの名無しさん :2009/07/22(水) 20:52:58
__DATA__を2個以上作りt(ry
724 :
723 :2009/07/22(水) 20:54:04
解決しました
Perlのインデント幅って推奨値はありますか。
4
4といわれているが,実際は2でも8でもいい。
>>727 Tabにしとけ。
相手が勝手に好きな隙間にするから。
Perlでは my $var1, $var2, $var3; というふうに書けないんでしたっけ。 my $var1; my $var2; my $var3; と書くしかない?
my ($var1, $var2, $var3);
局所化された変数ならば、、、 my %var = ( '1', "なんたら", # なんたら '2', "かんたら", # かんたら '3', "ちんたら", # ちんたら ); と描きたくなる衝動が。。。
my $found; for my $x (@list) { if ($x eq 'foobar') { $found = $x; last; } } というコードを、よりかっこよく書く方法があれば教えてください。 ちなみにRubyなら found = list.find {|x| x == 'foobar' } だそうです
package Foo; sub f { print "f()¥n"; } sub g { print "g()¥n"; } というのがあったとして、これを使う時は use Foo; Foo::f(); Foo::g(); のようにして使いますよね。 これを、Foo::f()ではなくf()だけで使えるようにするにはどうしたらいいでしょうか。 よろしくお願いします。
for (@list) { $_ eq 'foobar' && $found = $_ && last }
>>735 初めに見つけたら抜ければいいの?正しい挙動がよくわからないけど、
use List::Util qw( first );
my $found = first { $_ eq 'foobar' } @list;
かなぁ?
それバカっぽい。何かのオブジェクト指向言語の猿マネ。
>>739 あれ、パッケージって必ずインスタンスオブジェクトにしないといけないんでしたっけ?
単に名前空間として使いたいだけだったんですが。
#そして、その名前空間を一部破りたいというだけの話なんですけど。
>>741 Exporter使えばできるけど、それはきもいから今はあまりやらない。
>>736 #!/usr/bin/perl
package Foo;
f();
g();
__END__
>>735 for $found (@list) {/^foobar$/ and last}
だと動かないんだよなぁ。
>>739 $foo::bar()を使わないって・・・。
>>740 お前Exporter使ってるモジュール使用禁止な。
>>741 キモチワルイ方法でよければこういう手もある。
Foo.pm
=============
#!/usr/bin/perl
package Foo;
sub f{print "f()\n";}
sub g{print "g()\n";}
package main;
sub AUTOLOAD {
our $AUTOLOAD;
$AUTOLOAD =~ s/.*:://g;
eval("Foo::$AUTOLOAD()") if eval(qq(exists &Foo::$AUTOLOAD));
}
1;
__EOF__
>>736 じゃあ俺もキモイ方法。use Foo;さえいらない
use strict;
f();
g();
exit;
package Foo;
sub f { print "f()\n"; }
sub g { print "g()\n"; }
BEGIN { *::f = \&f; *::g = \&g; }
>>742-745 すみません、みなさんのやり方がさっぱり理解できないです。
やりたいことをもう一度整理します。
まずすでにFoo/Bar.pmというファイルがあり、こんな内容になっています。
これは変更することはできません。
package Foo::Bar;
sub f { ... }
sub g { ... }
sub h { ... }
そして、手元のスクリプトでやりたいのは、パッケージ名をつけずにf()やg()を使いたいということです。
ここで、Foo::Bar以下のすべての関数ではなく、指定した関数だけを使いたいんですが、できますか。
(ここでpackage Foo::Barとするとすべての関数が対象となるので好ましくない)
use Foo::Bar;
f();
g();
もしPythonをご存知の方がいれば、from pacakge import f, g ということがやりたい、といえばわかってもらえるでしょうか。
いいからExporter使えカス
>>746 > from pacakge import f, g
use Foo qw(f g);
みたいにしたいならExporter使うのが正道。
Exporterキモチワルイとか言ってる奴はほっとけ。
Exporter perl export_ok辺りでググればサンプルと解説が
出てくるはずだから。
>>748 どうもありがとうございます。
でもこの方法だと、Exporterを使うようにFoo/Bar.pmを変更しないといけないんですよね。
今回はそれができないんです。困った。
Pythonだとパッケージ側では特になにもする必要がないんですけど、Perlだとパッケージ側でいろいろ準備が必要なんですね。
>>750 え、Bar/Foo.pmに手を加えずにインポートする方法ってあるの?
知らないんだけど。ドキュメントも読んだけど。ちなみに
>>749 ではない。
>>749 普通にFoo::Bar::f();じゃどういう風に都合が悪いんだ?
何を困ってるのか分からないとこっちが困る。
>>746 これでどう
use strict;
*main::f = \&Foo::Bar::f;
f();
exit;
package Foo::Bar;
sub f { print "f()\n"; }
sub g { print "g()\n"; }
>>752 長すぎて不便。
>>753 おお、これはすごい。関数へのポインタみたい。
ありがたく使わせて頂きます。どうもありがとうございました。
elsif が気持ちよくインデントできない
756 :
デフォルトの名無しさん :2009/07/24(金) 23:02:05
if(){ 〜 }elsif(){ 〜 }else{ 〜 } かな
eval { die("error message"); } if ($@) { print STDERR, $@; exit 1; } という処理を書いているんですが、エラーメッセージのうしろに at /usr/local/tmp/hoge.pm line 2 のようなのが付いてきます。 つまり $@ にファイル名と行番号が付いてくるわけですが、これを取り除くいい方法はありますか。 やはり正規表現でちまちま削除しなきゃいけないでしょうか。
Perlでは new ClassName(); ClassName->new(); のどちらでも書けるようですが、どちらで書いた方がいいのかわかりません。 どっちで書いてもいいのか、それともPerlとしてはどちらか一方がお勧めだったりしますか?
>>757 perldoc -f die
に書いてある
>die LIST
>…中略…
>If the last element of LIST does not end in a newline, the
>current script line number and input line number (if any) are
>also printed, and a newline is supplied. …以下略
つまりエラーメッセージの最後に改行を付加すれば行番号などは付かない
>>757 eval {
die("error message\n");
} ;
if($@){
print STDERR $@;
exit 1;
}
>>758 newに限らず、Perlでクラスメソッドを呼ぶ基本的な記法は
MyClass->myfunc(引数); # 構文(1)
である。もうひとつの
myfunc MyClass(引数); # 構文(2)
というのは、Indirect Object Syntax(間接オブジェクト構文)と呼ばれる一種のシンタクスシュガーである。
perldoc perlobjによれば、構文(2)を使うとPerlのパーサが困る場合があるらしい。
もちろん普通に new Class(); とか書いてるだけなら問題ないし、こっちの書き方もよく使われるので、
構文(2)にも慣れといたほうがいいとperldoc perlobjは言っている。
まあ、C++とかJavaのユーザーが、newに関して構文(2)を使いたがるのはしょうがないねw
>>762 $obj = new Class(); の構文でパーサが困ることは絶対ない。それは言いがかりだ。
別にC++やJava使いじゃなくても知る限りFile::IOなんかは
print $fh 'hello';
って書く人の方が多いね。別に
$fh->print('hello');
でも動くんだが、意外に知らない人が多くてワロタ。
package Hoge; use strict; $VAR = 1; sub f { print $VAR; } というパッケージを作ると Global symbol "$VAR" requires explicit package name at Hoge.pm line 3. Global symbol "$VAR" requires explicit package name at Hoge.pm line 5. Compilation failed in require at hoge.pl line 1. BEGIN failed--compilation aborted at hoge.pl line 1. というエラーがでます。$VARにパッケージ名がないということなので、 package Hoge; use strict; $Hoge::VAR = 1; sub f { print $Hoge::VAR; } とするとエラーは出なくなったのですが、いちいちパッケージ名をつけるのがだるいです。 なんかいい方法はないでしょうか。
その例に関して言えば、myつけりゃいいだけだが
>>767 ほんとだー
package Hoge;
use strict;
my $var = 1;
sub f {
print $var;
}
でいけました。ありがとうございます。
でも sub f の中から外のmy変数を参照できたのか。。。ちょっと不思議。
何が不思議なのかさっぱりわからん。
という事は、これ↓も「ちょっと不思議」なのか?(w my $var=1; foreach (@hoge) { print $var; }
そういう書き方をすると時々外部から関数を用いて外の変数をいじったときに値が変わらなくてハマることがあるなぁ あれは何でだろうか…
>>768 myのスコープ(いわゆるレキシカルスコープ)について
良く勉強しといた方がいい。思わぬところでコケるぞ。
myとlocalの違いを産業で説明できるようになるまでががれ。
>>771 ---- test.pl -----
#!/usr/bin/perl
my $a;
sub a{my($b) = @_ ; print $a += $b }
1;
----別ファイル($aのスコープ外)----
#!/usr/bin/perl
require 'test.pl';
package Foo; # パッケージも変えてみる
main::a(1);main::a(2);main::a(3);main::a(4);
何の問題も起きないが?多分スコープについて勘違いしてるだけだと思われ。
>>773 今自分でも検証してみた
勘違いはBEGINブロックで宣言した変数がパッケージ内で使えるということだったらしい
今思えばなぜそんな勘違いしたのか謎
yourをつけるとどうなる?
>>754 Foo::Bar::f()が長くて面倒だという理由で
>>753 で解決するとか本気でバカとしか思えないんだが。
単に面倒なだけなら
my $f = \&Foo::Bar::f;
しといて、
$f->();
すりゃいいだろ。
>>776 まあ
>>736 ,746,754のようなタイプに何いっても無駄
Exporter::import()だって結局
>>753 みたいなことやってるにすぎないしなw
馬鹿が馬鹿丸出しなコードを書けるのもPerlのいいところ
779 :
デフォルトの名無しさん :2009/07/27(月) 10:32:16
例えば
>>778 の書くソースは
どんな言語を使っても汚いように、
それはどんな言語も同じ
つ[適材適所]
(´・ω・`)
>>778 スパゲッティ−ソースもperlなら簡単お手軽に作れる、とか、
もうちょっと言葉を選べよw
783 :
デフォルトの名無しさん :2009/07/28(火) 01:47:21
こんばんは。 perlのテキスト処理について質問です。 [test.txt] yamada 10 tanabe 20 +40 yamasita 10 というtest.txtに対して行頭に+があるときは前の行に空白を入れて追加して out.txtというファイルを出力させたいのですがどうすればよいのでしょう。 [out.txt] yamada 10 tanabe 20 40 yamasita 10
実際に動作チェックはしてないけど、こんなかんじかな。 改行コードを空白に置換すればいい。 $unko =~ s/[\r\n]+\+/ +/gs;
>>782 オブ脳ないのにJavaで書かれたソースに比べれば
スパゲティの方がまだマシ。
my $last = '+'; while(<FILE>){ chomp; print "\n" if $last ~! /^\+/; print; $last = $_; } print "\n";
パッケージ内で、次のように変数を使っています。 $main::hoge1 = 'a'; $main::hoge2 = 'b'; ... この時、JavaScriptでいうwith()の様に、{ } で囲むスコープ内でのみ main:: を省略する書き方は出来ないでしょうか?
>>787 必要なとこだけpackageをmainに変えればいいはずだけど、
その根拠がperldocのどこに書いてあったか忘れたので、あくまでも参考ということで
use strict;
package main;
our ($foo, $bar);
hoge::func();
print "foo=$foo, bar=$bar\n";
exit;
package hoge;
sub func {
print "I'm in package ", __PACKAGE__, "\n"; #ここはまだhogeパッケージ
$main::foo = 'a';
package main;
print "I'm in package ", __PACKAGE__, "\n"; #ここからmainパッケージ
$bar = 'b';
}
789 :
788 :2009/07/28(火) 10:54:39
実際にやってみたら
>>788 できなかったw
というわけで次の回答者どうぞ
実行してみたら I'm in package hoge I'm in package main foo=a, bar=b となったから合ってんじゃねーの? どういう結果を期待してんだ?
なんでみんなそんなにパッケージ名省略したがるんだよ。 可読性落ちるだけだろjk。
確かに他人様のパッケージの中の変数をパッケージ名を省略したく なるぐらい参照しなければならないプログラムはどうかと思うな。
そのうち、 $obj = new; でFoo::Barクラスのインスタンスが作れないかって質問が来そうだ。
>>788-790 ありがとうございました。無事出来ました。
あと質問なんですが$obj = new;でFoo::Barクラスのインスタンスは作れないでしょうか。
あ、やっぱいいです。 ありがとうございました。
パッケージ使いまくるのもまたPerlの1つのやり方だし、そうなると 同じパッケージ名を何百回も書くのは記述性が落ちるどころか かえって可読性をも落とすだけだと思うんだ
>>795 前提と結論に整合性がない
論理的でおk
$vars = {'foo': 1, 'bar': 2} というのがあって、ある文字列が$varsのキーに含まれるかどうかを調べるにはどうしたらいいですか。 my $found = 0; for my $key (keys %$vars) { if ($key eq "foo") { $found = 1; break; } } print "found: $found¥n"; というのを短く書きたいです。
my $found = $vars->{foo} ? 1 : 0; でいいじゃん
$vars->{foo}が0である場合も考慮するなら、existsかdefined使ってね
値がundefである場合も考慮するとexists一択
exists $vars->{foo} でいけました。サンクスです。
関係ないけど、 $vars = {'foo': 1, 'bar': 2} こういう風に書けるんだね。知らなかった。
かけないし
なんだ かけないのか
evalするときに、ファイル名や行番号を指定することはできますか。 Rubyでは文字列をevalするときに、オプションとしてファイル名や行番号を指定できるのですが、 同じことをPerlでしたいので、方法があれば教えてください。 「perl eval ファイル名」でぐぐってもヒットしませんでした。
意味がわからん
808 :
805 :2009/07/29(水) 16:45:24
説明がまずくてすみませんでした。もう一度説明させてください。 たとえば、次のような「hoge.pl」というファイルがあるとします。 1: $s = <<END; 2: package Foo; 3: sub hello { 4: print "Hello¥n"; 5: } 6: END 7: 8: eval $s, 'Foo.pm', 1 これを実行すると、evalに渡した文字列が、ファイルFoo.pmの1行目から始まったものとして扱ってくれないかなということです。 この例だとevalはhoge.plの8行目ですが、もし$sの中にエラーがあると、hoge.plにエラーがあったと表示されるのではなく、 あたかもFoo.pmの中にエラーがあったかのようにエラーが表示されてほしいのです。
もういちどperl evalでぐぐるべきだな
>>809 おまえはもういちど質問の意味を考えるべき
>>808 #line?
例.
$s =<<END;
#line 200 "Foo.pm"
pacjage Foo; # <- このtypoは Foo.pm の 200行目のエラーになる
1;
END
eval $s or warn $@;
>>812 すごく怖いやつだから、逆らわない方がいい。
質問です。 テキスト(SJIS)で作成した16進データをバイナリに変換したいのですが、 $aaa = pack("H*", @hexdata); print OUTFILE $aaa ; みたいな形でやっても上手く行きません。 最大文字列制限とかあるのでしょうか?
SJIS
>>815 質問の仕方がヘタクソだな。それじゃ相手に伝わらない。
質問に的確に回答できないヤツって、すぐ 「なんでそんなことしたいの?」とかレス付けたがるんだよな。
>>819 いや。それは違うぞ。
どうしてそうしたいのか?が分かれば、的確な回答が出来る可能性がある
要件定義の鉄則。
>>815 とりあえずエスパーで、pack()の書式指定が違ってると言ってみよう
my @hex = ("7761", "6b61", "6e6e", "6169", "3e3c");
my $aaa = pack("(H4)*", @hex);
>>822 「俺はわかってる!」という根拠の無い自信に満ち溢れた学生さんが
ちょっと大きく出ちゃったんです。
824 :
デフォルトの名無しさん :2009/07/30(木) 01:13:18
望みなしだよ
>>813 はただの面白レスを狙った人だと思うが・・・
これを同一だと思うような人と飲みに行ったらつまんなそう
渇いた心にヒューモアを
#!/usr/bin/perl -w if ( $ARGV[0] eq "autoconf" ) { if (`/usr/bin/perl $0` eq "" ) { print "no\n"; exit 1; } else { print "yes\n"; exit 0; } } っていうスクリプトを、引数にautoconfを与えて実行すると Use of uninitialized value $ARGV[0] in string eq at ./sensirion line 2 と怒られます。最初の行で-wオプションを消すと怒られなくなりますが、 正しい対処法があれば教えてください。
「与えずに」の間違いじゃないか? if (@ARGV and $ARGV[0] eq 'autoconf')
>>831 Mooseについて知らなかったりコードをMVCのC(とV)にばっかり書いてるようなら
買うべき。
836 :
デフォルトの名無しさん :2009/07/31(金) 05:40:42
Perlでの質問です。 #!/usr/bin/perl sub func1{print "func1\n";} sub func2{print "func2\n";} sub func3{print "func3\n";} &func1; &func2; &func3; 上記を↓のようにしたいです for(my $i = 1;$i <= 3;$i++) { &func$i; } このままだとエラーになるのですが、 このような使い方は可能でしょうか?
837 :
836 :2009/07/31(金) 05:49:05
すいません自己解決しました。 for(my $i = 1;$i <= 3;$i++) { eval "&func$i"; } 上記でできました。
Perlなんて使われてない言語勉強してどうするんだよ?
最近は、小さい会社だと使われてないね
大きい会社でも使われてないね。
プログラミング言語の20や30使えて当たり前だと思うが...
842 :
デフォルトの名無しさん :2009/07/31(金) 10:09:44
>>837 それはセキュリティの穴になりやすいから気をつけて
mixi、livedoor、DeNAなんかはPerlがメインだな
>>840 大きい会社のことなんか知らない、零細企業の社員のくせにw
>>844 ははは。俺は大きい会社でも小さい会社でも天才プログラマーとして活躍したんだがな。お前らみたいのと一緒にするんじゃない。
>>836 配列使えよ。
@func = (
sub { print "func1\n"; },
sub { print "func2\n"; },
sub { print "func3\n"; },
);
foreach (@func) {
$_->();
}
FreeBSDとか入れたら最初から入ってるから 手軽で便利だから何気なく使ってる
>>843 アマゾンもperlらしいな
最近はどうか知らないけど
シーサーもだな 「大きい会社」なのかどうかは知らないが。 YAPC::Asia Tokyoとか、Shibuya Perl Mongersとか行くと Perl支持企業の多さや、社員レベルので企業の枠を超えたパイプの太さに感心する
古い会社は昔Perlで書いた資産を大量に持ってるから、そうそう他の言語に移住できまい
COBOLなめんな
というより、mixiやライブドアみたいに、上場してるような技術系IT企業の場合 上場までの過程となる、2005年以前でまともなパフォーマンスを発揮出来るWeb系言語は、 PerlとJavaしかなかった。 mod_perl登場&普及以前の2000年〜2003は、Java一択だったが、 Java系企業はスタートダッシュこそ良かったものの、Javaプログラマ不足で 一から教育しなければならず、次第に勢いが鈍りだす。 そうこうしてる間にmod_perlの登場し、元から多かった豊富なPerlプログラマのおかげもあって ベンチャーが相次いで有名サービスが立ちあげ、どんどん上場していく。 だから、今上場しているような大きいIT企業はPerlが多い。 あくまでもそういう理由で多いだけなので、今後は現在PHPやRubyを採用している会社が IPOしていく流れが続くはず。最近だとRuby採用のcookpad。
年代に関しては、多少認識違いがあるかもしれないが、 言いたいことは、現在上場してるIT企業にPerlが多い理由を書いただけなので勘弁。
PHP>>>Python>>Ruby>>>>>|超えられない壁|>>Perl 多数の言語をマスターした俺の感想。
でも、Perl以外の選択===車輪の再発明ですよね
PHPがトップはないわw
>>855 そこそこメジャーな言語なら車輪の再発明は既に済んでいる。
PHPなんて、サーバーサイドJavaScriptだろw
PHPと違って、JavaScriptは馬鹿に出来ないけどな
>>860 君はPHPの良さを解っていないんだな。PHPで書いたプログラムの滑らかな動きはどの言語もかなわない。
滑らかなのは、お前の脳みそだって。
864 :
デフォルトの名無しさん :2009/07/31(金) 14:48:10
PHP はマイナーアップデートの癖にビルトイン関数の挙動を大きく変えてくるから嫌い
>>847 > FreeBSDとか入れたら最初から入ってるから
入ってない。
>>854 がどういう基準の大小関係なのかわからないと何とも言えない。
基準が書いてないから推測になるけど、「HTMLのテンプレートにそのまま感覚で書ける」ってレベルなら
PHPがトップなのも頷けます。
>>862 普通にインタプリタで走らせるとフレームワーク激重なんだが。
>>866 そもそもがテンプレートエンジンだからなPHPは。
そういやPHP/FIの実体はPerlスクリプトだったな。
>>867 インタプリタで走らせる???
なんか勘違いしてないか?
CGI動作は、コンパイル後実行してるから、インタプリタじゃないぜ?
PHPが糞なのは同意だが。
>>868 そりゃ厳密にはそうだが、mod_perlと違って実行時コンパイル型だから
フレームワークなんて使えたもんじゃねーよって話だよ。
汲んでくれ。
>>869 なんか君は、いろいろ勘違いや偏見、知識の狭さがあると思う
CGI動作させれば、重いのはPerlだって同じ。
mod_phpで動作させれば、PHPだってmod_perlに匹敵するくらい速い。
そして、mod_phpを使わないPHPは”普通”じゃない
871 :
デフォルトの名無しさん :2009/07/31(金) 19:22:03
そもそも重い処理がコンパイルなわけで それ自体のスピードは似たり寄ったりじゃないの?
>>871 うん、似たりよったり。
ただ、mod_xxxみたいにメモリ常駐型でも一応差は出る
Java>Python>Perl>PHP>>>Ruby
PHPは商業ベースのアクセラレータ導入すれば結構速度でるよ。Javaには及ばないけど
今本読みながらPerl覚えてるんですけど、ハッシュの用途がさっぱり 本には重要って書いてあるけど、そんな重要なの?
>>874 やっと質問が来たw
例えば、
my $hash = {suzuki => 37, kimura => 43, nakamura => 21};
みたいに人の名前をキーに、年齢を持つハッシュがあれば、
my $name = shift;
print "$nameさんの年齢は、$hash->{$name}歳です";
って出来る。これを配列でやるとめんどいでしょ。
というより、ハッシュというのはPerlに限らず、基本的なデータ構造だよ。
>>874 今からでも最強言語であるPHPをマスターする事をお勧めする。
>>876 ダメな技術者ほど、特定の言語を支持するんだよな
そういえばPHPは配列無かったな これが一番気持ち悪い
>>878 ないわけないだろw
ただ、関数で要素の代入するのはキモイ
>>876 Perl書ける人ってPHPも余裕で書けると思うけどな
個人的にperlが車のMTでPSPがATってイメージ
>>877 PHP出来れば、他も出来るんだよ。あとは、Javaもお勧めするけどな。
まあ、俺みたいな天才は殆どの言語をマスターしてるんだがな。
>>880 書けるよ。俺はPerl→PHPだったが、先にPHPを学んだ方が良いという結論に達した。
C++→Perl→Java→PHPと来たけど情報さえあれば学ぶ順番はどうでもいいと思う
何このバトロワスレ。
>>879 つーかPHPのarrayはperlの配列とハッシュをまぜたような奇怪なモノだからな。
いまだに慣れん
俺も1度構ったけどスレタイ読んで冷静になった方がいい気がする…
バトロワだと相手にもしてもらえない底辺PHPerが出張にきました
JSONはJavascriptが一発で読み込むなw アホか俺は。
>>890 うん、アホに加え、いろいろ勘違いや偏見、知識の狭さがあると思う
>>891 その餌じゃちょっと釣られる気がしない。
ようするに夏休みだってことだ♪
>>889 そのEthnaってのがどういうものか知らんが、CGI動作させるかmod_php動作させるかで
技術的に差があるわけじゃないので、もしCGI動作させる前提で出来てるなら、
CGI動作させるメリットを取ってるだけじゃないのか?
mod_php前提のフレームワークだってあるだろうし。とういうかあって当然だし。
手段であるエンピツなんて何でもいいんですよ。 描いた絵が素晴らしければ それが正義なんだすよ
>>894 無知乙。
例えばmod_perl+Catalystはモジュールをロードして常駐するタイプなので、
リクエストが来たら即座に対応できる。
mod_phpはコンパイラ起動のコストがないだけで、結局インタプリタが
動くのでオーバーヘッドは変わらない。
そしてPHPにまともに動くサーバー常駐型フレームワークは今のところない。
どっちの言語が優れているかという議論には興味ないが、負荷を考慮して
フレームワークを使うならPerl/RubyはあってもPHPという選択はありえんわ。
フレームワークなしで中規模以上の開発をするという選択もありえんし。
逆にお問い合わせフォームとかならPHPが手軽でいいんじゃね?
昨日から勉強し始めたんですが、PerlでSNSは作れますか?
当然作れるけど、板チ
作れない。Perlで作るならPHPで作れよ。楽だから。
つーか 逆に作れない物を教えてくれ
粘着がいるな
emacsで、ウィンドウを分割して 一方でコード、一方で実行結果を表示したいです perl-mode,cperl-modeをdescribe-modeで見てみたけど そういったコマンドはないみたいなのですが こういったことは出来ますか? tuareg-modeやscheme-modeみたいに使えると 開発効率が段違いなんですが
904 :
デフォルトの名無しさん :2009/08/01(土) 13:40:17
この板に居る方からしたら物凄く低いレベルの質問だと思うのですが…すみません。 もしお分かりでしたらお力を貸して頂けたらと思います。 あるtxtファイルを読み込んで、他のtxtファイルに 10行・23文・150文字 という風に出力するプログラムを作ろうとしています。 $data="This is a raining day.It rain all the time.I feel so boring."; @sentence = split(/\./, $data); $i=1; foreach $in1(@sentence){ @word = split(/ /, $in1); $j=1; foreach $in2 (@word){ print "第". "$i" . "行の第" . "$j" . "文字は " . "$in2" . "\n"; $j++; } $i++; } を書き換えたらできると言われたのですが、どの部分に足せばいいのか分かりません…少しいじるとすぐに動かなくなってしまいます。
Perlの入門書でお勧めの書籍を教えて頂けませんか?お願いします。
Perl/tkでWindows用GUIプログラムを作成しているのですが、 ○分毎に関数を実行したくてalarm関数を使おうとしたら、 WindowsのActive Perlはalarmが使えないようでできませんでした。 Active Perl 5.8.6 Build 881の環境でalarm使ってみたけど 時間経過しても一切反応無しでした。 WindowsでPerlを使って○分毎に指定の処理を実行させるにはどうすればいいですか?
$main_window->after( 360, sub { } ); after使えば出来るよ
909 :
907 :2009/08/01(土) 22:04:02
>>908 ありがとうございます。
でも何故か即1度実行するだけで繰り返してくれませんでした…。
ソースは下記です。
#!/usr/bin/perl
use Tk;
my $autoup_flg;
my $timer_id;
my $cnt = 0;
my $main = MainWindow->new;
my $autoup = $main->Checkbutton(-text=>"auto update",
-variable => \$autoup_flg,-command=>\&auto_update)
->grid(-row=>0,-column=>0);
MainLoop;
sub auto_update{
if($autoup_flg == 1){
print "after 10 start\n";
$timer_id = $main->after(10,\&update);
}else{
print "after stop\n";
$main->afterCancel($timer_id);
}
}
sub update{
$cnt++;
print "$cnt loop\n";
}
>>909 繰り返すときはafterじゃなくてrepeatでないかい。てかマニュアル読めよ
$timer_id = $main->repeat(10,\&update);
911 :
907 :2009/08/02(日) 09:36:18
912 :
デフォルトの名無しさん :2009/08/02(日) 12:55:34
>>906 入門書なんて買わないでネットで探してやればいいじゃん。わざわざ買う必要ない。
基礎覚えたらソースいじったりして勉強。
「最近Perlをマスターした人」のレスポンスが求められている。
>>913 まあ、後輩だか知り合いだかに入門書は何が良いの?と聞かれても
ラクダしかまともな本がない時代にPerlかじったやつは答えようがないよね。
「初めてのPerl」だとWindows cmd.exeの挙動の違いでたいがいひっかかってるし。
>>914 俺なんかまだ英語のらくだしかなかったし、fjですらPerlのまともな
情報は得られん時代だったから役にたたんな。
まあそれでも何とかかけたんだから大丈夫でしょ。
んー、助言するなら、レファレンスに使うならperldocがいい。
日本語訳もたまに転がってる。
普通の人が書いたのは間違ってることが多い。
例えば関数のレファレンスはperldoc perlfunc+検索語 でググれ。
初心者ならperldoc perlintroくらいから読み始めろ。
>>836-837 {""}で囲めばできるね
for(my $i = 1;$i <= 3;$i++)
{
&{"func$i"};
}
>>915 その時代だったら、UNIXマガジンの解説記事、入門記事で育ったんじゃねえの。
ラクダ本の原著は4400円程度で手に入るのに 日本語訳は二冊に分かれてて不便なうえに、 二冊とも買うと10000円超えるってがマヌケだな。 原著をいきなり買って辞書片手に挑戦しながら、 perlと英語の両方の勉強を続けるのが実は一番お得。 自分が知りたい(特殊な)情報は、英語のmlのwebアーカイブで見つかるというパターンが一番多い。
そもそも技術本の邦訳ってどうしても英語読みたくない英語アレルギーな人用の本だし。
Perl/TkのListboxの既に入力されたデータの変更って -listvariableで指定した変数or配列の値の変更じゃなきゃできないですか? Mastering Perl/TkとPerldoc見た感じ、それっぽいメソッドが見当たらなかった…
>>917 雑誌類は執筆する側だったな当時は。
さすがにユニマガはないけどUNIXUSERとか。
最近は何も書いてないけど。
>>918 > 辞書片手に
PC使えよって思うが。
ぶっちゃけ、プログラム組んだ事無い奴がラクダ本読んでも、さっぱり解らなくないか?
馬鹿はわからない、馬鹿じゃなければわかる。
馬鹿じゃなくても、難しいと思う。 難しいというより、理解の拠り所となる知識が少ないから、見えてこないというか。 そして、そんな人にはリャマ本。
>>921 時代認識がめちゃくちゃだぜ、おっさん。
perlの情報があんまり無かった頃だったので、 知識の大半はperldocから仕入れたな 日本語訳はあったけど、英語の方が読みやすかったような
一応TOEIC600点あるけど、俺は邦訳読むなー
>>928 600点しかない、の間違いじゃないか?
そういう俺も600点だが。
英語だと、検索と言うか欲しい情報を探すのに手間取る… これだけはどうしても直らない、どうすればいいんだろう
英語のほうが読みやすいっていう人は、英語と日本語で読むスピードが一緒ってこと? すごいね。 相当のトレーニングをしないとそうはなれないと思うわ。 経験的にかなりの長期間外国にいないと難しいと思う。
>>931 リーディングだけに限れば海外経験なくてもネイティブ並みに上達可能だよ。
つかそういう人はザラにいる。知人も毎日日本語よりも英文のフィードの方を読みまくってる。
日本にいても余暇は英文しか読まないって生活は簡単に送れるからね。
あと、訳が汚いと原文の方が読みやすいってことはよくあるな。 昔のK&Rとか、最近だとPEAAは誤訳がひどすぎて結局 原文買いなおしたよ。
>>932 読むスピードが”同じ”になるのは結構難しいと思うよ。
まあそういう人がいることは確かだが、そういう人はスピーキング、リスニングもかなり上手なことが多い。
発音は別だが。
>>933 訳の問題はあるな。
>>934 はいはいワロスワロス
そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、 スピーキングのスピードや語彙はネイティブと同等でなくてはおかしい。もちろん発音の善し悪しは別問題。 ライティングは「アルファベットを書き慣れる事による書く速さ」とか「英語タイプにどれだけ慣れているか」等 物理的な書く速さに依存するがそれらの基本的にはネイティブと同等であると考えられる。 リスニングは耳の聞き分け能力に依存するのでこれは何とも言えない。
937 :
936 :2009/08/03(月) 23:16:34
物理的な書く速さに依存するがそれらの基本的にはネイティブと同等であると考えられる。 ↓ 物理的な書く速さに依存するが基本的にはネイティブと同等であると考えられる。 の間違いね。「それらの」が余計だった。 補足だが100%英語で、っていうのは頭の中の考えが全て英語なのはもちろん、 思考のスピードもネイティブな言語と同様って意味です。 リーディングでネイティブ並な人はほぼ必ずスピーキングもネイティブ並。 (ほぼ、というのは滑舌が悪くて単語を発音するのに時間がかかる人がいるから。) 逆は成立しない。 米国在住でも文字が読めない人の存在を考えればすぐに分かるが。 なぜならリーディングは文字->単語の認識の変換を行う時間を考えなければいけないから。 これは慣れ。もちろんん日本にいてトレーニングが可能なのは主にこの部分である。
>>936 > そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、
ちがうだろ。
>>938 違くないよ。少し考えればわかるだろ。
100%英語で考えられないでリーディングでネイティブなわけないでしょ。
ネイティブっていうのは、
文を見る->文字から単語、文を認識->意味を理解
他の言語を通すと
文を見る->文字から単語、文を認識->翻訳->意味を理解
この「翻訳」が時間の無駄なんだよ。ネイティブはその言語を直接理解できなければならない。
よって思考は全てその言語で行われる必要がある。
もし他言語の思考が入るとしたらそこには必ず翻訳が入っているためそれはネイティブとは呼ばない。
「ちがうだろ」じゃ何も伝わらないよwwちゃんと論理的な反論してね。
win32をインストールしたけど、使い方がわかりません。 リファレンス的なサイトを知ってたら教えてもらえませんか? 激しく巨大なわがままを言うと、画像付リファレンスだとパーフェクトです。
↑win32::GUI
>>939 俺が言ってるのはさ、
毎日英文ばっかり読んでりゃリーディングは完璧に身につくが、
ちょっとした挨拶とか電話の仕方とかジョークの返しとかはネイティブと喋ってないと
身につかないのよ。タイミングとかさ。一人で勉強してたら誰も直してくれないしさ。
まあ、カンバセーションの英語とマニュアル類の英文は別物だということに気づけ。
つかお前文章長いし粘着気味でキモい。
しまった。質問するタイミングを間違った。 子供が喧嘩をしている時だったか。
>>936 > そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、
誰もそんなこと言っていない件
言っとくけど俺ですら翻訳なしで英文普通に読めるぞ。 職業になってるくらいだから、翻訳しながら英文読むとかアホのすること。 ボキャビルが足りないから辞書引く時間で損してるけどね。
>>937 > リーディングでネイティブ並な人はほぼ必ずスピーキングもネイティブ並。
ちがうだろ。
948 :
939 :2009/08/03(月) 23:37:06
やっぱ理論的な反論は無しかwwwww 今日も俺の大勝利だなwwwwwwwwww やっぱ「俺は英語できます君」は釣りやすくてウケるwwwwwwwwww
>>946 翻訳なしで普通に読むだけなら誰でも出来るだろ。
問題なのは速さ。日本語と同程度に読めなきゃネイティブとは言わん。
>>947 だからまともな反論は出来ないのか?
スピーキングがネイティブ並じゃないならそいつのリーディングはネイティブ並じゃないんだよ。
一方的な勝利宣言のあと勝手に逃亡。 おつかれさま。
>>949 >>939 > ネイティブっていうのは、
> 文を見る->文字から単語、文を認識->意味を理解
これに反論しただけだが?俺はネイティブじゃないがこのくらい出来るぞ。
952 :
デフォルトの名無しさん :2009/08/03(月) 23:43:53
なにこのスレ
>>949 > 問題なのは速さ。日本語と同程度に読めなきゃネイティブとは言わん。
お前な、英語を語るならカタカナ語くらいちゃんと使え。nativeを辞書で引いて来い。
基礎中の基礎単語だろーに。
>>943 その検索のしかたとってもいいな。ありと。
使えそうなのはすでに知ってた1サイトしかなかったけど。
どうでもいいけど、次スレのテンプレに中学生禁止を書いておいてほしい。
>>950 それ別人なわけだが。。
>>951 > そもそもリーディングでネイティブってことは、100%英語で考えられるって事だから、
これを違うって言ってた人は君?そもそも日本語で考えた時点でネイティブじゃないっていうのは同意したのかな?
>文を見る->文字から単語、文を認識->意味を理解
できるのはいいとして、問題はその速さだから。
これを「日本語と同様の速さで」出来ないと英語を日本語と同様の速さで読むことはできないよ。
つまり、「意味を理解」の時点で英語での「日本語と同様の速度の」思考が必要とされる。
英語で日本語と同様に思考できるなら英語でのスピーキングは必ず日本語と同様になるはずである。
>>955 お前、「ネイティブ並みの語学力」を「ネイティブ」だと勘違いしてるようだから、
native辞書で引いて来いって。読んでて恥ずかしい。
あと読むことと喋ることは全然違うから。文語で話す外人いたらキモチワルイだろ。
意味が通じるという点では同意するが、
> リーディングでネイティブ並な人はほぼ必ずスピーキングもネイティブ並。
これは有り得ない。
TOEIC受けると、Rだけやたら高くてLは笑うほど低い 世の中の英会話教室はそういう人をターゲットにしてて、 それまでやらなかった分野なんだから簡単に急成長するのは当たり前だけど、 英会話を見に付けても結局活かす場が無い
邪魔
板間違えたかと思ってスレタイ3回も見直したじゃねーかバカヤロー
車輪の再発明の次はPHPの話してたと思ったら次は英語か?
エロチャットで大活躍 wow
ム板で英語ネタはどこのスレでもなぜか盛り上がる。
英語発音違いの論争ならどの板でも1度はかならずやるよ
発音違いというか、カタカナ表記で言い争うから質が悪い。 そのうち、からかって「リンゴはアポー」とかレスする奴が出てきたりした頃、 熱くなってた奴らも無意味さに気づいて収束する。
ダウンロードカウンタというのは、初心者が作るのは大変でしょうか?
WEB?WEBならスレチだけど 考え方さえ間違ってなきゃ、入門書片手に作れると思うよ。 まず、ダウンロードのリンク先をCGIにして そのCGIで外部ファイルなりDBなりを使ってカウントアップ その後、ファイルを書きだす。(mime_typeを指定すること) もしくはファイルにリダイレクトでもいいけど。 とか、そういう感じで。
>>966 WEBです;
スレチでしたか、すみませんでした;
それなのに丁寧にありがとうございます。
本を買って頑張ってみます。
968 :
デフォルトの名無しさん :2009/08/04(火) 18:33:59
perでGUIソフト作りたいんだけど GTKっ使いやすい?
969 :
デフォルトの名無しさん :2009/08/04(火) 18:34:47
>>968 めっさ誤字脱字してる・・・
GTK2使おうと思ってるんだけど
使い勝手とかどうですか?
それとも定番の他のソフトがあるのかな
>>969 Perl/Tkが枯れてると思うが、今はGtk2一択じゃねーのかな。
GUIは書かないから何とも言えんが。
971 :
デフォルトの名無しさん :2009/08/04(火) 19:42:30
>>970 レスどうも
やっぱりGtk2の一択みたいですね。
Perl/Tkは知りませんでした、調べてみます
Tkは手軽で使いやすいし、機能も豊富で、そのままunixで作ってwindowsで使える。 でも、日本語関係で大変な目に遭う。使うなら日本語の取り扱いからなんとかする必要が出てくる可能性有。 GUIはwindowsじゃないので違和感はあり。 WIN32::GUIは、Tkよりさらに手軽。でもGUIがとっても貧弱。 よくある一般的なGUIや窓を表示する程度だったら最も適切だと思った。 WIN::APIは、あんまやったことないけど、悪い印象はなかった。コーディングはTkよりややめんどい程度。 引数名が直感的じゃなかった。つーか記号みたいなLvに近い?だった。まぁ記号ではないけど。 あと、引数の書き方も見やすく綺麗に書きにくい感は多少だけどあった。 他はやったことナッシング。
973 :
デフォルトの名無しさん :2009/08/05(水) 08:33:46
>>972 丁寧なレスありがとうございます。
順番に試して見ます
>>974 どこで不具合が起きているのか突き止めてそれを修正すればいいです。
976 :
デフォルトの名無しさん :2009/08/06(木) 01:48:46
というかですね。 この方法だと保存できるのとできないのがあるみたいで… そこでなんですけど、htmlを保存できる万能な方法ってないですかね。
978 :
デフォルトの名無しさん :2009/08/06(木) 01:57:28
Perlでは、eval をつかって try catch のまねごとをしますけど、 catch(FooError ex) { ... } catch(BarError ex) { ... } のように例外クラスを指定してcatchするのはどうしたらいいですか。
本気で困りました。 ----------------------------------- use strict; #ちょっと画像データを10進数にしてみる my $file = "./hogehoge.bmp"; my $count; open FILE, "$file" or exit;{ binmode FILE; local $/ = \1; while(<FILE>){ $count ++; print (sprintf("%03d", unpack("C", $_ )) . ($count % 16 ? " " : "\n")) ; } }close(FILE); ----------------------------------- 正常に動作しません。 症状: 1:なんか知らんけど改行の位置が乱れる場合がある。 2:その際、その周辺で高確率でsprintfの整形も乱れる。 3:プログラムを実行するたびにその位置がランダム。 環境: 1:windowsXP 2:ActivePerl5.8.7 3:秀丸5.01から perl -w <con >con を記入して実行。
983 :
982 :2009/08/06(木) 13:46:23
追記 local $| = 1; を書くと圧倒的に乱れる箇所が減少しました。 しかしそれでも整形や改行位置が乱れます。 なぜでしょう? つーかPerlってメモリの使用具合で処理結果が乱れるんですか?
my $i = 0; my $pos; for my $x (@list) { if ($x eq "foo") { $pos = $i; last; } $i++; } print $pos, "¥n"; という処理をかっこよくかくにはどうしたらいいですか。 Rubyだとこんなかんじ。 pos = list.index {|x| x == "foo"} print pos, "¥n"
>>984 最近見たなと思ったら
>>735 ですか?
>>738 で回答したんだけどその後返って来なくて結局どういう仕様なのかわからん
どういう動きが正しいの?
位置情報が欲しいってことだよね? use List::Util qw( first ); my $pos = first { $list[$_] eq 'foo' } 0..$#list; my $pos = (grep {$list[$_] eq "foo"} 0..$#list)[0];
987 :
デフォルトの名無しさん :2009/08/06(木) 15:46:49
てすと
リストの要素のうち、N番目以降だけを取り出すような関数はありますか。 @list = (10, 20, 30, 40, 50); @list2 = slice @list, 2; # 3番目以降の要素をすべて取り出す
989 :
982 :2009/08/06(木) 16:41:20
オールスルーされましたが自己解決!
>>988 スライス
>>989 ありがとうございます。
my $len = @list;
my @list2 = @list[$n..$len-1];
でできました。
スライス使う時には $list[1..3] ではなくて @list[1..3] なんですね。
ここを間違って悩んでました。
@list2 = splice @list, 2; # 3番目以降の要素をすべて取り出す
992 :
977 :2009/08/06(木) 22:03:08
遅れたけどありがとうです。
文字列が表す関数が存在するかどうかを調べることはできますか。 my $name = "map"; my $val = defined &$name; print Dumper($val); #=> '' この例だと$valは偽ですが、これが真となるようにできますか。
mapは組み込み関数だから云々
Test::Simple を使っているのですが、ハッシュを比較する方法がわかりません。 use strict; use Test::Simple tests => 1; my $h1 = {'a'=>1}; my $h2 = {'a'=>2}; ok(%$h1 == %$h2); #=> ok %$h1 と %$h2 は異なるのに、ok(%$h1== %$h2) が成功してしまいます。 どうしてでしょうか。
>>995 異なるかどうかを調べていないからでしょう
>>997 ありがとうございます。Perlではハッシュが同値かどうかを簡単に調べる方法はないということなんですね。
自分なりに試した結果、ok(Dumper($h1) eq Dumper($h2)) でうまく動作してくれているんですが、この方法でもいいでしょうか。
>>998 ハッシュの中身に関数入ってるとうまく動かなくね?
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。