Perlコーディング初心者質問スレ Part 57
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2008/02/25(月) 19:25:51ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0809nobodyさん
2008/07/12(土) 09:51:37ID:???$format = $workbook->add_format();
$format->set_merge();
$worksheet->write_unicode(0, 0, utf8( Jcode->new('ぬるぽ')->utf8 )->utf16, $format);
$worksheet->write_blank(0, $_, $format) for 0..13;
っていう横方向のセルの結合は出来るんだが
$worksheet->write_unicode(0, 0, utf8( Jcode->new('ぬるぽ')->utf8 )->utf16, $format);
$worksheet->write_blank($_, 0, $format) for 0..13;
これだと結合できない。
仕様なのか俺がアフォなのか誰か教えれ!
0810809
2008/07/12(土) 11:19:24ID:???何となくできたわ。
お騒がせしますた。
0811nobodyさん
2008/07/12(土) 18:05:43ID:???お騒がせしたと思うのなら、どうやったらできたのか書くように。
同じ悩みで検索でたどりついた人はまた同じ質問をするでしょ?
0813nobodyさん
2008/07/13(日) 09:44:35ID:SNV4Eg13下記3行目のコードの意味がどうしてもわかりません。。
my @extract_links; #パーズ中に抽出されたURL
my $base = $response->base;
@extract_links = map { $_ = url( $_, $base )->abs; } @extract_links;
Perl初心者にもわかるようなコードに書き直すことはできますか?
何を勉強したら、このようなプロっぽいコードが書けるようになるのかも知りたいです。。
0814nobodyさん
2008/07/13(日) 17:38:13ID:???$ perldoc -f map
@extract_links = map { $_ = url( $_, $base )->abs; } @extract_links;
これはフィルタです。
@extract_links = <--(フィルタ)-- @extract_links;
右側の @extract_linksにフィルタをかけて、自分自身に代入しています。
右側から入ってきた @extract_linksの各要素は、$_に入れられます。
その各要素に対して、
url($_, $base)->abs;
という処理をして(多分相対パスから絶対パスにしているのでしょう)、
その結果を $_ (自身) に入れています。
$_ = url($_, $base)->abs;
結果として@extract_linksの中身が全部絶対パスになって返ります。
0815nobodyさん
2008/07/13(日) 23:01:57ID:???プロっぽいどころか、「どこの素人が書いた?」って言われるコード
だと思うが、、、何で無意味な代入をするかねぇ
3行目の代りになるコード。初心者向け。
foreach my $cont ( @extract_links ){ $cont = url( $cont, $base )->abs ; }
# $_ = url( $_, $base )->abs for @extract_links ;
0816nobodyさん
2008/07/13(日) 23:03:33ID:???map自体を否定してるんじゃないです。
0817nobodyさん
2008/07/13(日) 23:10:10ID:???mapブロック内で$_を変更したら、配列にも影響する。
だから、戻り値で置き換えるのは2度手間ってこと。
mapかforeachかは宗教論争だから好きなの使っとけ。
>>815のが見やすいことが多いけどな。
0819nobodyさん
2008/07/14(月) 00:04:04ID:???馬鹿すぎる
0820nobodyさん
2008/07/14(月) 01:16:23ID:???0821nobodyさん
2008/07/14(月) 14:17:03ID:???0823nobodyさん
2008/07/14(月) 15:02:41ID:???「print "match!\n"if(/^main::HOGE/);」とかしたいんですが、
うまい方法はありませんか?
「my $a=main::HOGE;print "match!\n"if(/^$a/);」はできるんですけど。
正規表現内で、use constant で定義した定数を使いたいのです。
0824nobodyさん
2008/07/14(月) 15:29:04ID:???print "match!\n" if(/^${\HOGE}/);
0825813
2008/07/14(月) 22:29:29ID:ojoqjs1pPerl初心者がいきなりクローラーを作ろうというのが、
ちょっと無謀だったかも。。
基礎から勉強します。(・з・)
0827nobodyさん
2008/07/16(水) 23:13:16ID:???splitで、&を区切り文字として指定した場合、
参考書だと、
&が消える、っていう説明と、
&が残る、って説明が混在しているんだが、
どっちが正しいの?
0828nobodyさん
2008/07/16(水) 23:13:48ID:???0830nobodyさん
2008/07/16(水) 23:54:09ID:???オレらの業界って気軽に試せないのね。
ダムがあったとして
「ここにもし10cmくらいの穴を開けたらどうなるだろう?」
みたいなところなんで、
「いきなり実行する」
っていうのはキチガイ扱いされてクビになるのね。
0832nobodyさん
2008/07/17(木) 00:39:50ID:???&は消える。
参考書のほうが間違ってたわ。
0833nobodyさん
2008/07/17(木) 00:55:40ID:???出版元に問い合わせてみたら?
0834nobodyさん
2008/07/17(木) 02:41:15ID:???1は消えてるんだけど、
2は残ってるの。
余計混乱するわ。
0835nobodyさん
2008/07/17(木) 03:23:04ID:???0836nobodyさん
2008/07/17(木) 05:31:29ID:???「普通は」消えるが正解。正規表現内で()でトラップすりゃ残る。
$str = 'a&b&c&d&' ;
split /&/, $str ; # <= 消える。
split /(&)/, $str ; # <= 残る。
split /(?:&)/, $str ; # <= 消える。
なんで態々解説したかと言うと、区切り文字「列」を二つ使う場合に(|)使ってトラップさせて
「消えないんすけど」って質問された事があったから。
split /(&|:)/, 'a&b&c&d:e:f:g' ; # 本来は区切り文字列ね。
0837nobodyさん
2008/07/17(木) 05:57:35ID:???こういうつまんないことってフレームワークに全部お任せすればよくね。
0838nobodyさん
2008/07/17(木) 06:17:36ID:???0839nobodyさん
2008/07/17(木) 06:48:41ID:???0841809
2008/07/17(木) 09:39:10ID:???すまんこすまんこ。さらに遅レスすまんこ
Spreadsheet::WriteExcelでセルの結合に悩んでるヤシは
ttp://www.koders.com/perl/fid09386E1C3E183B96174D224B87445AE647A32B23.aspx
ここを見れ!
例文が載ってたわ。
0843nobodyさん
2008/07/17(木) 22:27:51ID:???そういうのの、一覧表がのってる
ページをおしえて
0844nobodyさん
2008/07/17(木) 22:29:43ID:???0845nobodyさん
2008/07/18(金) 01:28:58ID:???0847nobodyさん
2008/07/18(金) 09:49:50ID:???0848nobodyさん
2008/07/19(土) 10:24:55ID:???教えてください。
$salt =~ s/[^\.-z]/\./go;
0849nobodyさん
2008/07/19(土) 10:33:23ID:???0851nobodyさん
2008/07/19(土) 18:39:57ID:???$salt =~ # Apply following pattern to $salt
s/ # Start substitution expression
[ # Start difine charactor class
^ # This is negated class
\.-z # Range: "." .. "z" by charactor-code
] # End define charactor class
/ # End pattern and start substitution string
\. # Means "." (NOTE: "\" is meaningless here)
/gox; # Modifiers
# g: global matching
# o: compile the pattern only once
## (x: extended)
>>849
> 5本の指が入る # So loose, and so non-useful for hacking.
0854nobodyさん
2008/07/19(土) 20:59:09ID:???> なんかのソフトでそうやって
> 自動で解説が出るの?
自動で解説できるモジュールあったら便利そうだね!
0855nobodyさん
2008/07/19(土) 21:46:02ID:???>>851はかみ砕いて解説してあるよ。部品ごとにいちいち説明してあるじゃん。
(教えてくんにまともに教えるの癪だからわざわざ英語にしたんだと思うけど)
辞書引くくらいすれば?
perl 置換 パターンマッチ 正規表現 s演算子 でぐぐればいくらでも解説があるよ。
0856nobodyさん
2008/07/19(土) 21:50:14ID:???0857nobodyさん
2008/07/19(土) 22:20:45ID:QBlnT4Mv重い処理をする時に、ブラウザを待たせる必要がないので、
セッションを閉じようと思い、どうすればよいのかwebであさっていたら、
標準出力を閉じるとよいみたいな感じで書いていたので試してみましたが、
処理が待たされます。なぜでしょう?
print "a";
close(STDOUT);
sleep 20;
20秒またされたのち、ブラウザが開放されます。
0858nobodyさん
2008/07/19(土) 22:30:40ID:???0859nobodyさん
2008/07/19(土) 22:33:59ID:QBlnT4Mvこことか
0860nobodyさん
2008/07/19(土) 22:39:51ID:???処理を始めるようだけど、そうしてもダメだったの?
0861nobodyさん
2008/07/19(土) 22:46:03ID:QBlnT4Mv子プロはまだ作ってない。
そこのリンクの
http://www.tohoho-web.com/lng/199909/99090185.htm
環境によるようだね。
こうゆう時の処理はこうだよみたいに書いてあったんで(昔どっかのページで見た)、
普通に出来る処理と思ってた・・・。
0862nobodyさん
2008/07/19(土) 23:04:25ID:???普通のperlではちゃんと、動作しました。
mod_perlでの環境では動作しないようです。
なぜ、mod_perlでは動作しないのかは、よくわかりません。
誰か教えて下され・・・。
0864nobodyさん
2008/07/20(日) 02:16:15ID:???くだすれのほうにもちょっと前に書いたけど、
$|=1にしても、たしか256byteまでは自動でキャッシュが効くとか昔調べた時にどこかに書いてあった。
(昔自分がやったのは、数秒sleep毎に文字列を書き出して、一定時間でexitする。って処理だったけど・・。)
なので自分は、Content-Typeヘッダ出力の直後に、print " " x 256; を書くようにしたらそれで出来た。
あんまりスマートなやり方ではないけど、これ以外に知らない。
(向こうでは、Apacheがキャッシュするって書いたけど、実は自分の思い違いだったかも知れん。
ブラウザとか鯖環境によってはバッファされるbyte数が違うとか言うのも聞いたことがあるのを思い出した。
詳しく調べてないんでよく分からんし、どこに書いてあったかも覚えてない。)
mod_perlについては、printもcloseもexitも全て内部用の関数にoverrideされてるはず。
それに実行されるのは、対象のスクリプトのみではなく、またmodperl::RegistryにしてもPerl Handlreにしても、
実行してるのはApacheプロセスそのものなので、IO周りやsignal周りはApacheの内部実装によると思われる。
それでも上の方法で、ウチの環境では、上のcgiで実行したのと同じ処理ができた。
(すまんが、自分もApacheとかmod_perlの内装知ってるわけではないので、詳しくはわかりません。)
0865nobodyさん
2008/07/20(日) 03:26:59ID:???0866nobodyさん
2008/07/20(日) 03:56:52ID:???0867nobodyさん
2008/07/20(日) 06:30:33ID:???ググってもよく分からんのですよ。
.からzまで以外の文字があったら.(そのままって意味かな?)に変換する。
gオプションだから1回マッチしてもそのあとも処理を行う。
oオプションだからパターンを1回しかコンパイルしない。
だと思うのですが、目的が分からないのです。
あと、oオプションの意味もよく分からないし。
0868nobodyさん
2008/07/20(日) 09:51:06ID:???.からz以外の文字は、
./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
以外の文字
gオプションが無いと最初の1回マッチするだけで、有るとあるだけマッチを繰り返す
0869nobodyさん
2008/07/20(日) 14:38:39ID:???crypt(3)の標準的な実装では、第二引数(salt)は[a-zA-Z0-9./]からなる二文字です。ここではそれを得るための変換処理の一部過程として置換式を用いています。man crypt も参照。
ここから先は Perl の話題ではなくなりますが、知っていて損もないのでぼちぼちがんばってください。
0870869
2008/07/20(日) 14:58:22ID:???> あと、oオプションの意味もよく分からないし。
>>868 が一行目で書いているけれど補足。
/o 修飾子は実行時に変化する部分が含まれている正規表現の再コンパイルを抑制します。
例えばパターンに変数が含まれているケースで /o 付きの式が複数回実行されてもパターンは再評価されません。
初回評価時の値のままマッチングが行われます。パターンが変化しない旨を明示することで実行時性能の向上を図る機能です。
今回のケースではパターンは [^\.-z] ですから変化する部分はありません。>>868 の言う「無意味」というのはそういうことです。
perldoc perlretut 及び perldoc perlop の Regexp Quote-Like Operators の項も見てみてください。
0871nobodyさん
2008/07/20(日) 16:50:44ID:???回答ありがとうございます。
しかしよく分かりません。。。
[a-zA-Z0-9./]以外にマッチ=ひらがなとか漢字とか?にマッチしたら、
その文字を、そのまま使う???
そうなると、saltが許されるのは[a-zA-Z0-9./]だけなので?????
ん??????????????
俺、アホなのかな?
0872nobodyさん
2008/07/20(日) 19:57:43ID:???パーミッションで、
グループを6とかにすると、
もしそのサーバーが、シェルを使える
サーバーだった場合、
その同じサーバーを使ってる人が
シェルで勝手に入ってきてデータ-を
書き換えられたり、消されたりするので、
グループは0にしなければいけない、と
さっき読んだ参考書に書いてあるのですが、
それであってますか?
0873869
2008/07/20(日) 20:39:57ID:???s/正規表現のぱたーん/左のパターンにマッチした部分を置き換える文字列/
[^\.-z] は一文字幅で /g 修飾子付きだから、マッチする一文字を見つけるたびに、置換文字列で置き換えられます。
置き換える文字列はこの場合 "." だから……。
要は s/// の右半分では "." はメタキャラクタじゃない、つまり何ら特別な意味がないということです。
がんばって気付け。
869 は自覚的なアホを応援しています。
0874nobodyさん
2008/07/20(日) 20:49:41ID:???ちょっとは参考書を信用してもいいんでね?w
0875nobodyさん
2008/07/20(日) 23:09:24ID:???EUCだと、タイトルに日本語使えない、
って参考書に書いてあるんだけど、そうなの?
0876nobodyさん
2008/07/20(日) 23:20:40ID:???HTMLのTITLEタグのことですか?
でしたらヘッダで適切な文字コードを指定すれば使えますよ
0877nobodyさん
2008/07/21(月) 00:13:22ID:???なんだかブラウザの動きがもっさりしてくるんですが、
これはPerlが無駄にメモリを浪費してるからですか?
0878nobodyさん
2008/07/21(月) 02:01:53ID:???0880nobodyさん
2008/07/21(月) 10:10:27ID:???0881nobodyさん
2008/07/21(月) 17:58:17ID:???0882nobodyさん
2008/07/21(月) 18:15:23ID:???0883nobodyさん
2008/07/21(月) 18:38:24ID:???0884nobodyさん
2008/07/21(月) 20:58:45ID:???大筋で合ってるけど微妙に違います。
元のパターンは [^.-z] なので、[a-zA-Z0-9./] 以外にもマッチ。
下記のワンライナーで Let's 実験。
perl -ple "s/[^.-z]/./g"
0885879
2008/07/22(火) 07:08:38ID:???自分で書いた
[a-zA-Z0-9./]以外にマッチしたらピリオドに置き換えろ
と
[a-zA-Z0-9./] 以外にもマッチ
の違いが分かりません。???
0886nobodyさん
2008/07/22(火) 11:13:09ID:???LWP::UserAgentを使って出来そうなのですが、
どうコーディングしていいか分かりません。
よろしくお願いします。
やりたいことは、タイムアウト値を指定して
あるURLにアクセスした場合、
httpステータスコードが404を返しても
それは生きていると判定したいのです。
0887886
2008/07/22(火) 11:24:14ID:???こんな感じで出来ました。
use LWP::UserAgent;
$url = "http://www.yahoo.co.jp/";
$ua = LWP::UserAgent->new;
$ua->timeout(10);
$req = HTTP::Request->new(GET => $url);
$res = $ua->request($req);
print $res->status_line;
0888nobodyさん
2008/07/22(火) 13:31:20ID:???わざわざそんなことせんでも。。。
0889nobodyさん
2008/07/22(火) 14:50:40ID:???0890nobodyさん
2008/07/22(火) 15:02:22ID:???0891nobodyさん
2008/07/22(火) 18:38:20ID:???技術評論社
アーク・シンク・タンク 三島 俊司
↑ちょっとわかりやすいね。
意味不明な記述も半分くらいあるけど。
0892nobodyさん
2008/07/22(火) 18:40:05ID:???ifの代わりとしての?は使わない方がいいね。
だって?は正規表現とかでも使うから、
?があると、
「正規表現としての?かな?
それとも、ifの代わりの?かな?」
って考えないといけない。それが時間の無駄なので
?は使わずにifを使うようにしましょう。
0893nobodyさん
2008/07/22(火) 18:41:11ID:???0894nobodyさん
2008/07/22(火) 18:52:12ID:???これ、^があると、「正規表現の行頭の意味なのか?
それとも、否定の意味なのか?」
って一瞬、混乱するし、なるべく使わないほうがいいと
思うんだけど、行頭の意味だと、¥aっていう、代替表現が
あるんだよね。
0895nobodyさん
2008/07/22(火) 18:53:27ID:???数値としてソートしたいときは、スペースシップ演算子を使って
$a <=> $b
とかって書かないといけないけど、そんなのめんどいので、
「数値ソート」
って関数をデフォルトで入れておいてくれないかな?
0896nobodyさん
2008/07/22(火) 19:00:27ID:???ttteditみたいのがいいんだけど。
たとえばforeachって選ぶと、自動で
foreach 変数 リスト {
}
ってテンプレが出てくるようなのがいい。
0898nobodyさん
2008/07/22(火) 19:12:00ID:???ファイルのオープンに成功した時とか、
「ファイル オープン!」
「ギュイイイン」
みたいな。
0899nobodyさん
2008/07/22(火) 20:54:22ID:???0900nobodyさん
2008/07/22(火) 20:54:33ID:???ガショォォォォオオオン!
0901884
2008/07/22(火) 21:30:20ID:???注意が足りなかった点、謝罪するとともに、説明しなおす試みです。
この場合、元のパターンを真偽反転させると分かりやすいかもです。
文字クラス [.-z] は、 [a-zA-Z0-9./] よりも広い範囲を指している点をご理解いただきたい。
つまり s/[.-z]/./g の後でも、[a-zA-Z0-9./] 以外の文字が一部残ってしまう可能性があるわけです。
併せて、ちったあ試してみてくれよ、とお願いしてみます。
>>884 にテストの例も挙げています、ってーか自分の至れり尽くせりっぷりに泣けてきた。
0903nobodyさん
2008/07/23(水) 07:57:47ID:???>>892
python ですら実装してしまった三項演算子にケチを付けてどうする。
>>894
\a はアラームじゃねえか? \A だろ?しかも \A と ^ は挙動が違うし。
>>895
perl5.10 にしろ。指定が無い場合は勝手に文字列か数値か決めてソート
してくれるらしい。
0904nobodyさん
2008/07/23(水) 08:56:46ID:???本当?
% perl --version
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
Copyright 1987-2007, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
% perl -e 'print join(",", sort 1,2,10,5), "\n"'
1,10,2,5
0905nobodyさん
2008/07/23(水) 10:47:15ID:???0908nobodyさん
2008/07/23(水) 22:01:45ID:???Open Perl IDE
http://sourceforge.net/projects/open-perl-ide
レス数が900を超えています。1000を超えると表示できなくなるよ。