Perlコーディング初心者質問スレ Part 60
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/09/03(木) 23:51:12ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0606nobodyさん
2010/02/11(木) 19:11:25ID:???core特有のCLI版PHPの呼び出し方の問題だからここの管轄でもなくて
レン鯖板の管轄だと思う。暇だからこれやる。
ttp://www.google.co.jp/custom?domains=sb.xrea.com&q=php+cli&sitesearch=sb.xrea.com&hl=ja
0607nobodyさん
2010/02/11(木) 19:53:29ID:???ありがとうこざいます
教えてもらったリンク先を参考に
/usr/local/bin/php5cli でできました!
皆様ありがとうこざいました。
0608nobodyさん
2010/02/14(日) 07:12:06ID:???上記のように書いてみたのですが、エラーが出ます。
二重にクウォートというのは出来ないんでしょうか?
外部コマンドでクォートを必要とする場合はどう記述すべきでしょうか?
0609nobodyさん
2010/02/14(日) 11:27:31ID:???エスケープしろよ
0610nobodyさん
2010/02/14(日) 11:33:14ID:???0611nobodyさん
2010/02/14(日) 11:43:44ID:???system("/usr/bin/hoge", "fuga fuga");
0612nobodyさん
2010/02/14(日) 12:26:01ID:???この板の人は本当に親切で助かります
ちょっとしたことも検索で見つけるのは難しいですね
0613nobodyさん
2010/02/18(木) 01:04:18ID:???use HTML::TreeBuilder;
my $html = get("http://xxxxx");
my $tree = HTML::TreeBuilder->new;
$tree->parse($html);
$tree->eof();
my $a = "東京";
my $b = "$tree->findとか色々やって最終的に 東京 をセット";
print "A $a B $b<br />\n";
print utf8::is_utf8($a) ? 'UTF-8 Flag' : 'not UTF-8 Flag';
print utf8::is_utf8($b) ? 'UTF-8 Flag' : 'not UTF-8 Flag';
-----------------------------------------
上記をCGI処理するとweb上の表示は
A 東京 B 東京
UTF-8 FlagUTF-8 Flag
となります。
両方utf-8のようなのですが、ソースを見ると下記のように2個目の東京が文字化けしています。
A 東京 B ?x6771;?x4EAC;
if( $a =~ /$b/ )としたいのですが、うまくいきません。
文字化け部分を戻したいのですがどうすればよいでしょうか?
htmlコードの取得先はヘッダがshift-jisでした。
※use Encode qw/ decode /; など色々試しましたがよくわからずうまくいきませんでした。
0614nobodyさん
2010/02/18(木) 03:16:49ID:???use HTML::Entities;
print "same.\n" if '東京' eq decode_entities('東京');
0615613
2010/02/18(木) 09:15:46ID:???できました!!
これができずに半日ずっとぐぐったり試行錯誤して結局できてなかったので助かりました。
自分だけでは数日はEntitiesにたどり着けなかったかもしれません。
ありがとうございました。
0616nobodyさん
2010/02/18(木) 18:04:59ID:???どうすればいいでしょうか?。。。
0617nobodyさん
2010/02/18(木) 18:10:31ID:???CPANに聞けや
0618nobodyさん
2010/02/18(木) 18:53:38ID:???0619nobodyさん
2010/02/20(土) 15:02:55ID:???一番目 %e6%9d%b1%e4%ba%ac
二番目 東京
となります。
�@一番目は『東京』となってほしいのですが、なぜ『%e6%9d%b1%e4%ba%ac』なのでしょうか?
�A『%93%8C%8B%9E』も『%e6%9d%b1%e4%ba%ac』もデコードサイトで変換したらどちらも東京になりました。URLエンコードには2種類あるのでしょうか?
�B二番目は『東京』ではなく『%93%8C%8B%9E』を期待したのですが、なぜエンコードしたのに『東京』なのでしょうか?
以上、3点についてわからないので教えていただけないでしょうか。
最終的に行いたいことは、URLから拾った文字と別から拾った文字をマッチするかの確認です。
#-------------------------------------------
use CGI;
use Encode qw/from_to/;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
my $query = new CGI;
my $item = $query->param('item');
my $encode = guess_encoding($item);
from_to($item, $encode->name, 'utf-8'); #$itemがSHIFTJISだったので変換
$item =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$item =~ tr/ /+/;
printf("<pre>一番目 %s</pre>\n",$item);
my $str = "東京";
$str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$str =~ tr/ /+/;
printf("<pre>二番目 %s</pre>\n",$str);
0620nobodyさん
2010/02/20(土) 15:19:00ID:???二番目はURLデコードじゃなくURLエンコードしないとそりゃ期待どおりにならんやろ
0621nobodyさん
2010/02/20(土) 15:46:06ID:???投稿されたメッセージから、半角英字を禁止したいと思い
if ($in{'message'} =~ /[a-zA-Z]/) {$flg = 1;}
としたのですが、これだと改行の<br>まで弾かれてしまいます。
そこで、bとrをのぞくように、次のようにしました。
if ($in{'message'} =~ /[(a|c-q|s-z)A-Z]/) {$flg = 1;}
これでも、bとrは除けるのですが、<br>だけを除く記述方法はありませんか?
よろしくお願いします。
0622nobodyさん
2010/02/20(土) 15:58:07ID:???0624nobodyさん
2010/02/20(土) 16:14:16ID:???/(?:^|[^a-zA-Z])(?:(?<!<)|(?!br>))[a-zA-Z]/
だった。
0625nobodyさん
2010/02/20(土) 16:21:22ID:???ありがとうございます。
出来ました!
と思ったら、確認画面にはうまくいけたのですが、そこから、投稿処理に入ろうと
すると、<>が<とかになるみたいで、投稿できませんでした。。
brだけ除外するには、
/\b(br)[a-zA-Z]/
とすれば良いのでしょうか。何度も質問してすいません。。
0626nobodyさん
2010/02/20(土) 16:48:32ID:???タグを禁止したいならbr意外も禁止しろ
お前みたいな奴がいると脆弱性付きの糞サイトが出来るんだよ
XSSでググれ
HTML::Entitiesとかで対策しろ
0627nobodyさん
2010/02/20(土) 17:05:45ID:???XSS対策は施されているフリースクリプトです。サニタイズされてます。
それを更に、スパム除けとして、半角英字を禁止したいと思ったまでです。
ただ、ユーザーがテキストエリアで、改行すると、それが改行タグになり、
半角英字として扱われ投稿できなくなるみたいで困ってたわけです。
>>622-623のヒントでなんとかやってみます。ありがとうございました。
0630629
2010/02/20(土) 18:37:42ID:???SPAM対策なら、画像でパスコード生成して入力させればいいさ。
0631nobodyさん
2010/02/21(日) 19:39:13ID:???0632619
2010/02/22(月) 00:59:57ID:???ありがとうございます。
先にURLデコードしましたが結果は同じでした。
下記を実行するとこのような表示になります。↓
(A番などは文字化けしていますが、一つ一つを見ると
93,8C,8B,9EとUTF8コードがきているように見えます)
http://www.rupan.net/uploader/download/1266767521.jpg
C番とD番の間はちゃんと『東京』と表示されるのですが、
同じものを表示したのにD番だと文字化けします。
うまくコード変換が出来ていないようです。
下記スクリプトは無視してもかまいませんので、
URLの引数をperl内のUTF-8にする方法を教えてください。
#-------------------------------------------
#ヘッダ部分は619と同じなので省略
printf("<pre>A番 %s</pre>\n",$item);
$item =~ tr/+/ /;
$item =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
printf("<pre>B番 %s</pre>\n",$item);
$encode = guess_encoding($item);
printf("<pre>C番 %s</pre>\n",$encode->name);
from_to($item, $encode->name, 'utf-8');
printf("%s<br />\n",$item);
printf("D番 %s<br />\n",$item);
printf("<br />\n");
0633nobodyさん
2010/02/22(月) 01:53:28ID:???use strict;
use utf8; # 619の(3)が起きるのはこれのせいなのに隠すな
use Encode;
use URI::Escape;
# print "Content-Type: text/plain; charset=UTF-8\n\n";
my $tokyo = '東京';
my @enc = qw(utf8 euc-jp shiftjis 7bit-jis);
printf "%s: %s\n", $_, uri_escape(encode($_, $tokyo)) for @enc; # これを何か勘違いしてる
print "\n";
$tokyo =~ s/(\W)/'%'.unpack('H2', $1)/eg;
print $tokyo, "\n";
utf8::encode($tokyo); # no utf8;
$tokyo =~ s/(\W)/'%'.unpack('H2', $1)/eg;
print $tokyo, "\n";
0634nobodyさん
2010/02/22(月) 03:50:14ID:???0635619
2010/02/22(月) 13:04:14ID:???ありがとうございます。
use utf8を入れていたのを記入漏れしていましたご指摘ありがとうございます。
書いていただいたコードを参考にすることで変換することができました。
また、参考コードは日本語を扱うときに色々確認できそうなので保存させていただきました。
ありがとうございます。
※最終的に下記のようになりました。
#----------------------------------
use utf8;
use Encode qw/from_to/;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
use URI::Escape;
#----------------------------------
#shiftjisをutf8に変換
my $encode = guess_encoding($item);
from_to($item, $encode->name, 'utf-8');
#----------------------------------
#URLデコード
$item =~ tr/+/ /;
$item =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
utf8::decode($item);
printf("<pre>文字列 %s</pre>\n",$item);
0636nobodyさん
2010/02/22(月) 16:00:00ID:???ローカルファイル2万行の処理時間が、1秒→13秒になりました。
(もし200万行の処理になると、単純計算100→1300秒・・・)
ネットワーク越しの処理とか、他にボトルネックがない場面で使うなって事なんでしょうけど、
ローカルファイル処理の進捗表示をしたい場合、皆様どうしてますか?
0637nobodyさん
2010/02/22(月) 16:08:56ID:???0638nobodyさん
2010/02/22(月) 16:17:37ID:???100かそこらだから、余計な更新をしなければそれ以上遅くなること
はないと思うが。
0639636
2010/02/22(月) 18:18:51ID:???端末上の表示です。
>>638
スクリプトの中身は、キーワードをハッシュキーにしてインクリメント、
最後にキーワードの総出現数を出力してるだけの簡単なものです。
while (<$fh>) {
処理
$hash{$_}++;
$term->update( $term->lastupdate + length $_ );
}
こんなカンジです。
0640nobodyさん
2010/02/22(月) 22:11:22ID:???毎回update呼ぶと効率悪いよ。マニュアルよく嫁。
特にA (much) more efficient updateのあたり。
0642nobodyさん
2010/02/24(水) 17:33:29ID:???・a.txtの中身
1
2
3
・b.txtの中身
1
3
4
上記のような状況で、「4(b.txtにあってa.txtにない行)」を取得したいのですが、
こういった処理でオーソドックスな方法はあるのでしょうか?
今のところwhileかforeachで各ファイルを一行ずつ読み取る事を考えているのですが…
ちなみに各ファイルはせいぜい十数キロバイト程度で、一日にせいぜい数回程度しか実行せず、
実行するマシンの性能も十分に高いのでメモリ消費などは無視出来るレベルです
0643642
2010/02/24(水) 18:04:59ID:???a.txt、b.txtそれぞれ生成時にソート済みで、
どちらもとあるディレクトリのファイルリストなのでファイル内で重複する行は存在しません
0644nobodyさん
2010/02/24(水) 18:33:43ID:???ソート条件があるならperlを持ち出すまでもなく
comm -13 a.txt b.txt
でいいと思うが、どうしても車輪を再発明したければ
1行ずつ読みながら比較でもいいし、a.txtをまとめて
ハッシュに読み込んでb.txtを読み出しながらハッシュに
なければ書き出しでもいい。
0645nobodyさん
2010/02/24(水) 18:56:55ID:???回答ありがとうございます
残念ながら、さしあたり実行環境はWindowsXPを予定しているので、
commコマンドは使えません
また、ゆくゆくは他のバージョンのWindowsやLinuxなどでも動作させる予定なので
可能な限りOSに依存しない方法を採用する必要があるのです
0646nobodyさん
2010/02/24(水) 19:02:38ID:???perl -lne 'BEGIN{ $i = 1 } $h{$_} += $i ; $i = 2 if eof}{ $h{$_} == 2 and print $_ for keys %h ;' a.txt b.txt
# $h{$_} == 1 a.txt のみ
# $h{$_} == 3 a.txt & b.txt
このワンライナー解読して適当にスクリプト化すれば?
0647nobodyさん
2010/02/26(金) 20:23:12ID:???同じスクリプトの挙動をその条件で変えたいんです
ただ、HTML側に細工をするのはちょっと難しいです
環境変数かなんかで分かればいいのですが・・・
0648nobodyさん
2010/02/26(金) 20:50:17ID:???0649nobodyさん
2010/02/26(金) 20:59:18ID:???0650nobodyさん
2010/02/26(金) 21:06:13ID:qFPnonZhそのファイルの中でどうゆう呼ばれ方をされてるのかを
調べればいいかなと
0651nobodyさん
2010/02/27(土) 02:04:01ID:???そうでないならJavaScriptでparentとか見て判定した方がいいな
0652647
2010/02/27(土) 02:37:15ID:???案を考えていただき、ありがとうございます
ただ、後付け条件で申し訳ないですが、呼び出し元は同一ドメインのスクリプト全てが想定され、
また、そのスクリプト群はユーザーがデータベースに保存したテンプレートを加工して出力します
なので、実質どんなHTMLが返ってくるかは分からないです
>>649,651
クエリは変わりますが、アクセス元のURL自体は有限なので
リファラと正規表現でなんとかなるような気がしてきました
ありがとうございます
0653nobodyさん
2010/03/03(水) 02:18:21ID:???主要部分はこんな感じです
================
$msg = new MIME::Lite(
From => (送信元),
To => (送信先),
Subject => 'HOGEHOGE',
Data => ''
Type => 'image/jpeg',);
$msg->attach('Type' => 'applocation/octet-stream',
'Encoding' => 'base64',
'Path' => 添付ファイルのフルパス);
================
これ実行すると、確かに指定したファイルが添付された状態で宛先に届くのですが
何故か0バイトのファイルも余計に一つついてきます
また、上記は空欄になっているDataオプションに任意の文字を入れると
0バイトのファイルが、その文字が書き込まれたテキストファイルに置き換わっています
この余分なファイルが無い状態でファイルを送りたいのですが、原因は何でしょうか?
0655nobodyさん
2010/03/03(水) 10:32:39ID:aprtMKKMwww.samohan.jp/cgi-bin/form.cgi
★買い物カゴシステムのPOST送信先(買物カゴ中身画面のアドレスと同じ)
https://www.jacky.jp/cgi/kago.cgi?user=samohan
とします。
htmlやphpのFORMで買い物カゴシステムへPOSTせずにform.cgiでPOSTデータをkago.cgiへ送信し、送信したらkago.cgiが表示する買物カゴ中身画面へと移動させたいです。
買物カゴシステムを乗り換えるときカンタン移行できるよう、ワンクッションかませたいとおもっているのです。
今はform.cgiでフォームを表示して「送信」ボタンを押してもらい、kago.cgiへPOSTしているのですが、押さずに済ませたいのです。
★form.cgi内のpost送信ソース
my $url = 'https://www.jacky.jp/cgi/kago.cgi?user=samohan';
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my %formdata = ('user' => 'samohan', 'item' => $item, 'price' => $price, 'kazu' => $kazu);
my $request = POST($url, [%formdata]);
my $ua = LWP::UserAgent->new;
my $res = $ua->request( $request);
print $res->content;
としてみました。
しかし
★結果(www.samohan.jp/cgi-bin/form.cgiの結果表示画面)
Found
The document has moved here.
となります。
'here'はリンクとなっており、リンク内容は'http://www.samohan.jp/cgi-bin/kago.cgi?user=samohan'となっています、どうしていいのかわかりません、アドバイスよろしくお願いいたします・・・。
0656nobodyさん
2010/03/03(水) 11:43:47ID:???書き始めてわかったんですが、書けば書くほどコードがどんどん汚くなっていくような気がします
これはやはり初心者だからでしょうか?
上達してくるときれいなコードが書けるもんでしょうか
0657nobodyさん
2010/03/03(水) 13:20:30ID:???自分で見やすくするための決まりごとを作れば書けるようになる
自分が見やすいかどうかで判断すればいい
自分の見やすいコードは上達の手助けになる
他人のコードをいろいろ見比べてみれば自分の見やすいコードを決める材料になる
これはPerlに限ったことではない
0658nobodyさん
2010/03/03(水) 13:47:53ID:???一朝一夕にはいかないもんですね
0659nobodyさん
2010/03/03(水) 14:14:48ID:???0660nobodyさん
2010/03/03(水) 15:14:27ID:???お勧めの本を買って…って高っ!
図書館巡って探して、なかったら中古買って勉強してみます
0661nobodyさん
2010/03/03(水) 17:43:02ID:???引っ張り出す使いかたをしがちなので
図書館で借りるより古本でいいから常備するほうがいいと思うよ。
4,515円が高いかどうかは人それぞれだけど。
0662nobodyさん
2010/03/09(火) 09:40:49ID:JhJ16iiu自宅Windows(LibXML1.64)ではうまくいきますが、レンタルサーバの1.58では何も返されません。
[xml]
<root xmlns="foo:bar" hoge="fuga">
<name>yesman</name>
</root>
[perl](一部)
my $root = $doc->documentRoot();#=>XML::LibXML::Element
my $root_nodename = $root->nodeName();#=>'root'(正常に取得)
my $namespace = $root->getAttribute('xmlns');#=>'foo:bar'がとれない
my $attr_hoge = $root->getAttribute('hoge');#=>'fuga'(これは正常に取得)
LibXML.pmを見ると、名前空間に関してはそれ用のuseしたメソッドを呼んでいて、
サーバにインストールされているもともとのライブラリ(expat?)の問題なのかなと疑ってるのですが、
なにか情報ありませんか?
関連ですが
my @names = $doc->getElementsByTagName('name');
このコードも1.64では成功しますが1.58では空です。
自分で$namespaceに値を代入して(ハードコードして)
my $namespace = 'foo:bar';
my @names = $doc->getElementsByTagNameNS($namespace, 'name');
とすると取得できます。
0663nobodyさん
2010/03/09(火) 09:51:59ID:???CHANGESぐらい読めよ。
1.61のところに
- get/setAttribute(NS)? implementation made xmlns aware
とあるので、それ以前は対応してないと思われる。
0664662
2010/03/09(火) 10:33:34ID:???そうでしたか〜・・・
ノードをたどっていく分には名前空間の問題はないようなので、
当面その方法で対応してみようと思います。
ありがとうございました!
0665nobodyさん
2010/03/09(火) 13:41:19ID:IYkocy7Wサーバ上のファイル名を決め打ちすれば問題ありませんが、
my @files = $ftps->nlst("./dir");
foreach my $file (@files) {
next if $file =~ /^\.{1,2}$/;
$ftps->get("$file", "$hozondir/$file") or die "get failed ", $ftps->last_message;
}
のようにすると、
(Debug => 1)
>>> RETR readme.txt (←$file)
: No such file or directory
Can't get file: Bad file descriptor at C:\Documents.......
とエラーを返され、ローカルに空ファイル(readme.txt)が作成されて終了します。
決め打ちすれば問題ないので、配列のデータの扱い方?だと思うのですが、
どうしたら良いのでしょうか?
何かご助言お願いします。
0666nobodyさん
2010/03/09(火) 16:30:28ID:???$ftps=>getの行の上に
print $file, "debug print¥n";
してみりゃ、原因わかるんじゃね?
0667665
2010/03/09(火) 16:47:08ID:IYkocy7Wヒントありがとうございます。
Windowsといえば改行コードだと閃いて、以下一行追加したら正常に動きました。
@files = map { s/\r//g; $_ } @files;
0668nobodyさん
2010/03/09(火) 16:51:36ID:???0669665
2010/03/09(火) 23:23:47ID:???試した事を書くのすっかり忘れてました・・・すみません。
ちなみに
○ @files = map { s/\r//g; $_ } @files;
× @files = map { s/\n//g; $_ } @files;
× @files = map { s/\r\n//g; $_ } @files;
でした。なんだかよく分かりません・・・
0670nobodyさん
2010/03/10(水) 02:09:38ID:???0671nobodyさん
2010/03/10(水) 02:13:37ID:???0672665
2010/03/10(水) 12:22:41ID:???○ $file =~ s/\r//g;
○ $file =~ s/\r$//g;
× $file =~ s/\r\n//g;
× $file =~ s/\n//g;
× chomp $file;
$file .= "\n";
× @files = map { s/\r\n/\n/g; $_ } @files;
× @files = map { s/\r\n/\n/g; $_ } @files;
chomp $file;
○ @files = map { s/\r/\n/g; $_ } @files;
chomp $file;
どうやら配列には、\rだけが入ってるようです。(\r\nでも\nでもなく)
で、chompは\rを処理しないということでしょうか。
ちなみにNet::FTPでmy @files = $ftp->ls()した場合は、こういう改行コードの問題は起きません。
推測ですが、$ftp->ls()は改行処理してるけど$ftps->nlst()はしてなくて、
ActivePerlの改行自動変換で\n→\rになって配列に入れられるのかなと思いました。
0673nobodyさん
2010/03/12(金) 23:39:43ID:???[]の中を()で一まとめになるかと思ったのですが、やはり[]内は一文字に対してしかきかないのでしょうか?
解決できる正規表現はどのように書けばよいでしょうか?
@hoge = ("a---b---c","w---x---y---z");
foreach(@hoge){
if( /^[^(---)]+---[^(---)]+$/ ){
printf "typeA %s %s\n",$1,$2;
}elsif( /^[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeB %s %s %s\n",$1,$2,$3;
}
}
と
0674673
2010/03/12(金) 23:48:42ID:???foreach(@hoge){
if( /^[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeA %s %s\n",$1,$2;
}elsif( /^[^(---)]+---[^(---)]+---[^(---)]+---[^(---)]+$/ ){
printf "typeB %s %s %s\n",$1,$2,$3;
}
}
0675nobodyさん
2010/03/13(土) 00:26:20ID:???my @hoge = ("a---b---c","w---x---y---z");
for (@hoge) {
my @match= split(/---/);
if (@match == 3) { printf("typeA %s %s %s\n", @match); }
elsif (@match == 4) { printf("typeA %s %s %s %s\n", @match); }
}
0676nobodyさん
2010/03/13(土) 01:17:06ID:???[] は「マッチする文字を指定できる . 」であって、
文字列のグループ化ではない
http://perldoc.jp/docs/perl/5.10.0/perlretut.pod
http://perldoc.jp/docs/perl/5.10.0/perlreref.pod
そしてそういう処理は、フツーはこうする
my @hoge = ('a---b---c', 'w---x---y---z', '', '1', '2---3');
my @type = ('!', 'A', 'B', '?');
for my $hoge (@hoge) {
my @item = split /---/, $hoge;
pop @item;
print "type$type[$#item] @item\n"; # $" = ' ' の場合
}
for my $hoge (@hoge) {
my @item = split /---/, $hoge;
if (@item == 3) { printf "typeA %s %s\n", @item[0,1] }
elsif (@item == 4) { printf "typeB %s %s %s\n", @item[0..2] }
}
0677nobodyさん
2010/03/13(土) 03:25:52ID:???>>674
× /^[^(---)]+---[^(---)]+---[^(---)]+$/
◯/^([^-])---([^-])---([^-])$/
キャプチャしたい文字が各々単独一文字で無いなら、([^-]) を
([^-]+) とかに変えりゃいい。
typeB の正規表現も同じ事なので略。
ちなみに[^(---)] は、
・"(--" => "(" から "-" までの文字列(アスキーコード10進で、40 から 45 まで)
・次の "-" => "-" 。# => だけど上で既に含まれてる
・ ")" => ")" 。# => だけど既に含まれてる
上記の条件に合わないものにヒット
って意味。
perl -e ' ( chr $_ ) !~ /[^(---)]/ and printf "%s\t%s\n", $_, chr $_ for 0 .. 255 ;'
perl -e ' ( chr $_ ) !~ /[^a-c-e]/ and printf "%s\t%s\n", $_, chr $_ for 0 .. 255 ;'
とかやってみりゃ納得出来るかな。
0678nobodyさん
2010/03/13(土) 16:12:28ID:moD4aVFUどのライブラリを使用すべきでしょうか。
現状、LWP::UserAgentのファイル指定で単独ページの取得は成功してるのですが、
ディレクトリ指定ではインデックスページがとれるだけです。
0679nobodyさん
2010/03/13(土) 16:22:26ID:???0681678
2010/03/14(日) 14:52:56ID:???>>680のいうブラウザの場合は、ディレクトリへのアクセス時に一覧を作成してくれるから
こういうファイルがあるなということがわかって選択(取得)できると思うんですが・・・
0682nobodyさん
2010/03/14(日) 19:11:57ID:???こういうファイルがあるなということがわかれば
こういうファイルを配列に入れて
ループで回してLWP::UserAgentのファイル指定でこういうファイルの単独ページを取得する
0683678
2010/03/14(日) 21:06:20ID:???ループでというのはLWP::UserAgentのコードで多く見ました。
ですがいずれも、取得すべきURLが分っている前提のコードでした。
あるディレクトリ下に"こういうファイルがある"というのは
どのように知るのでしょうか。
0684nobodyさん
2010/03/14(日) 21:17:37ID:???0685nobodyさん
2010/03/14(日) 22:04:33ID:???それとも(人間様から見ても)不明なファイルの在り処を探りたいのか
どっちの問題なのかが分からんのう
前者ならHTML解析してURLを得ればいいって話だし
0686678
2010/03/14(日) 22:27:12ID:???なんとなく、うまく説明できていないでしょうか・・・
おそらく後者に近いのかもしれませんが、
ファイル名や構成がわからないディレクトリにアクセスして
中を検索の上、必要なファイル(あるいは全部)をとりたいだけなのですが・・・
0687nobodyさん
2010/03/14(日) 22:28:11ID:???0688nobodyさん
2010/03/14(日) 22:33:40ID:???0689nobodyさん
2010/03/15(月) 00:27:31ID:???スレ違いだけど、このままだと何回も質問しそうな気がするので説明をすると、
>>>680のいうブラウザの場合は、ディレクトリへのアクセス時に一覧を作成してくれるから
>こういうファイルがあるなということがわかって選択(取得)できると思うんですが・・・
これは、
1.ブラウザが/とかにindex ofページを置いているサイトからHTMLを取得する
(webサーバの設定でそういう表示設定をしているサイトがある)
2.そうすると帰って来たHTMLに<a>のリンクが並んでる
3.それをブラウザが表示する(ブラウザはそれぞれのファイルを取得してるわけじゃない。リンクを表示してるだけ)
(4.リンクをクリックすればファイルが取得できる)
ってことをやってる。
LWPができるのは1番で、「(2番の)HTMLが返って来たんならそのリンクをループで回して取ればいい」
って言ってるのが>>682
で、ブラウザの動きも2番のHTMLがあるからファイル一覧を表示できるのであって、
そういうサイトじゃなかったら(index ofを設定してないサイトだったら)表示できないよって話。
リンクもないのにサーバ上のファイルの場所がわかっちゃったらそのサイトは攻撃されるでしょ?
0690678
2010/03/15(月) 10:36:57ID:???おかげさまでどう取得すべきなのかわかりました。
初歩的な問いのつもりでいたのですが、こちらの知識不足により
突飛な発想になってしまっていたのですね。
その後、リンクを辿っていく(本来の)方法で解決できました。
ありがとうございました。
0691nobodyさん
2010/03/15(月) 12:42:45ID:???0692nobodyさん
2010/03/15(月) 23:14:53ID:???でどうなる
0693nobodyさん
2010/03/17(水) 16:12:18ID:???登録フォームからCGIでパラメータを取ってやってたのですが、上手く行かないので
最終的にMySQLターミナル上で有効なINSERT文を、そのままリテラルにprepareし、
ターミナルから"perl insert.pl"を実行したのですが、どうしてもレコードが追加されません。
# insert.pl
use strict;
use warnings;
use DBI;
my $data_source = "DBI:mysql:mydatabase:localhost:3306";
my $user = "user";
my $pass = "pass";
my $dbh = DBI->connect($data_source, $user, $pass,
{ RaiseError => 1, AutoCommit => 0 });
my $sth = $dbh->prepare("insert into table1 (名前) values ('ほげ')");
$sth->execute;
$sth->finish;
$dbh->disconnect;
[環境]
Fedora12(2.6.31.12-174.2.3.fc12.i686)
MySQL-5.1.42-2
Perl-5.10.1
DBI-1.609
getenforce -> Permissive
何かヒントをお願いします・・・
0694nobodyさん
2010/03/17(水) 16:42:17ID:???じゃない?
0696nobodyさん
2010/03/18(木) 00:26:44ID:???my @testArray;
my $testHash= { value=>0, name=>'テスト0' };
push (@testArray, $testHash);
my $testHash= { value=>1, name=>'テスト1' };
push (@testArray, $testHash);
これをdeepcopyしたいのですが、
my @testArray2 = @testArray;
だとshallowcopyになってしまうようです。
有識者の方、deepcopyの方法をご教授願います。
0697nobodyさん
2010/03/18(木) 00:36:33ID:w0JRv+Cl0698696
2010/03/18(木) 00:46:07ID:???ありがとうございます!試してみます。
後学のため、cpanモジュールに依存しないようなコーディングもご教授頂けたら幸いです。
0699nobodyさん
2010/03/18(木) 09:24:09ID:???はどうだろうか
0700nobodyさん
2010/03/18(木) 09:24:24ID:???Cloneはxsだからperlでどう書くかの参考にはしにくいけど、
Clone::PPはpure perlなので読んでみるといい。
0701nobodyさん
2010/03/18(木) 16:13:26ID:???Host: 192.16
Connection: close
User-Agent:
x-ModelName: pp-pppp
x-SDKVersion: 1.1.1
リクエストヘッダが上のようにあり、この中で特殊な、x-ModelName
の pp-pppp を取得したいと考えています。(クライアントからリクエストを受けた、
サーバー側で)
しかし、
ttp://ja.wikipedia.org/wiki/%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0#HTTP.E7.92.B0.E5.A2.83.E5.A4.89.E6.95.B0
をみますと、これに該当する環境変数がありません。
この場合、どうやって、pp-pppp を取得できますでしょうか?
0702nobodyさん
2010/03/18(木) 16:47:58ID:???環境変数の例なんかじゃなくてCGIの仕様を読むべきだな。
でもperlでCGI使うんならCGIモジュール使った方がいいんじゃ
ないか。headerメソッドってのが用意されてる。
0703nobodyさん
2010/03/18(木) 18:53:46ID:???ハッシュの要素にはスカラーしか存在しないと考えていいなら
@testArray2 = map{ { %$_ } } @testArray;
とか?
0704nobodyさん
2010/03/19(金) 02:13:52ID:???x-SDKVersionはとれてx-ModelNameだけがとれないのか、
環境変数の取得の仕方自体が分からないのか、どっち?
リクエストヘッダの内容は%ENVに入るんだから、普通に$ENV{x-ModelName}で取れるはずだけどね。
0705nobodyさん
2010/03/19(金) 15:01:50ID:???0706nobodyさん
2010/03/19(金) 16:49:50ID:???fetchrow_hashrefだと、カラム名の順番がバラバラになってしまいます。
カラム順をテーブル通りにする良い方法はないでしょうか?
■ このスレッドは過去ログ倉庫に格納されています