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/
0484479
2012/02/07(火) 01:13:45.57ID:eo0HNsOB>>480 >>481
LWP 使ってみました。http://www.sea-bird.org/doc/Solaris8/Perl_4.html
出来ました
>>482
wget をPerlから?使う方法が分かりませんでした。コマンドとして使うという事なら目的と違います
>>483
上記チュートリアルサイトにて telnet も試しましたが、駄目でした
実は本当にやりたいことは別にあったので、すみませんが質問をやり直させてください
このサイトは、映画レビューサイトなのですが、
http://cinema.pia.co.jp/user/xxxxx/imp/all/ (xxxxxは数字)
にて、各ユーザーのレビュー一覧を見る事が出来ます
(実は自分のレビューを抽出したいだけです)
しかし、Perlからのアクセスでは、LWPを使ってもここではじかれてしまいます
(IE8の「表示→ソース」では見れるが、Perlにprintさせると違うものになっている)
どなたか原因分かりますでしょうか?
0485nobodyさん
2012/02/07(火) 01:25:44.20ID:???0486nobodyさん
2012/02/07(火) 01:48:21.80ID:???use LWP::UserAgent;
use HTTP:Request::Common;
my $ua = LWP::UserAnget->new();
$ua->agent('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)');
my $req = GET('http://cinema.pia.co.jp/user/xxxxx/imp/all/');
my $res = $ua->request($req);
if(open(my $outfh, '>', 'debug.html')){
print $outfh $res->content() || '';
close($outfh);
}
0487479
2012/02/07(火) 03:24:39.22ID:???>>485 駄目でした。ソースの190行目辺りからが違ってきます
上手くいく時は、以下のようになります。良く分かりませんが。
<div id="mainImpMain">
<form method="get" class="common">
<ul class="pagedLink">
>>486
出来ました。ありがとうございました。
0489nobodyさん
2012/02/08(水) 00:00:54.11ID:???自分自身が呼ばれて起動された際の HTTP ヘッダってどうやって確認するのでしょうか?
use CGI の header はヘッダを出力するためのものっぽいし・・・
0490nobodyさん
2012/02/08(水) 00:27:39.96ID:???それはあんたのスクリプトがどうやって呼び出されているかによる。
httpd に Apache を使ってて CGI 経由で呼び出されているなら
Apache のマニュアルと CGI の仕様書を読んでくれ。
http://httpd.apache.org/docs/
http://www.studyinghttp.net/rfc_ja/rfc3875
あと HTTP の仕組みもきちんと理解してくれ。
http://www.studyinghttp.net/rfc_ja/rfc2616
0491nobodyさん
2012/02/08(水) 00:51:03.57ID:???自身のスクリプトが呼ばれた際の HTTP ヘッダを得る方法を伺っているわけでして・・・
0493nobodyさん
2012/02/08(水) 04:36:08.44ID:???↑
最近の若い奴は、物事の尋ね方も知らないのか?ブツクサブツクサ
0494nobodyさん
2012/02/08(水) 07:53:34.31ID:D9+63/xk抜粋するようなプログラムを作成したいと思います。
例えば、次のような文章があった場合、
------------------------------------
ほげほげふがふが
http://example.com/hogehoge1
ほげほげふがふが
http://example.com/satitama1/saitama.html
<!-- link -->
リンク一覧
〜テスト〜 http://example.com/hogehoge2/test.hmtl
〜さいたま〜 http://example.com/satitama2
東京
<!-- /link -->
------------------------------------
結果は
------------------------------------
<a href="http://example.com/hogehoge2/test.hmtl">テスト</a>
<a href="http://example.com/satitama2">さいたま</a>
------------------------------------
のようにしたいのですが、どのように書いたらよいでしょうか?
尚、URLを抜き出す正規表現は次のように書きました。
(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)
環境は、CentOS5 perl5.10です
0495nobodyさん
2012/02/08(水) 10:31:20.53ID:???http://perldoc.jp/docs/perl/5.10.1/perlfaq6.pod#How32can32I32pull32out32lines32between32two32patterns32that32are32themselves32on32different32lines63
my $protocol = qr/(?:https?|ftp)/;
my $format = '<a href="%2$s">%1$s</a>' . "\n";
my $text = do { ... };
my @link;
while ($text =~ m{<!-- link -->(.*?)<!-- /link -->}gs) {
my $links = $1;
push @link, sprintf $format, $1, $2
while $links =~ m{〜(.*?)〜.*?($protocol://[!#-;=?-\[\]_a-z~]+)}gos;
}
print @link;
0498nobodyさん
2012/02/19(日) 12:41:02.48ID:???下着は、妻と娘のお下がりです。
おまけに洋式トイレ、便座が上がってるとか、飛沫が飛んでるとか、いちいち五月蝿いんです。
おかげで、トイレは座ってするように強要され、もうブリーフの前、開ける必要が無いんだからと、私達のお下がりで十分でしょう。と、ここ何年も私の物は買ってくれません。
今では開き直って、ブラジャーもしています。
家に居る時は、娘のスカートを穿き、外出は娘のパンツ、ジーンズ穿いていきます。
娘は、始めは困惑していたが今では慣れ、何でも貸してくれます。
妻の洋服、パンツ、スカートはウエストがちょっときつい。
ストレッチの物は、勝手に着ています。
0500nobodyさん
2012/02/19(日) 15:19:47.97ID:???0501nobodyさん
2012/02/19(日) 17:53:14.70ID:???0503nobodyさん
2012/02/20(月) 14:28:00.53ID:???my $family = Family->new();
$family->husband('>>498'); $family->wife('百合子(仮)'); $family->daughter('楓(仮)');
my $corp = Corp->new(); $corp->salaryCalculation();
$family->income($family->husband(), $corp->salary());
if($family->income($family->husband()) > 250000){
# トイレ
my $toto = Toilet->new();
$toto->type('EU'); # JA or EU
my $urine = $family->urine($family->husband()); # 小便をする
$toto->urine($urine);
if($toto->is_splash()){ $toto->forced_to_sit(1); } # トイレの用足しには座りを強制
# 下着
if($toto->forced_to_sit()){ $family->underwear($family->husband(), $family->underwear($family->wife()); }
# 他の着衣
if($family->underwear($family->husband()) eq $family->underwear($family->wife())){
$family->brassiere($family->husband(), $family->brassiere($family->wife());
$family->skirt($family->husband(), $family->skirt($family->daughter());
$family->jeans($family->husband(), $family->jeans($family->daughter());
}
}else{
$family->underwear($family->husband(), 'BOXER PANTS');
$family->brassiere($family->husband(), undef);
$family->skirt($family->husband(), undef);
$family->jeans($family->husband(), 'EDWIN');
}
>>498 じゃないけど、これが限界っす><
娘や妻への下着のセットは省いたw
0504nobodyさん
2012/02/20(月) 14:29:13.01ID:???0505nobodyさん
2012/02/20(月) 22:20:39.95ID:???0506nobodyさん
2012/02/21(火) 10:11:33.62ID:???× $corp->salary()
○ $corp->salary($family->husband())
サラリーを得るのに名前を渡してなかった><
× if($family->income($family->husband()) > 250000){
○ if($family->income($family->husband()) < 250000){
不等号の向き間違えたw
0507nobodyさん
2012/02/24(金) 16:30:51.95ID:???RSSのデータから、日付時刻とタイトル、そのリンク先URLを一覧にして取得したいと考えています。
・ブラウザに「取得」ボタンなどを表示し、それをクリックすることで最新の一覧を表示
・以前に取得したものは取得しない
先ずは上記2点を実装したいです。
良い方法や参考サイトなどをご教示頂きたいです。
よろしくお願いいたします。
0508nobodyさん
2012/02/24(金) 17:02:28.77ID:???>>1-2
こんなCGI探してます 23
http://kohada.2ch.net/test/read.cgi/php/1219654359/
依頼されたツールを誰かが作るスレ
http://kohada.2ch.net/test/read.cgi/php/1078997682/
金出すからスクリプト作ってよvol.1
http://kohada.2ch.net/test/read.cgi/php/1150508106/
自作CGIを評価するスレ
http://kohada.2ch.net/test/read.cgi/php/1049514428/
自分の作ったCGIスクリプトをデバッグするスレ
http://kohada.2ch.net/test/read.cgi/php/1011174442/
http://kohada.2ch.net/test/read.cgi/php/1036141603/420-435
0510nobodyさん
2012/02/25(土) 00:54:16.96ID:???全国紙では唯一、増税批判の姿勢を取っていた産経新聞に、
昨夏、国税の税務調査が入った。
財務省にとって税務調査は言論統制の最強の武器で、
2009年には朝日、読売が申告漏れを指摘され、
それを機に朝日は増税礼賛へと傾斜し、
読売は財務省幹部の天下りを受け入れた経緯がある。
国税庁という「警察力」は、財務省の最強の武器なのです。
何しろ、徴税というのは「裁量範囲」が広い業務で、
調査官の「判断」により合法とされたり、
脱税とされたりしてしまうのです。
「去年はOKだったのに、今年は何でダメなんだ!」
といった事態は普通に起こります。
0511nobodyさん
2012/02/25(土) 13:09:52.88ID:???まで読んだ
0512nobodyさん
2012/02/27(月) 00:22:44.82ID:???まで読んだ
0513nobodyさん
2012/02/27(月) 00:26:08.69ID:???に見えた
0514nobodyさん
2012/02/27(月) 00:46:41.84ID:???0515nobodyさん
2012/02/27(月) 07:22:57.09ID:???0516nobodyさん
2012/02/27(月) 14:07:22.77ID:???0517nobodyさん
2012/02/28(火) 00:06:11.43ID:0AwG+yg0ttp://findrjp.com/formen/
これはPHPだと思うんですけど
作るとしたらelsifで作る感じでしょうか?
こういうのってすぐ作れますか?
0518nobodyさん
2012/02/28(火) 00:51:16.58ID:???0519nobodyさん
2012/02/28(火) 00:59:39.36ID:???0520nobodyさん
2012/02/28(火) 01:10:42.34ID:???0521nobodyさん
2012/02/28(火) 01:35:37.84ID:0AwG+yg0どうせテメーらにはできないんだろwwwww
って挑発したらヒント教えてくれますか?
elsifは分かります
0522nobodyさん
2012/02/28(火) 10:18:18.70ID:???0523nobodyさん
2012/02/28(火) 14:34:14.89ID:???スクリプト中で開くファイルはスクリプトのあるディレクトリのサブディレクトリに置いており、
全てフルパスで開くようにしています。
昨日初めて mod_perl を入れたところ、FindBin $Bin や Cwd が Apache のディレクトリになっています。
$ENV{'SCRIPT_FILENAME'} を使おうかと思ったのですが、デバッグでコンソールで実行することもあるため
$ENV{'SCRIPT_FILENAME'} は使えません。
$0 では cron でも mod_perl でも CGI でもコンソールでも期待する値が得られました。
./hoge.pl で実行して dirname($0) すると ./ 返ると書いてある場所もありますが、当方では
確認できませんでした。
そこで疑問に思ったのが、$0 を 100% 信用してもいいのか? ということです。
「他のプログラムにより強制的に書き換えられる」 という可能性は今は無しでお願いします。
0524nobodyさん
2012/02/28(火) 14:46:37.42ID:???$0 は perl に与えられた path みたいですね。
HTTPd とかはフルパスを作って渡してくれてるっぽいけど、
コンソールではそうではない。
むぅ。。。
0525nobodyさん
2012/02/29(水) 01:59:02.18ID:???Not a CODE reference 〜
っていうエラーが出た。
そのエラーが言う行は
main();
としかやってないのに。。。
0526nobodyさん
2012/02/29(水) 11:28:36.69ID:???0527nobodyさん
2012/03/02(金) 13:17:08.38ID:???ユーザーによる新規会員登録後、そのユーザー毎にディレクトリを自動的に生成し、
ユーザディレクトリ毎に容量制限を割り当てたいのですが、可能なのでしょうか?
ディレクトリを自動生成するところまではできています。
0528nobodyさん
2012/03/02(金) 18:09:30.62ID:???quota の導入。
quota を入れるなら、システムに実際にユーザーの作成が必要。
0529nobodyさん
2012/03/03(土) 19:01:18.46ID:???ファイル書き込み
現在使用サイズを書いたファイルorDBを更新(現在使用サイズ+これから書き出すサイズ)
}
サイズ取得はuse bytes; $data_size = bytes::length($data); かな。
0530nobodyさん
2012/03/03(土) 19:19:52.03ID:???検索しにくくて、、、、こういうのどうやって探せばいいんでしょう。
perlvarになかったので特殊変数ではないっぽい
0531nobodyさん
2012/03/03(土) 19:27:25.41ID:???0532nobodyさん
2012/03/04(日) 02:19:05.56ID:???0534530
2012/03/04(日) 17:01:24.24ID:???ゼロじゃなくて大文字のオーだったんですね。
OS名ということはシステムからPerlに提供されているものだと思って、%ENVと同じところに記述されているはずって当たりをつけたら
perlvarにありました。
0535nobodyさん
2012/03/04(日) 20:39:47.27ID:???0536532
2012/03/05(月) 05:40:34.80ID:???そんなことはない。$^0 は確かに特殊変数でもなんでもなかった訳だし。
ためしに$^0をプリントさせたらエラーで実行できなかったし。
0537nobodyさん
2012/03/05(月) 22:13:10.43ID:???0538nobodyさん
2012/03/06(火) 01:30:36.74ID:???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ほどで、
このときのファイルを上記の行だけのテストスクリプトに食わせても
瞬時に終了し異常が再現できません。
原因と対策に何か考えられることはあるでしょうか?
■ このスレッドは過去ログ倉庫に格納されています