Perlについての質問箱 14箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc5.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html
● 2004/11/28現在の最新版: 5.8.5
● 2004/11/28現在の開発版: 5.9.1
0233デフォルトの名無しさん
NGNGいやだって、decode前のencodingが分かんないから。
分かってればuse openとかで変えられるわけで。
(もっともuse openはグローバルじゃないのが困りモノだけど)
んで、ファイル名に関してはencodingを指定できる場所がない、と。
filenameとかのプラグマを作ってreaddirを上書きすればいいんじゃね?
0234デフォルトの名無しさん
NGNGそれは文字セット [ ] の使い方間違えてるだけだ
$reg = qr{ <TD> ((?!</TD>).)*? 使用上 .*? </TD> }isx;
$string =~ s/$reg//g;
正規表現、絞込みと再帰が使えたらなあ…
0235デフォルトの名無しさん
NGNGPerl6の正規表現はすごいらしいよ
0236デフォルトの名無しさん
NGNGs{<TD>.*?</TD>}{index($1,'使用上')? '': $1}g
あたりでどうだろうか
0237デフォルトの名無しさん
NGNGs{<TD>.*?</TD>}{index($1,'使用上')? '': $1}ge
0238デフォルトの名無しさん
NGNGありがとうございました。
<<231
参考に使用している本を教えてくださいな。
<<235
更に正規表現が難しくなるのか・・
0239デフォルトの名無しさん
NGNGレスアンカーくらいまともに打てないのかね?
0242デフォルトの名無しさん
NGNG1バイトずれてマッチする問題の対策が入ってないな。
use utf8前提ならいいがそうでないなら厳密には
まずそう。3文字もあるとそうめったに偶然マッチ
することはないけどね(笑) たとえばEUCで1バイト
ずれると「藩兢」が含まれるがこんな文字列は今
はじめてみたので実用上どの程度まずいかは疑問。
「使用上」の部分が固定文字列じゃなくてどっか
からもらうならちゃんとしなくちゃだけどね。
0243デフォルトの名無しさん
NGNGカッコが抜けている
indexの見つからなかったときの戻り値は$[-1
s{(<TD>.*?</TD>)}{index($1,'使用上')>=0? '': $1}ge
0244デフォルトの名無しさん
NGNGひょっとして$&を知らないのか?
0245デフォルトの名無しさん
NGNG$&使うといらないとこでもマッチ結果を保存するようになるから
あきらかにそこしか正規表現がないような使い捨てスクリプトじゃ
ない限りなるべく使わない。
0246デフォルトの名無しさん
NGNGただのお遊びならかまわんが、仕事がらみじゃ即座にクビだぞ。
0247デフォルトの名無しさん
NGNG漏れはてっきり、タグ中の"使用中"も拾っちゃうとか、再帰的なタグが処理できないとか
そういう部分のこと言ってるんだとおもってたよ
プロののくせに、その今更な子供みたいな文句はなんだorz
…大丈夫だよ。ぼくちゃんが心配しなくても、みんな最初にどうにかしてるから
0248デフォルトの名無しさん
NGNGコースじゃつらいんじゃないかね。HTMLのパースしてくれる
モジュール使ったほうがいいと思われ。
0249デフォルトの名無しさん
NGNG@conbi = ( $line =~ /^${euc_char}*?($KATAKANAp{2,}$KANJI{2,})/og );
で、うまくいったのですが、後ろの文字をに制限しようとして、
@conbi = ( $line =~ /^${euc_char}*?($KATAKANAp{2,}$KANJI{2,})$back{1}/og );
ではうまくいかず、
@conbi = ( $line =~ /^${euc_char}*?($KATAKANAp{2,}$KANJI{2,})($back){1}/og );
($back = 'が|の|を|に|へ|と|より|から|で';)
としたら カタカナ+漢字 と $backのひらがな1文字が入ってしまいました。
[$back]{1}にしたら$backの内容に関係なくマッチしてしまいました。
1行で表現することは無理でしょうか?
#$euc_charのぶぶんは「perlメモ」でeuc1文字にマッチする正規表現です。
$KATAKANApや$KANJIも「Perlメモ」の全角カタカナ、漢字にマッチするものです
0250デフォルトの名無しさん
NGNGとしたらうまくいきましたorz
スマソ...
0251デフォルトの名無しさん
NGNG先読み (?= ... ) 使えばいいんじゃないか?
/ なんかマッチさせたい文字列 (?= 後ろの文字 ) /x
0253デフォルトの名無しさん
NGNG0254デフォルトの名無しさん
NGNGMainWindowが余分に出ちゃいます。
MainWindowを出さずにすませるか、見えなくする方法ってないでしょうか?
0255_gunzip
NGNGMainWindowを作って隠す、という方法が手っ取り早いかな。
#!/usr/bin/env perl
use Tk;
my $mw = new MainWindow();
$mw->withdraw();
my $target = $mw->getOpenFile();
#以降不要なら$mw->destroy();
0256デフォルトの名無しさん
NGNG仕方がないので、HTML出力するものを文字列として$mojiに保存して、
クッキー出力後に、
print"$moji";
をしています。
結果としては正しい物が出力されるのですが、普通はこのようなやり方をするのでしょうか?
また、この方法だとprintf出力ができません。
何かいい方法は無いでしょうか。
0257デフォルトの名無しさん
NGNGまず>>1をゆっくり"声に出して"読め
0258253
NGNGの二つのパッケージを入れて
$PERLDB_OPTS="ReadLine=t" perl -d -e foo.pl
これでヒストリ機能が使えるようになりました。一応報告まで。
0259デフォルトの名無しさん
NGNGreadline 先にインスコしてから Perl インスコすれば最初から使えるんじゃなかったっけ?
他のツールでもハマることが多いので、
漏れは OS インスコ後真っ先に入れるもののリストに readline を入れてる。
0260デフォルトの名無しさん
NGNGuse warnings;
foreach my $bar (@list) {
next if (-M $bar < 0); #★
print "$bar\n";
}
と書くと、Use of uninitialized value in numeric lt (<) at ★の行
とワーニングが出まくるんですが、これは何が原因でしょう?
@listにはあるディレクトリのファイルリストが入っています。
$barが初期化されてないって意味だと思うのですが、printできてるので
ファイルリストは取得できています。Perlのバージョンは5.8.5です。
よろしくお願いします。
0261254
NGNG>MainWindowを作って隠す、という方法が手っ取り早いかな。
>my $target = $mw->getOpenFile();
>#以降不要なら$mw->destroy();
これだと、
my $target = $mw->getOpenFile();
の時点で、getOpenFileが終了するまで実行止まっちゃっちゃうので、
getOpenFileダイアログ出てる間はMainWindowも出てしまいます…
できれば、最初からgetOpenFileダイアログだけを出すようにしたいです。
0263デフォルトの名無しさん
NGNG止まらなきゃ困るだろ。
>getOpenFileダイアログ出てる間はMainWindowも出てしまいます…
でねーよ
0264263
NGNG0265デフォルトの名無しさん
NGNGその-Mってのはなんの目的で入ってるの?
0266デフォルトの名無しさん
NGNGたぶんカレントディレクトリがファイルリストつくったところとちがうので-Mがundef返してるんだろ。
ディレクトリ補ってフルパスにするか適切にchdirすれ
0267デフォルトの名無しさん
NGNGこう書くと更新日時がプロセス起動より新しいファイルを弾けるんじゃないですか?
>>266
やってみます
0268デフォルトの名無しさん
NGNG私はあえてcygwinで動かしたいのです。
0269デフォルトの名無しさん
NGNGさすがPerllスレ
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNGhoge_func($) {
hogehoge;
}
とか、
piyo_func($;$) {
piyopiyo;
}
関数名のあとの、($)とか($;$)ってどういう意味があるのですか?
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGいきなり Google の URL 示さなくても "Perl のプロトタイプだYO!" って言えばいいのに。
とりあえず>>271はラクダ本を買えってこった。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNGついこないだまでは繋がったのに、、、。
0276デフォルトの名無しさん
NGNG普通に見えるが?
0277デフォルトの名無しさん
NGNG今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、
オライリーの本を買って勉強したほうがいいのでしょうか?
今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか?
オライリーのPerl本は色々あるんですね。
初めてのPerl (続)
Perlクックブック
プログラミングPerl
色々ありますが、どのような順番で勉強していけばキチンと身につけられますか?
それともオライリー以外のほかの書籍で『これは読んどけ』って言うのがあったら教えてください。
0278デフォルトの名無しさん
NGNGプログラミングPerlで勉強していくのが一番いいと思うよ。
0279デフォルトの名無しさん
NGNG初めてのPerlは頭から熟読するべし
その次に読むとしたら 続・初めての かな
クックブックは、まだ要らないと思う
プログラミングPerlは、金が余ってるなら買ってもいいけど
お布施みたいなもんだから、金が無いなら買わなくていい
オライリー以外なら、EffectivePerlあたりがコストパフォーマンスが良くてオススメ
初めてのPerl読み終わったら買うといい。
0280デフォルトの名無しさん
NGNGスマートな正規表現があったら教えていただけませんでしょうか。
想定するFrom:ヘッダとしては
(1) aiueo <[email protected]>
(2) [email protected]
(3) [email protected] (aiueo)
くらいでよいと思うのですが。("aiueo"が表示名のつもりです)
とりあえず(1)からアドレスと取り出す方法として
if ($from =~ /<(.+@.+)>/)
{
print "$1\n";
}
というのを作ったんですが、他の形式にも対応させようとして、いろいろやったんですけど
うまくいきませんでした。(初心者で申し訳ありません)
0281デフォルトの名無しさん
NGNGまずはふつうにパッケージを解凍して、
$perl Makefile.PL
$make
すると、pTkサブディレクトリで氏ぬから、pTk/Makefile の DEFINE = に -DWINUSERAPI="" を追加して
pTk サブディレクトリについて make を続行する。
つぎに、
pTk/mTk/xlib/X11/Xlib.h の 1206 行を
#include <pTk/tkIntXlibDecls_f.h> に変更してから Xlib サブディレクトリを make する。
Event/tclPlatEvent.c の1行目の下に #include <sys/time.h> を挿入する。
Event/tclPlatNotfy.c の33行目の下に #include <pTk/mTk/unix/tkUnixPort.h> を挿入する。
pTk/mTk/unix/tkUnixPort.hを
l.42 #include <pTk/compat/limits.h>
l.62 #include <pTk/Lang.h>
l.89 #include <pTk/compat/unistd.h>
に変更する。
そのうえで Event/ サブディレクトリを make する。
JPEG/ サブディレクトリに移る。
makeするとJPEG.cのコンパイルで氏ぬので
make JPEG.i で JPEG.iを生成してから
typedef struct HWND__{int i;}*void *;
を
typedef struct HWND__{int i;}*HWND;
になおす。変更したJPEG.iを手でコンパイルしたらmakeを続行する。
PNG/ サブディレクトリも同様の手順でmakeする。
こまったのは Canvas, Entry, ListBox, Menubutton, Scale, Text の各ディレクトリのmakeである。
こいつらをmakeしようとするとlinkの段階で氏ぬ。
ぉιぇτ、工□い人
0282デフォルトの名無しさん
NGNGきちんとやるなら素直に Mail::Header つかうのが吉。
0283デフォルトの名無しさん
NGNGあまりよく分かりませんでした。
getメソッドが使えるのかな。
Fromヘッダの内容は、変数に入れてあるんですけど、
new Mail::Headerには、標準入力か、ファイルディスクリプタ?しか
渡せないんですかね。(ファイルからの入力しかできない?)
すこし試してみます。。
0284デフォルトの名無しさん
NGNG>>279
意外と、『クックブック』は早めに手に入れておいた方がいいと思うな。
というのも、『初めて』『続・初めて』と進んできて、
一番問題になるのは、リファレンスとオブジェクトの理解だと思うんだわ。
特に、『続・初めて』だけだと、オブジェクト指向のあたりは、
理解は難しいと思う。
自分の場合、
『続・初めて』で分からないとき、同じ項目を『クックブック』で引いてみると、
ああ、なるほどと分かることが多かった。
基礎部分は、『初めて』『続・初めて』『クックブック』だけでいいと思う。
あとは、なにをするかによって、専門分野のを選ばないと。
CGI なのか DBI なのか、それ以外のなにかなのか…
0285デフォルトの名無しさん
NGNGごめん、おもいっきり誤読してた。
Email::Address がそれっぽい。
0286デフォルトの名無しさん
NGNG0287デフォルトの名無しさん
NGNGできました!ありがとうございます。
<code>
use Mail::Address;
my @addrs = Mail::Address->parse($from);
foreach my $addr (@addrs)
{
print $addr->address,"\n";
print $addr->comment,"\n";
print $addr->name,"\n";
}
</code>
0288デフォルトの名無しさん
NGNG0289277
NGNGとりあえず、
�@初めてのPerl
↓
�A続・初めてのPerl (⇔プログラミングPerl⇔クックブック ⇔ EffectivePerl)
↓
�BプログラミングPerl ⇔ クックブック ⇔ EffectivePerl
というような順番で読んでいけばいいのでしょうか。
ここまでがDBIとか専門分野に進んでいく『一般教養』と考えていいのですか?
大学の授業に例えるならこんな感じかな、と思ったのですが・・・。
0290デフォルトの名無しさん
NGNGプログラミング言語なんてのは使ってなんぼのもんなので
覚えるためのもんじゃないんで、
どこまで覚えりゃいいなんてものはないし
覚えると誉めてくれる人なんていないわけ。
いいたかないが、かまって君なら板違い。
仮眠前に覗くんじゃなかったわ。
0291デフォルトの名無しさん
NGNG0292デフォルトの名無しさん
NGNGもまえもその程度の事でストレス溜めてどうするよ
どうせネタなんだからスルーしる
0293デフォルトの名無しさん
NGNG十分すぎると思うんだが…
0294デフォルトの名無しさん
NGNG>今まではネットでPerlを紹介しているページで勉強していたのですが、本気で勉強しようと思ったら、
>オライリーの本を買って勉強したほうがいいのでしょうか?
>今ちょうど手元に『初めてのPerl』があるのですが、最初のスカラーデータから読み直したほうがいいですか?
みんな親切だね
0295デフォルトの名無しさん
NGNG>>293-294
中途半端で間違った知識付けて、下らない質問されるよりは
真っ当な道教えておいた方がいいだろ
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNG初めてのPerl 続・初めてのPerl クックブック
くらいまでが、一般教養。
(ここまでやって、ようやく構造化とか、リファレンスとか、
オブジェクトの触りくらいまでは、分かるようになる)
DBIやらなにやらの専門分野はそのあと。
プログラミングperl なんかも、ここらあたりになると
持っているべきと思う。
(ここまで来ないと、理解できる本じゃない)
perlのいいところは、すべて知らなくても、
それなりに使えるというとこ。
ただ、きちんと学べば、もっと楽しく使えるよ。
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNGそこら辺りまで行くと、ラクダ本じゃなく perldocで十分じゃないか?
0300デフォルトの名無しさん
NGNG本の宣伝してるんだろうよ。
0301デフォルトの名無しさん
NGNGこいつ、バカ?
オライリーがこんなとこで宣伝するかよ!
0302デフォルトの名無しさん
NGNG0303名無しさん@ゴーゴーゴーゴー!
NGNG0304デフォルトの名無しさん
NGNGkentのサイトは、ちらとしか見たことないが…。
いや、だからね、perlのいいところは、そこそこしか知らんでも、
とりあえずなんとかなるというとこ。
リファレンス使えない奴はダメだ、とかいい始めると、
それはいかにも perl らしくない。
だけど、そういうことを知ってると、それはそれで、
とってもいいこといっぱいあるよ、ということ。
どこまで必要かは、自分で考えりゃいい。
0305デフォルトの名無しさん
NGNGかぶらないようにするには、どういう規則で名前を付ければいいでしょうか?
0306デフォルトの名無しさん
NGNG色々見て回りましたがうまくいきません。
詳しく書いてあるサイトなど、何か情報はありませんか?
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNGスマートな正規表現か
便利なモジュール等ありましたら
教えていただけませんでしょうか。
想定しているヘッダの書式は以下のような感じです。
Date: Sun, 02 Nov 2003 06:07:00
Date: Sun, 02 Nov 2003 06:07:00 GMT
Date: Sun, 02 Nov 2003 06:07:00 +0900
Date: Sun, 02 Nov 2003 07:07:00 +0900 (JST)
RFCの規定では、
曜日と秒は省略可、日にちは1桁でも可
だそうです。
秒が省略されたときは、無条件で0でいいと思っています。
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNGhttp://search.cpan.org/
ここをブックマークしとけ。
0311デフォルトの名無しさん
NGNGCPAN等で公開しないんなら、アンダースコア(_)で始めればいいんじゃね?
0312デフォルトの名無しさん
NGNG>>309
Mail::Headerだと丸ごと文字列として取り出すだけなんじゃ...
中身を解釈したければ、Mail::Fieldじゃねーの?
use Mail::Field;
$date_string = 'Date: Sun, 02 Nov 2003 07:07:00 +0900 (JST)';
$date_field = Mail::Field->new('date', $date_string);
$t = $date_field->time; # unix time
みたいな感じで。unix timeになったらあとはlocaltimeなり
strftimeなり自由に使えるはず。中身ちらっとみたらdate
文字列の解釈はDate::Parse呼んでるだけだったけどな。
0314デフォルトの名無しさん
NGNGありがとうございます。マジ助かります。
0315デフォルトの名無しさん
NGNG$hash->{'abc'}
$hash{'abc'}
$hash{"abc"}
↑の違いは何かあるんですかねぇ・・・
統一してほしいんですが・・・
0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNG0318デフォルトの名無しさん
NGNGどういうふうに違うんですか?
0319デフォルトの名無しさん
NGNG$hash->{...}と$hash{...}が同じだと思ってる段階でアウト。
perlの基本を勉強して出直して来い。
%hash = (a=>1);
$hash = {a=>2};
print "(1) $hash{'a'}\n";
print "(2) $hash->{'a'}\n";
0320デフォルトの名無しさん
NGNG少なくとも、
$hash->{'abc'}
$hash{'abc'}
では、意味がぜんぜん違う。
前のは、リファレンスをデリファレンスする、
あるいは、メソッドの呼び出し ということになる。
0322デフォルトの名無しさん
NGNG0323デフォルトの名無しさん
NGNG人格くさった奴は、rubyスレに帰れや。
松本に、いい性格をオブジェクト指向で生み出してもらうように
してもらえ。
それとも、perlでアタマをハッシュしてやろうか?
0324デフォルトの名無しさん
NGNGうんとか、すんとか、なんか抜かせよ、ヴォケ。
んじゃ、ruby と クソ をbless してやるな。
メソッド、ケツ拭け!
0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNGだから、そういうときは、 -> 使えって。
そして矢印を、デリファレンス とでも頭の中で読めばいい。
(メソッドの場合もある)
何々 => ○○ は、
何々 の値 ○○ とでも読めばいい。
[ ] が、やや唐突に出てきたら、
無名配列のリファレンスとでも、頭の中で読めばいいんだし、
{ } が、やや唐突に出てきたら、
無名ハッシュのリファレンスとでも、頭の中で読めばいいんだけだ。
ランダル・シュワルツの本とかを読んでも、
向うでもみんなそうしてるように書いてあるぞ。
記号に、意味を表す読みを与えれば、なにも難しくない。
0327デフォルトの名無しさん
NGNG$hash{"abc"}
この二つを並べている事に関しては
文字列の基本をやり直せと言って置こうか
0328デフォルトの名無しさん
NGNG$hash{"$abc"}
だと結果が異なるし
0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNGprint "$1\n" if ($from =~ /パターン1/);
print "$2\n" if ($from =~ /パターン2/);
print "$3\n" if ($from =~ /パターン3/);
でいいんじゃない?
カンペキを求めるなら(不可能らしいけど)次を参照
ttp://www.din.or.jp/~ohzaki/perl.htm#Mail
0331330
NGNG恥ずかしいので見なかったことにしてくれよ。
■ このスレッドは過去ログ倉庫に格納されています