Perlコーディング初心者質問スレ Part 63
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2011/09/09(金) 18:11:49.71ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2 以降
前スレ http://hibari.2ch.net/test/read.cgi/php/1295170172/
0539nobodyさん
2012/03/06(火) 01:42:56.66ID:???0541nobodyさん
2012/03/06(火) 02:56:51.45ID:???0542nobodyさん
2012/03/06(火) 09:53:40.98ID:zjKZlebnコード(抜粋)
$html =~ m!"(.*?)" class="Link88" href="/Models.aspx\?ModelID=$id"!s;
print $1;
実行結果
(〜ごっそり省略) <a title="Loeka Creekside Fern Short Sleeve Jersey 2010
$htmlはLWPで拾ってきたHTMLです。数MBくらいあります。
パターンマッチ内の文字列 class="Link88"〜 というあたりはちゃんとマッチしているようですが、
少なくとも Loeka の左にある " が $1 に含まれちゃうのはおかしい気がします。
また不思議なことに、修飾子 /s を外すとちゃんと最短でマッチしてくれます。
0543nobodyさん
2012/03/06(火) 10:29:35.15ID:???$html = q{<a href="b"
id="a" class="Link88"};
$html =~ m!"(.*?)" class="Link88"!s;
$html =~ m!"(.*?)" class="Link88"!;
最短ってのはマッチし始めてからが最短になるんであって、グループ内に"を含まないなんてルールはない
つまり最初の"から class="Link88" ... の手前の"までがマッチするんだよ
0544nobodyさん
2012/03/06(火) 10:46:58.66ID:???m!"(.*?)" class="Link88"!
を
m!"([^"]*?)" class="Link88"!
に変えて解決しました、ありがとうございます。
0545nobodyさん
2012/03/06(火) 12:52:17.96ID:???0546nobodyさん
2012/03/07(水) 23:13:16.91ID:???ttp://kueris.pro.tok2.com/postmail.html
↑これなんですが、ご覧の通り送信ボタンを押すとエラーが出てしまいます。
このエラーは、「Minimal.pm」がCGIフォルダ内に見つからない、という意味だと思うのですが、ちゃんとアップロードはできています。
以下、その他の詳細です。
・check.cgiは問題なく機能しました。パーミッションも設定できています。
・postmail.cgiのみを「cgi-bin」というフォルダに移動させました。
・サーバーはTOK2という所をお借りしています。
・エラーメッセージにある13行目辺りの内容はこんな感じです。↓
9 # モジュール実行
10 use strict;
11 use CGI::Carp qw(fatalsToBrowser);
12 use lib './home/kueris/postmail-utf/lib';
13 use CGI::Minimal;
14 use Jcode;
よろしければお力をお貸しください。よろしくお願いします。
0547nobodyさん
2012/03/07(水) 23:45:53.60ID:???↓
use CGI;
またエラーが出たらお越し下さい。
0548546
2012/03/08(木) 00:14:54.72ID:???ありがとうございます。お陰さまで、無事にそのエラーは解消されたです。
しかし、今度は別のエラーが発生しました。
ttp://kueris.pro.tok2.com/postmail.html
↑今はこのようになっています。
パスが違うのかと思い、色々変えてみましたが、効果はありませんでした。
メッセージにある20行辺りの内容は以下の通りです。↓
19 # 設定ファイル認識
20 require './public_html/postmail-utf/init.cgi';
21 my %cf = &init;
度々で申し訳ありません。
ですが、何卒よろしくお願いします。
0549nobodyさん
2012/03/08(木) 09:26:25.31ID:???で OK
0550546
2012/03/08(木) 12:15:53.18ID:???ご回答ありがとうございます。
試してみましたが、相変わらず同様のエラーメッセージが表示されてしまいます。↓
ttp://kueris.pro.tok2.com/postmail.html
init.cgi自体はちゃんとアップロードされているんですが…。
0551nobodyさん
2012/03/08(木) 12:34:33.65ID:???0553nobodyさん
2012/03/08(木) 17:31:49.63ID:???CGI で動いてない気がしてきた
0554nobodyさん
2012/03/09(金) 01:25:41.39ID:???今勉強中なのですが、
postデータ等をこれで変換すると言うのが良くあるのですが、
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
たしかにこれでうまくいきますし、また基本的な挙動も理解しています。
分からないのは、なぜpack("C", hex($1))/egで、問題無く動くのかということです。
具体的には、
@$1で渡されるのは1バイト分なのに、なぜちゃんと2バイト文字として変換されるのか?
A%([a-fA-F0-9][a-fA-F0-9]の書式でなぜ半角文字が受け渡されるのか?
B例えば”テ”はpostからデータを受け取った時には83eなのに、なぜ問題無く変換されるのか?
C@にかぶりますが、なぜ(pack"c",***)で上手く動くのか? "c*"じゃないのに正常に動いてる。 また、$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/hex($1)/eg;で作った変数をそのままpack"c*",$value;としてもうまく動かないのに、なぜちゃんと動くのか?
いろいろ調べたりしたのですが、よくわかりませんでした。
0555nobodyさん
2012/03/09(金) 02:06:50.72ID:???$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; でググれ。
0556546
2012/03/09(金) 02:23:40.92ID:???>>551様
確認しましたが、問題ありません。
init.cgiは確かに存在しているはずなのですが、認識されていないようです。
試しに、アップロードされたinit.cgiに直接アクセスしてみたところ、404エラーが表示されました。(つづりやパスは間違えておりません)
同じフォルダ内にある別のプログラムにはアクセスできるのですが……。
>>552様
プロバイダによってCGIの設置しやすさは違うのてでしょうか?
もしよろしければ、CGIが動きやすい所をご紹介していただけないでしょうか。
>>553様
申し訳ありません。プログラミングの経験がない私には、「cwdでカレントディレクトリ表示」の意味がよくわかりません。
調べてみましたところ、これはperlにおけるコマンドのことなのでしょうか。
打ち込んでみましたが、上手く動作しませんでした。
0557nobodyさん
2012/03/09(金) 02:58:21.99ID:???相当ぐぐったのですけど、「これで動く」「この処理はこう言う処理をしてる」と言う説明はありそれ自体はわかるのですが、
頭でイメージしたものだとどう考えてもエラーが起きるもしくは正しく動作しないはずなのに、「なぜこの書式で正しく動作してるのか?」と言う疑問の解決は見つかりませんでした。
0559nobodyさん
2012/03/09(金) 03:37:26.52ID:???KENT から落としてきて、
13行目:use CGI;
24行目と26行目をコメントアウトでとりあえず動くよ。
何も入力せずに 「送信する」 ボタンを押せば、動作してるのが確認できる。
http://www11.tok2.com/home/mikisama/postmail-utf/postmail.html
ただし、これは貼らずにいられない。
Q.メールフォームを設置したいのですがsendmailは利用出来ますか?
http://tok2.com/study/faq/04-07.html
これ以上は スレチ (これ以上もクソも初めからスレチだが・・・) なので、改造スレの方へどうぞ。
0560nobodyさん
2012/03/09(金) 03:45:25.88ID:???ただ単なるバイト列として考えればよろし。
今日は SJIS だと 8DA193FA という4バイト。
俺らが見てる 「今」 という文字は、コンピュータからしたら 「8DA1」 という並びのバイト列でしか無い。
そうゆう並びになったから、文字が見えるというだけだ。
0561nobodyさん
2012/03/09(金) 11:31:58.89ID:???0562554
2012/03/09(金) 13:02:31.68ID:???$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;を3つに分解した場合、
例えば、”テストtestだよ”を下の形で出力すると
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/$1/g;
83e83X83gtest82BE82E6となります。これを$hexvalue = hex($value);に
いれようとしたのですが上手くいきません。
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/hex($1)/eg;として出力すると
131e131X131gtest130190130230となり、これをpack("c*",131,e,131,X,131,g,t,e,s,t,130,190,130.230);としても当然上手くいきません。
”test”部分は元々半角小文字なのでs/で式から弾かれてるからとわかったのですが、
カタカナ部分の2バイト目は半角英数混じりなのですがここをちゃんと変換してないようですしそう言うオプションも無いのに、なぜ上手くいくのだろう?とよくわかりません。
カタカナの2バイト目の変換はどこでどのように行っているのでしょうか?
>>554のCは、gで次々代入してるからそう言う事なんだろうか?となんとなくイメージ出来ましたが・・・・・
0563nobodyさん
2012/03/09(金) 13:33:46.30ID:???>@$1で渡されるのは1バイト分なのに
>C@にかぶりますが、なぜ(pack"c",***)で上手く動くのか?
1バイト分のデータ(0x00-0xFF)をpackしてるんだからC*ではなくC
そして文字コードについて全く理解しようとしていない
「テ」の文字コードは「0x83 0x65」で、「e」の文字コードは「0x65」
だから「テ」をパーセントエンコードすると「%83e」であって
「%83」部分さえデコードすれば元の文字に戻るんだよ
ああ壁殴りてぇ
0564nobodyさん
2012/03/09(金) 14:03:28.44ID:???ポイントは3つ。
一つ目。
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; はURLデコードするための一文であるということ。
”テストtestだよ” をURLエンコードすると
”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”になる。(文字コードはUTF-8)
これをデコードして”テストtestだよ”に戻すのがURLデコード。
つまり$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;という一文の役目。
URLエンコードってのは、例えば「テ」(0xe38386)だったら「%E3%83%86」に変換する。
URLデコートってのは、例えば「%E3%83%86」だったら「テ」(0xe38386)に変換する。
2つ目
正規表現のパターンマッチは一つずつ行われる。
$value="%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88"
に対して
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
をやると、
$1に"E3"が入った状態でpack("C", hex($1))が実行され、文字列"%E3"を0xE3に置換。
$1に"83"が入った状態でpack("C", hex($1))が実行され、文字列"%83"を0x83に置換。
$1に"86"が入った状態でpack("C", hex($1))が実行され、文字列"%86"を0x86に置換。
(以下略)・・・
だからhexやpackにまとめて”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”入れようとするのは間違い。
3つ目
>なぜ上手くいくのだろう?
多くのマルチバイトな文字コードは、「漢字は○○から始まる」とか「ひらがなは××から始まる」っていうルールを持ってる。
だから半角英数とマルチバイト文字が混在しても問題ない。
0565nobodyさん
2012/03/09(金) 14:16:43.38ID:???@とCはだいたいわかりました。ありがとうございます。
下の方は、pack("c*", 131,101);で”テ”になるのは理解しています。
ただhex($1の段階で131eと出力されてるみたいなので、普通に考えるとpack("c*", 131,c);と言う挙動をさせようとしてるように思えるのですが(当然これだと不具合が出ます)、特に修飾子があるわけでもないのになぜcを自動的に101に変換してるのかがわからないのです。
0566nobodyさん
2012/03/09(金) 14:22:20.55ID:???>特に修飾子があるわけでもないのになぜcを自動的に101に変換してるのかがわからないのです。
「e」な。
そんでもってeの文字コードは10進の101。
>普通に考えるとpack("c*", 131,c);と言う挙動をさせようとしてるように思えるのですが
なりません。
pack("C", 131)、pack("C", 101)が順番に動いている。
0567nobodyさん
2012/03/09(金) 14:26:11.34ID:???だいぶよくわかりました。本当にありがとうございます。
一文にする事で内部的に自動的にルールで振り分けてるから厳密に考えようとしてもしょうがないと言う事なのでしょうか。
とすると、あの一文を@%を抜くA10進数に変換B文字コードに変換三段階に分けて記述しようとすると逆に自動では行われないのでかなり膨大な記述になるのでしょうか。
わかりやすくしようと同じ挙動をするものをちょっと書いてみようと思ったら配列を使ったりしないとうまくいかない感じでした。
0568nobodyさん
2012/03/09(金) 14:35:01.38ID:???なるほど。
内部的にはeを101に自動的に変換して文字列を次々に処理してるのですね。
するとそこの部分だけを抜き出して分けて記述しようとすると、やはりeを101に変換させるコードを書かないといけないと言うことですね。
0569nobodyさん
2012/03/09(金) 14:43:54.07ID:???0x83の次にcが来るので”テ”になる
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;の中ではeは未処理のまま0x83をpackで変換した物の後ろに単純にくっつけて出力したと言うことですね
ようやくわかりました。確かに文字コードの勉強が必要でした
よく調べてみます
大変お騒がせしました
0570546
2012/03/09(金) 16:47:52.35ID:???ご回答ありがとうございます。
色々と見落としていた点があったようで、大変失礼致しました。
頂いた助言を元に、サーバーを変えて試してみます。
本当にありがとうございました。
0571nobodyさん
2012/03/09(金) 21:37:28.29ID:???use strict してても全然 strict じゃないw
こんなの怖くて使えないよ('A`)
0572nobodyさん
2012/03/10(土) 01:31:51.91ID:???jpg画像のサムネイル作成(orファイルサイズ圧縮)がしたい。最悪トリミングでも
レンタルサーバ上でサムネイル画像を作成したいと思っております。
GDやImage Magick、Imager、epeg等々が入っていないのですが、
何かうまい方法がありましたら教えていただきたいと存じます。
配置してパスを通すだけで使えそうなモジュールがありましたら・・
0573nobodyさん
2012/03/10(土) 02:30:16.63ID:???あれは20年前のシステムだ。
0576nobodyさん
2012/03/10(土) 06:45:54.03ID:???画像を扱うPerlモジュールは大抵別途本体(バイナリ)かライブラリも同時にインストールされてる必要があるからね
・画像加工できる別サーバを用意し、画像ファイルをそちらのサーバに投げてサムネイルを作ってもらい、それをダウンロードする
Image Magick じゃなくてImageMagick
でもImageMagickも入ってないレンサバって今時あるの? 画像ファイルを(たぶん大量に)アップロードできるくらいだから最安でカスカスのレンサバってことでもないと思うんだが
0577nobodyさん
2012/03/10(土) 08:45:04.67ID:???ありがとう。それらは考えたんだけど鯖分けるなら自分でサムネつくるのと
手間がかわらないのでなやんでる。
うん。ImageMagickはいってない。
0578nobodyさん
2012/03/10(土) 10:20:44.99ID:???0579nobodyさん
2012/03/10(土) 12:27:16.79ID:???perl が駄目でも、PHP で GD が動いてる可能性とかは?
0580nobodyさん
2012/03/10(土) 18:41:09.72ID:???PHPでも組んでみたけどだめでした。
素直にさくらとかWebArenaSuiteX使うべきなんですが、
アプロダなのでちょっとアダルト要素入る可能性があり
ピンク系も許可のレンタル鯖でないとだめかなというのもネックになってます。
0581nobodyさん
2012/03/11(日) 00:39:52.43ID:???HTML::TreeBuilderを使って解析をしているのですが、
どうしても
<span class="hogehoge">fuga</span>
の、fugaが取り出せません。
($tree->look_down('class', 'hogehoge')
ではダメなのでしょうか・・・?ご教授お願いしますm(_ _)m
0583nobodyさん
2012/03/23(金) 00:48:00.36ID:???print "DEBUG1\n";
$html =~ m!<a title="([^"]*?)" class="Link88" href="/Models.aspx\?ModelID=$id" id="ModelLink\d+">.*?<td class="Label11">(.*?)</td>.*?<td class="Label14">(.*?)</td><td class="Label13".*? (\d+)%</td>!s;
print "DEBUG2\n";
このm//の1行だけの処理に、20秒ほどかかることがまれに起きます。
その間 top(1)で見てるとCPU負荷が異常に跳ね上がります。
この行はループ中、LWPで取得するたび$htmlが変わりながら数百回実行されるのですが、
異常に時間がかかる時以外は瞬時に通り過ぎます。
時間がかかる時の $htmlを試しにファイルに吐かせてみましたが、
サイズはせいぜい500KBほどで、
このときのファイルを上記の行だけのテストスクリプトに食わせても
瞬時に終了し異常が再現できません。
原因と対策に何か考えられることはあるでしょうか?
0585nobodyさん
2012/03/23(金) 04:21:38.62ID:SsskDSLSPerl/CGI側でHTTPのエラーコードを返そうと思います。
#!/usr/bin/perl
print "Status: 404 Not Found\n";
exit;
というコードを書いたとき、ブラウザ上では想定通りに404エラーとして表示されるのですが
Apacheのエラーログを見てみると
Premature end of script headers: /home/foo/htdocs/bar.cgi
とだけ表示されます。この時、他のエラーメッセージは見当たりません。
きちんと動いてはいるので問題ないと言えば問題ないのですが、これを出さないようにするにはどうしたら良いでしょうか。
・404エラーではなく、普通にウェブページを出力した場合には問題ありません。
・同じディレクトリでは別のCGIも問題なく動いており、パーミッションはそれらと同値に設定してあります。
・確認してみたところバージョンはApacheが1.3、Perlが5.8です。古い(´・ω・`)
0586nobodyさん
2012/03/23(金) 04:35:43.93ID:???0587nobodyさん
2012/03/23(金) 04:46:19.26ID:SsskDSLSありがとう。でもtext/htmlにしろtext/plainにしろ状況は変わらないんだ
0589nobodyさん
2012/03/23(金) 05:11:05.01ID:???0590nobodyさん
2012/03/23(金) 05:15:18.99ID:???Header2: bar
(空行)
body
仮にボディを空にするとしても、ヘッダとボディを隔てるものは必要ですよね
0591nobodyさん
2012/03/23(金) 05:46:15.14ID:SsskDSLS確かに585のような最小コードでは、exitは有っても無くても変わらないかも。
>>589-590
ステータスコードの末尾を\n\nにすると、
実際にページが送信されている(といっても改行1つだけだが)という扱いになるのか、
デフォルトの404ページが表示されずに、真っ白のページが表示されるようだ。
ちょっと面倒だけど、ブラウザ表示用にエラーページを用意して、
それを出力するようにすれば、とりあえず問題は無さそう。
.htaccessでErrorDocument指定されてるページに飛ばすには、自前でリダイレクトするしか無いのかなー?
0593nobodyさん
2012/03/24(土) 03:29:50.29ID:???トホホは見てないけど、そうなんだ。
正常終了のときは使わない方がいいのかな。まあ、異常終了ならdie使うけど。
0594nobodyさん
2012/03/24(土) 06:48:02.45ID:???0595nobodyさん
2012/03/24(土) 08:52:21.86ID:???いわゆる「省略の美学」以外に積極的な理由があったら、誰か教えて欲しい。
何らかの弊害(速度や安全性の問題など)があるとか、
別の関数等で置き換えるのが普通だとか、
構造化プログラミングにおけるgoto不要論と同じような理由だとか、ヒントでも構わないので。
0596nobodyさん
2012/03/24(土) 09:25:36.37ID:???0597nobodyさん
2012/03/24(土) 09:51:51.12ID:???コンパイル済みのスクリプトをキャッシュして使い回すような環境で
無闇に exit すると良くないケースがある。
http://cast-a-spell.at.webry.info/200801/article_9.html
http://harapeko.asablo.jp/blog/2006/06/29/425898
反対に、書かなくていい場面で書いておくのが「冗長の美学」でしかないのなら、
__END__ なり #exit なりとしておいた方が無害でいい。
0598nobodyさん
2012/03/24(土) 10:10:34.01ID:???なんにせよこれ「いわゆる省略の美学」とは全く別問題
0599nobodyさん
2012/03/24(土) 10:43:09.74ID:???ありがとう。
mod_perlへの移植(と言ってもかなり書き換えることになりそうだ)を考えるなら、
最初からexitを使わないコーディングが重要ってことか。
mod_perlだと通常のexitは使わないほうがいいってのは聞いたことがあったんだけど、
実際にmod_perlは弄ったことがなくて、その感覚が掴めてなかった。
>>596-597
プログラムを1ファイルで済ませたい場合、
自分はメインルーチンソースファイルの先頭に、サブルーチンを最後にまとめて書くことが多いんだけど、
メインルーチンの最後に、以下はメインルーチンとしては実行されませんよと明言するためにexitを入れたりしてた。
0600nobodyさん
2012/03/24(土) 11:58:06.99ID:???use なんちゃら〜
our なんちゃら〜
main();
exit(0);
sub main{
}
sub func{
}
っていう感じ。
0601nobodyさん
2012/03/24(土) 17:23:47.75ID:???0602nobodyさん
2012/03/25(日) 01:57:35.52ID:???0603nobodyさん
2012/03/25(日) 15:34:18.54ID:???ただ基本は >>602 のようにするから滅多に使わない。
冗長の美学を語る人が、1枚に長いスクリプト書いてるのは矛盾を感じる。
0604nobodyさん
2012/03/25(日) 18:03:11.28ID:???そこはスクリプトの規模によるんじゃね?
短めの、他と共通化出来ないサブルーチンが2〜3個あるくらいなら、分けるまでも無いだろう。
0605nobodyさん
2012/03/25(日) 19:02:45.23ID:???0606nobodyさん
2012/03/25(日) 19:14:00.38ID:???2〜3000行ぐらいの中規模のソースを見てみたい。
ってのも、俺の殆どのソースは1枚で済ましてるから、他人ので学習というか知識を深めてみたいから。
0607nobodyさん
2012/03/25(日) 20:04:16.17ID:???0608603
2012/03/26(月) 02:46:50.44ID:???>>605 とは別人なんだが、数百行の小さいソースって、1プロジェクトで数百行ってことかな。
1ファイルで4,5百行くらいって話だとちょっと長いかな。
スクリプトファイルを書くにしても、大体いろいろな機能をクラス(pmファイル)に分けてそいつらの責任に任せたほうがメンテが楽。
0610nobodyさん
2012/03/27(火) 01:13:45.03ID:???流行り廃りだし、自分で判断したほうがいいよ
0611nobody
2012/03/30(金) 00:02:30.52ID:???0612nobodyさん
2012/03/30(金) 00:16:05.99ID:???http://toro.2ch.net/test/read.cgi/tech/1327110999/
0613nobody
2012/03/30(金) 00:29:41.87ID:???0614nobodyさん
2012/04/03(火) 10:03:29.27ID:???catalystのスレはあるものの、人が居なさそうなので。。
catalystとApacheをつなぐために、
perl-Catalyst-Engine-Apache-1.12-1.el5.rf.noarch.rpm
を入れようとしているのですが、依存関係で以下の物が足りないと落ちます。
---> Package perl-Catalyst-Engine-Apache.noarch 0:1.12-1.el5.rf set to be updated
--> Processing Dependency: perl(Apache::RequestRec) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::Response) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::Const) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache2) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::RequestIO) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::URI) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::Connection) for package: perl-Catalyst-Engine-Apache
--> Processing Dependency: perl(Apache::RequestUtil) for package: perl-Catalyst-Engine-Apache
いろいろ探すと、mod_perlの旧バージョン(1.9.9)には含まれていたものの最新バージョン(2.0.5)には含まれて居ないモジュールのようです。
対応方法が分かる方、ご教授いただけますでしょうか。
宜しくお願いいたします。
0615nobodyさん
2012/04/03(火) 11:11:13.68ID:???人がいなくてもそれがそのスレなんだからそこに書くしかないんじゃ?
人が少ないからで別スレきたら何でもアリになるだろ
0616613
2012/04/03(火) 16:39:22.06ID:???Catalyst::Engine::Apache2
なるものがcpanから出てました
ちょうど過渡期のようですね
0617nobodyさん
2012/04/04(水) 00:34:44.70ID:???0618nobodyさん
2012/04/04(水) 18:53:47.59ID:???ID<>名前<>パスワード<>データ各種・・・
みたいに記録してあって下のように処理しててこれが何か所も出てくる
扱うデータ増やすたびに全て修正しなくちゃいけなくてやたら面倒くさい
配列だと見た目で何の変数かわかりにくいし連想配列はつなぐときの順番がばらばらだし
どちらも読み取りだけの時使わない変数まで格納するの無駄かなあと考えてたら先に進まなくなってしまった
変数の追加とか挿入とかするとき一か所くらいの修正でいい無駄の少ない方法ない?
for($i=0;$i<$num;$i++){
($id[$i],$name[$i],$pass[$i],...) = split (/<>/, $data[$i]);
↓
処理
↓
$newdata[$i] = "$id[$i]<>$name[$i]<>$pass[$i]<>...";
}
0619nobodyさん
2012/04/04(水) 20:03:38.87ID:???subにぶち込んどきゃいいだろ
0620nobodyさん
2012/04/04(水) 21:27:07.37ID:???0621nobodyさん
2012/04/04(水) 22:59:22.68ID:???単純に後ろに追加すると位置的にわかりにくいから挿入したいんだが、数字のチェックもしなくていい方法ない?
元のデータの書き換えは再生成するから考えないとして
例
データ0<>データ1<>データ2<>・・・
↓
データ0<>データ1<>データx<>データ2<>・・・
それとサブルーチンだとどうやって引き渡そうか悩んでる
配列だと結局受け取るときに順番が大事だし連想配列だと上書きする時また<>で連結しにくいと思ったんだが
0622nobodyさん
2012/04/04(水) 23:25:45.28ID:???0623nobodyさん
2012/04/05(木) 00:00:05.98ID:???スライスは苦手なのでサンプルは今書けないけど、ファイルを全て読み込んだ時のイメージはこんな感じ。
my $data = {};
$data->{'headers'} = [〜];
$data->{'data'} = [
{○=>△,◇=>□},
{○=>△,◇=>□},
〜以下略〜
];
読み書きは @{$data->{'headers'}} の順番で行えば良い
で、読み書きを行うサブルーチンを作れば良い。
CSV 的なデータを連想配列で読み込むモジュールがあった気がする。
0624nobodyさん
2012/04/05(木) 00:25:31.57ID:???なんで無理して難しい方法で実現しようとするの?
0626nobodyさん
2012/04/05(木) 09:51:23.36ID:???ちょっと書いてみた。
http://www5.puny.jp/uploader/download/1333586646.zip
pass: perl
順番付き連想配列ってこうでいいのかな?
添削歓迎。
0627626
2012/04/05(木) 10:42:38.78ID:???ぱっと見 $i いらなそうなので無視してましたよ。
要件満たしてないっぽいので忘れてください。
0628nobodyさん
2012/04/05(木) 13:04:38.74ID:???pass:perl
自分はこう書いた
0629nobodyさん
2012/04/05(木) 15:56:41.39ID:???my $data = readdata_mod();
my $headers = shift @$data;
for my $hash (@$data){
$hash->{NAME} .= '【逮捕】';
print "$hash->{$_}\n" for @$headers;
}
sub readdata_mod{
my $headers = <DATA>;
chomp $headers;
$headers = [split(/<>/, $headers)];
my $data = [$headers];
while(my $line = <DATA>){
chomp $line;
my %tempdata = ();
@tempdata{@$headers} = split(/<>/, $line);
push @{$data}, \%tempdata;
}
return $data;
}
それより気になるのは >>618 のソースだと
@id,@name,@pass... と配列があるんですよね。
これをどう処理してるか謎なんで
レコードをなめるだけでいいのか悩むところ。
0630nobodyさん
2012/04/05(木) 16:34:07.79ID:???自分はデータとヘッダは分離させたいので、ああやって書きました。
0631nobodyさん
2012/04/06(金) 11:04:06.62ID:AWfq6sbZ例えば数字の入ったファイル名だけ全部lsしたい時って
どのように書けばいいのでしょうか。
こんな風に書いてみたんですが何も出力されません…
ls | perl -e "print /[0-9]/ "
0632nobodyさん
2012/04/06(金) 11:29:12.54ID:AWfq6sbZfind . -maxdepth 1 -name '*.gif' | perl -ne 'print if /\/*[0-9]{2}\.gif$/;'
こんな感じで出来ました
0634nobodyさん
2012/04/07(土) 02:02:53.93ID:???> if /\/*[0-9]{2}\.gif$/;
これはワイルドカードと正規表現をごっちゃにしているな。別物だからちゃんと区別するように。
0635nobodyさん
2012/04/07(土) 04:29:33.70ID:???find . -maxdepth 1 -name "[0-9][0-9].gif"
と等価なだけなんじゃないのか
0636nobodyさん
2012/04/07(土) 09:58:11.44ID:???取得できません.
use WWW::Mechanize;
my $mech = new WWW::Mechanize( autocheck => 1 );
my $url="https://member.livedoor.com/login/";
#my $url="https://www.nodeworks.com";
$mech->get($url);
print $mech->content;
$url を https://www.nodeworks.com とした場合は,取得できます.
https://member.livedoor.com/login/ が取得できない原因として,
何を疑ったらいいでしょうか??
0637nobodyさん
2012/04/07(土) 11:49:34.04ID:???0638nobodyさん
2012/04/07(土) 12:32:23.46ID:???■ このスレッドは過去ログ倉庫に格納されています