Perl 初心者コーナー Part22
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/04/15 10:15ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
参考書籍の話題は、【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0160nobodyさん
03/04/20 03:47ID:???そろそろ放置して寝るか。
0163nobodyさん
03/04/20 04:46ID:???放置プレーべ
0164山崎渉
03/04/20 05:57ID:???( ^^ )< ぬるぽ(^^)
0165nobodyさん
03/04/20 06:47ID:???詳細表示で10項目全部表示することとし、概略表示で行の始めから5項目ずつを表示したいと考えてます。
詳細表示と概略表示ではそれぞれ別のスクリプトで実行します。
この概略表示でデータを読み込む際、30項目全部を配列にセットするのではなく、始めから5項目ずつだけを配列にセットするほうが負荷がかからないのかな?って思ったんですが、始めから5項目ずつだけを配列にセットする方法が思いつきません。
正規表現かな?と思うのですが、それよりも前に進むことが出来ません。
何卒こんな私に良い知恵を御授けくださいませ。
それと、こういうことは負荷軽減に意味があるのかないのかもあわせてお答え願えれば幸いです。
ちなみに現状は以下で読み込んでます。
open(IN,"$Datafile")
while (<IN>){
chomp;
if(!$_){next;}
@data = split(/,/);
}
close(IN);
0166nobodyさん
03/04/20 07:07ID:???split の第3引数。
(@data, undef) = split /,/, $_, 6;
余計な分割をしない分 CPU 負荷は減るし、
配列に余計なデータを入れない分、使用メモリも減る。
行数によっては微々たる差だけど、こういう細かい
節約に気を使うのはいい事だよ。
0167165
03/04/20 07:07ID:???2行目:
誤 詳細表示で10項目
正 詳細表示で30項目
5,6行目:
誤 始めから5項目
正 各行の始めから5項目
寝てないから苦しい。
0168はしのえみ好きー
03/04/20 07:08ID:???なら @data = (split(/,/))[0..4]; とか。
0171nobodyさん
03/04/20 07:13ID:???>>165
http://flex.ee.uec.ac.jp/texi/perl/perl_56.html
0174nobodyさん
03/04/20 13:56ID:jyoFgOQ4と、
while($count < 1000000){ $dat[$count] = $count++; }
後者の方が目盛り消費量が倍ほど違うのはなぜ?
0178nobodyさん
03/04/20 15:08ID:???0179nobodyさん
03/04/20 15:21ID:???タスクマネージャーとかじゃね?
0180nobodyさん
03/04/20 18:39ID:???ってどういうエラー?
0181nobodyさん
03/04/20 18:41ID:???辞書(英和辞典)をひけばわかりそうなものだが。
0183nobodyさん
03/04/20 20:14ID:Nmb8JQyi123 → 0000123
のように、
ある数字を、7桁の文字にするにはどうすればいいのでしょうか?
0184nobodyさん
03/04/20 20:21ID:???0185nobodyさん
03/04/20 20:22ID:???sprintf
0188nobodyさん
03/04/20 21:38ID:???x_acdef.cgi にはマッチしない
abcdef.cgi にはマッチする
aacdef.csv にはマッチしない
x_aaad.csv にはマッチしない
xabcdef.cgi にはマッチする
0189nobodyさん
03/04/20 21:42ID:???0190金正日
03/04/20 21:44ID:???,rn
r「l l h. / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| 、. !j |
ゝ .f _ |
| | ,r'⌒ ⌒ヽ、. │ http://www.freeweb2.kakiko.com/saitama/
,」 L_ f ,,r' ̄ ̄ヾ. ヽ. │ こんなのあったニダ
ヾー‐' | ゞ‐=H:=‐fー)r、) |
| じ、 ゙iー'・・ー' i.トソ |
\ \. l ; r==i; ,; |' .人_
\ ノリ^ー->==__,..-‐ヘ___
\ ノ ハヽ |_/oヽ__/ /\
\ / / / |.
y' /o O ,l |
0192nobodyさん
03/04/20 22:02ID:???0193nobodyさん
03/04/20 22:04ID:???$a = 'xabcde.cgi';
if($a =~ /^[^x_].*\.cgi$/){
print 'マッチしました';
}else{
print 'だめ';
}
これで「だめ」と表示されたので、失敗。
0194184==189
03/04/20 22:06ID:???0195nobodyさん
03/04/20 22:07ID:???0196nobodyさん
03/04/20 22:09ID:???if($a =~ /^[^x][^_].*\.cgi$/){
print 'マッチしました';
}else{
print 'だめ';
}
だめと表示された。やっぱ無理なのか。
すまんかった。
0197192=195
03/04/20 22:14ID:???調子に乗って答えてしまいますた。
ムズイネ・・・
0198nobodyさん
03/04/20 22:47ID:???0199nobodyさん
03/04/20 23:00ID:???0201nobodyさん
03/04/20 23:03ID:???0202nobodyさん
03/04/20 23:04ID:???5.2以降、基本的な構造とか変わりまつたか?
ライブラリ周りとか、参照とかハッシュ(連想配列だっけか?)とか・・・
0203nobodyさん
03/04/20 23:08ID:???0207nobodyさん
03/04/21 00:53ID:dkK8VA+7何処に行けば無料レンタルできますか?
0209_
03/04/21 01:37ID:???http://www.freeweb2.kakiko.com/tama/moe/hankaku06.html
http://freeweb2.kakiko.com/tama/moe/hankaku05.html
http://www.freeweb2.kakiko.com/tama/moe/hankaku04.html
http://freeweb2.kakiko.com/tama/moe/hankaku03.html
http://www.freeweb2.kakiko.com/tama/moe/hankaku08.html
http://freeweb2.kakiko.com/tama/moe/hankaku07.html
http://www.freeweb2.kakiko.com/tama/moe/hankaku01.html
http://freeweb2.kakiko.com/tama/moe/hankaku02.html
http://www.freeweb2.kakiko.com/tama/moe/hankaku10.html
http://freeweb2.kakiko.com/tama/moe/hankaku09.html
0210nobodyさん
03/04/21 01:59ID:qjNDcweN説明が間抜けでスマソ 再度朝鮮。
@dat = ();
foreach $count (0..1000000) { $dat[$count] = $count; }
と、
$count = 0;
@dat = ();
while($count < 1000000){ $dat[$count] = $count++; }
前者では、配列が 32bits整数 * 約1MB = 4MB となるのでその分のメモリを使用しているということをモニタで納得できたのですが、
後者の方では、2 倍の 8MB 程使用しているようなのです。
この場合なぜ後者は 2 倍のメモリを使用するのでしょうか?
環境はVineLinux2.6(kernel 2.4.20-0vl29.1)
Perl 5.6.1 です。
0211nobodyさん
03/04/21 17:48ID:kls4aijiabが存在するかつcdが存在するかつefが存在しないかつghが存在しない
という条件を書きたいとき
論理積などを使わず正規表現一発で現すにはどうしたらいいでしょう。
というかperlっぽい書き方はどんな感じなんでしょう。教えてください。
0216nobodyさん
03/04/21 18:25ID:???ここは初心者に慣習さえ教えるのも嫌な
臭いスレなのでこっちに行け
http://pc2.2ch.net/test/read.cgi/tech/1048519394/l50
0218nobodyさん
03/04/21 19:08ID:???0221nobodyさん
03/04/21 20:59ID:???0222221
03/04/21 21:08ID:???0223nobodyさん
03/04/21 21:47ID:???スレ違いでもないんじゃないの?
少なくともコーディングに関する質問だし。
CGIのエラーの原因を聞いてくる馬鹿よりはマシだよ。
0224nobodyさん
03/04/21 21:57ID:???0226nobodyさん
03/04/21 23:20ID:VRXCXV3jもうまくいきません。例題は以下のとおり。
【例題】
<DT><A HREF="http://www.yahoo.co.jp/">Yahoo! JAPAN</A>
<DT><A HREF="http://mailcity.lycos.co.jp/">MailCity へようこそ!</A>
<DT><A HREF="http://www.google.com/">Google</A>
<DT><A HREF="http://www.infoseek.co.jp/">インフォシーク</A>
以上のHTMLタグからURLとタイトルのみ抜き出しなさい。
【答え】
if (/<DT><a href=\"(.*?)\">(.*?)</a>/) {
$i = join (",", ($1, $2));
$i .= "\n";
push (@i, $i);
}
<DT>の一行が</A>で改行されていればこれでうまく行きますが、まったく改行されて
いない場合はそうも行きません。
if (/(<DT><a href=\"(.*?)\">(.*?)</a>)+/)
や
if (/(<DT><a href=\"(.*?)\">(.*?)</a>){0,}/)
など、いろいろ試しているのですが、どうもうまく行きません。
一行の中のパターン化された文字列のなかから、特定の文字列を複数抜き出す場合はどうすればいいので
しょうか?
よろしくお願いします。
0227226
03/04/21 23:22ID:VRXCXV3jperl内のHTMLは全て大文字にして読みかえて下さい。
0228nobodyさん
03/04/21 23:34ID:FAJq1ej9/<a href=\"(.*?)\">(.*?)</a>/i
難しくしなくてもこれでいいんじゃないの?
大文字小文字どちらもokだし。
0229226
03/04/21 23:54ID:UkhLM6bFいえ、そうではないのです。
私が訊きたかったのは、
>>226で示したとおり、<DT>から</A>までを一行として改行されているのではなく、
まったく改行されていない場合のURLとタイトルの抜き出し方を知りたかった
のです。
0230nobodyさん
03/04/21 23:55ID:mc4GwSLKwhile (/<a href=\"(.*?)\">(.*?)<\/a>/ig) {push (@i,"$1,$2\n")}
0232226
03/04/22 00:11ID:yfHpFKfLできました!
うわーい!うわーい!
ありがとうございます!
「もし<DT>...</A>に当てはまるなら」という具合で、ずっとif文に縛られて
いました・・・。すみません。でも勉強になりました!
ああ、我知らず、熱い涙が押し出されてきよる・・・(滂沱の涙)。
>>231
最初はブラウザのブックマークからURLとタイトルを抜き出すという課題を自
分に課したのです。それがうまくいって一息ついたときに、「こうするとど
うなるんだろう?」と思い付いてしまったのでした。
ゆるせよ(遠山の金さん)。
0233nobodyさん
03/04/22 01:59ID:8UmhU43Lどうすれば良いですか?
0235nobodyさん
03/04/22 04:41ID:Jj2tlT0c$rootdir = "\\newfolder";
$workdir = "\\newfolder";
if ($rootdir == $workdir) {
print "OK\n"; # 表示されます
}
if ($workdir !~ m#$rootdir#i) {
print "NG\n"; # 表示されます・・・
}
これはなぜ NG が表示されるのでしょうか?
環境は、PERL 5.6.1 を Win2000 のコマンドプロンプトで動かしています。
よろしくおねがいします。
0236nobodyさん
03/04/22 06:26ID:???# 「\newfolder」という文字列
$rootdir = "\\newfolder";
$workdir = "\\newfolder";
# 正規表現は /\newfolder/ =「[改行]ewfolder」
# 「\newfolder」という文字列は「[改行]ewfolder」にマッチしない。
if ($workdir !~ /$rootdir/) { print "NG\n" }
# 本当に改行になってしまっているか確認
$workdir = "\n" . 'ewfolder';
if ($workdir =~ /$rootdir/) { print "OK\n" }
# 対策1
$workdir = "\\newfolder";
if ($workdir =~ /\Q$rootdir\E/) { print "OK\n" }
# 対策2
$rootdir = quotemeta($rootdir);
if ($workdir =~ /$rootdir/) { print "OK\n" }
0237nobodyさん
03/04/22 07:25ID:???$rootdir = "\\newfolder";
print ">$rootdir<\n";
結果
>\newfolder<(改行)
なぜここでは $rootdir の先頭の \n が改行に展開されないのでしょうか?
と、もう一つ質問を書いたら多分分かりました。正規表現じゃないからですね
どうもありがとうございました
うーんややこしい・・・
0239nobodyさん
03/04/22 12:15ID:???ある書式にフォーマットして出力したいんですけど
なぜかエラー500がでます。
何か一般的な原因があれば教えて
0245nobodyさん
03/04/23 00:26ID:???作成しようと思ったのだが、全くの初心者のため
paerl自体の実行が失敗している。
誰かなんとかしてくれ。
0246nobodyさん
03/04/23 00:27ID:???qq/ / => 変数展開とエスケープされた文字の復活を同時に行う
正規表現担当の部分は、エスケープされた文字を元に戻してから処理する。
$pattern = '\\n_hoge';
($pattern は \n_hoge)
print "$pattern\n";
print "match!\n" if $pattern =~ /^$pattern$/;
正規表現中と、ダブルクオートの中身は、展開の仕方が違うということ。
0247nobodyさん
03/04/23 00:33ID:???cgiのパスワードの逆変換って、できるんですかー?
スクリプトはあります。変換後のワードもあります。
おねがいします。
0248nobodyさん
03/04/23 00:35ID:???0250nobodyさん
03/04/23 00:39ID:???crypt関数のdecrypt基本的に無理
仕様的には、Desはdecrypt出来るんだがperlでは出来な威実装をしてある。
あと、MD5は絶対できないといった感じ
0254nobodyさん
03/04/23 00:49ID:???元に戻す方法ある?
0257247
03/04/23 00:51ID:???まともに答えてくれたからサンクス。
13金・・・古!!!
0258nobodyさん
03/04/23 00:57ID:???■ このスレッドは過去ログ倉庫に格納されています