トップページphp
1001コメント349KB

Perl 初心者コーナー Part22

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/04/15 10:15ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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
0175nobodyさん03/04/20 14:00ID:???
>>174
行われる処理が同じになるコードじゃないから
0176nobodyさん03/04/20 14:13ID:???
>>174
whileは毎回比較してるから遅いのは当然
0177nobodyさん03/04/20 14:51ID:???
>>174
ソースを見た段階で違いに気づけよ....
0178nobodyさん03/04/20 15:08ID:???
そんなコードの違いがわからないやつが言うメモリってどうやって調べたのだろう?
0179nobodyさん03/04/20 15:21ID:???
>178
タスクマネージャーとかじゃね?
0180nobodyさん03/04/20 18:39ID:???
Subroutine ABCDEFG redefined

ってどういうエラー?
0181nobodyさん03/04/20 18:41ID:???
>180
辞書(英和辞典)をひけばわかりそうなものだが。
0182nobodyさん03/04/20 19:40ID:???
>>180
re  defined
0183nobodyさん03/04/20 20:14ID:Nmb8JQyi
34 → 0000034
123 → 0000123
のように、
ある数字を、7桁の文字にするにはどうすればいいのでしょうか?
0184nobodyさん03/04/20 20:21ID:???
$answer= substr('0000000'.$n, -7);
0185nobodyさん03/04/20 20:22ID:???
>183
sprintf
0186nobodyさん03/04/20 20:22ID:???
>>183
sprintf
$s=sprintf("%07d",34);
0187nobodyさん03/04/20 21:38ID:???
>>184
あんた、プログラミング歴長いでしょ?
0188nobodyさん03/04/20 21:38ID:???
x_ 以外で始まり、 .cgi で終わる正規表現を教えてください。

x_acdef.cgi にはマッチしない
abcdef.cgi   にはマッチする
aacdef.csv   にはマッチしない
x_aaad.csv  にはマッチしない
xabcdef.cgi  にはマッチする
0189nobodyさん03/04/20 21:42ID:???
!/^x_/ and /\.cgi$/
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    |
0191nobodyさん03/04/20 21:49ID:???
>>189
やはり、andを使わないとだめなのか。
0192nobodyさん03/04/20 22:02ID:???
/^[^x_].*\.cgi$/
0193nobodyさん03/04/20 22:04ID:???
>>192

$a = 'xabcde.cgi';
if($a =~ /^[^x_].*\.cgi$/){
  print 'マッチしました';
}else{
  print 'だめ';
}

これで「だめ」と表示されたので、失敗。
0194184==18903/04/20 22:06ID:???
正規表現の勘所は、冗長になり過ぎないこと
0195nobodyさん03/04/20 22:07ID:???
/^[^x][^_].*\.cgi$/
0196nobodyさん03/04/20 22:09ID:???
$a = 'xabcde.cgi';
if($a =~ /^[^x][^_].*\.cgi$/){
  print 'マッチしました';
}else{
  print 'だめ';
}

だめと表示された。やっぱ無理なのか。
すまんかった。
0197192=19503/04/20 22:14ID:???
すいまそん。あてくし、初心者なんです。
調子に乗って答えてしまいますた。
ムズイネ・・・
0198nobodyさん03/04/20 22:47ID:???
^(?:x(?!_)|[^x]).*\.cgi$
0199nobodyさん03/04/20 23:00ID:???
189程度なら正規表現使う方が間違ってる
0200nobodyさん03/04/20 23:03ID:???
>>199
同意
あれで正規表現しか方法が思いつかないのは情けない
0201nobodyさん03/04/20 23:03ID:???
if (/^(?!x_).*\.cgi$/) {
0202nobodyさん03/04/20 23:04ID:???
漏れ、久々にPerl触ることになったんですけど
5.2以降、基本的な構造とか変わりまつたか?
ライブラリ周りとか、参照とかハッシュ(連想配列だっけか?)とか・・・
0203nobodyさん03/04/20 23:08ID:???
x_ 以外で始まる。
0204nobodyさん03/04/20 23:13ID:???
>>202
5.6、5.8あたりで動きがあったけど
020520203/04/20 23:21ID:???
>>204
多謝
化石化した脳が再利用出来ることを願って、その辺調べてみまつ
0206nobodyさん03/04/21 00:03ID:???
>>202
5.6なら基本的に大きく変わってないと思うよ
5.8はエンコードとか大きく変わってる
0207nobodyさん03/04/21 00:53ID:dkK8VA+7
Arseno ver2.1.4 のような辞書を借りたいのですが
何処に行けば無料レンタルできますか?
0208nobodyさん03/04/21 01:16ID:???
>>207
あの世
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
< 174
説明が間抜けでスマソ 再度朝鮮。
@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:kls4aiji
ある文字列に
abが存在するかつcdが存在するかつefが存在しないかつghが存在しない
という条件を書きたいとき
論理積などを使わず正規表現一発で現すにはどうしたらいいでしょう。
というかperlっぽい書き方はどんな感じなんでしょう。教えてください。
0212nobodyさん03/04/21 18:01ID:???
>>211は放置でおながいします
0213nobodyさん03/04/21 18:09ID:???
性器文自体に論理積がないから無理
論理和だけに命題を置き換えればいいが、
perlの話じゃない

>>211は放置
0214nobodyさん03/04/21 18:14ID:???
>>210
プログラム板のPerlスレで聞いた方がいいと思う・・・
ムズイよ
俺も知りたい
0215nobodyさん03/04/21 18:21ID:???
>>211
スレ違いなんだよボケ
失せろキチガイ
0216nobodyさん03/04/21 18:25ID:???
>>211
ここは初心者に慣習さえ教えるのも嫌な
臭いスレなのでこっちに行け

http://pc2.2ch.net/test/read.cgi/tech/1048519394/l50
0217nobodyさん03/04/21 18:29ID:???
>>216
本当にいっちゃったじゃん・・・
0218nobodyさん03/04/21 19:08ID:???
(・∀・)ラッキー!
0219nobodyさん03/04/21 19:21ID:???
>>218
ワラタ
0220nobodyさん03/04/21 19:47ID:???
>>217-219
最近向こうから厨を押し付けられてばっかりだから、たまにはイイネ!
0221nobodyさん03/04/21 20:59ID:???
/^(?:(?!ef|gh).)*(?:ab(?:(?!ef|gh).)*cd|cd(?:(?!ef|gh).)*ab)(?:(?!ef|gh).)*$/
022222103/04/21 21:08ID:???
余裕だな
0223nobodyさん03/04/21 21:47ID:???
>>215
スレ違いでもないんじゃないの?
少なくともコーディングに関する質問だし。
CGIのエラーの原因を聞いてくる馬鹿よりはマシだよ。
0224nobodyさん03/04/21 21:57ID:???
InternalServerErrorって出るんですけど誰か助けてくれません?
0225nobodyさん03/04/21 22:38ID:???
>>223
ネタだと見抜ける眼力を持てって
0226nobodyさん03/04/21 23:20ID:VRXCXV3j
URLから特定の文字を抜き出す例題で、正規表現の勉強をしていますが、どう
もうまくいきません。例題は以下のとおり。

【例題】
<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,}/)

など、いろいろ試しているのですが、どうもうまく行きません。


一行の中のパターン化された文字列のなかから、特定の文字列を複数抜き出す場合はどうすればいいので
しょうか?

よろしくお願いします。
022722603/04/21 23:22ID:VRXCXV3j
すみません。
perl内のHTMLは全て大文字にして読みかえて下さい。
0228nobodyさん03/04/21 23:34ID:FAJq1ej9
>>226
/<a href=\"(.*?)\">(.*?)</a>/i
難しくしなくてもこれでいいんじゃないの?
大文字小文字どちらもokだし。
022922603/04/21 23:54ID:UkhLM6bF
>>228
いえ、そうではないのです。
私が訊きたかったのは、

>>226で示したとおり、<DT>から</A>までを一行として改行されているのではなく、
まったく改行されていない場合のURLとタイトルの抜き出し方を知りたかった
のです。
0230nobodyさん03/04/21 23:55ID:mc4GwSLK
ifより前の部分が書かれてないが、状況から察するに

while (/<a href=\"(.*?)\">(.*?)<\/a>/ig) {push (@i,"$1,$2\n")}
0231nobodyさん03/04/22 00:02ID:???
>>229
「以上のHTMLタグから・・・」って例題が改行されているのに
なんで余計なことまで考えるの?
023222603/04/22 00:11ID:yfHpFKfL
>>230
できました!
うわーい!うわーい!
ありがとうございます!

「もし<DT>...</A>に当てはまるなら」という具合で、ずっとif文に縛られて
いました・・・。すみません。でも勉強になりました!

ああ、我知らず、熱い涙が押し出されてきよる・・・(滂沱の涙)。

>>231
最初はブラウザのブックマークからURLとタイトルを抜き出すという課題を自
分に課したのです。それがうまくいって一息ついたときに、「こうするとど
うなるんだろう?」と思い付いてしまったのでした。

ゆるせよ(遠山の金さん)。
0233nobodyさん03/04/22 01:59ID:8UmhU43L
タグを使わないでKENTの掲示板を改造してimgを掲示板に貼り付けるには?
どうすれば良いですか?
0234nobodyさん03/04/22 02:08ID:???
>>233
意味不明だし、ここはそういうスレじゃない。
とても改造できそうにも思えないので素直に画像貼れる掲示板を使いなさいな。
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:???
>>235
# 「\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 が改行に展開されないのでしょうか?
と、もう一つ質問を書いたら多分分かりました。正規表現じゃないからですね
どうもありがとうございました
うーんややこしい・・・
0238nobodyさん03/04/22 11:38ID:???
>>237
\で\をエスケープしてるからだろ
ややこしくもなんともない
0239nobodyさん03/04/22 12:15ID:???
ブラウザからファイルを選んで
ある書式にフォーマットして出力したいんですけど
なぜかエラー500がでます。
何か一般的な原因があれば教えて
0240nobodyさん03/04/22 12:25ID:???
>>239
間違っているから。としか言いようがない。
0241nobodyさん03/04/22 12:27ID:???
>>239
ブラウザの出す「エラー500」から原因を突き止めるのは困難。
「Perlの出すエラー」を書いてくれないとわからん。
0242nobodyさん03/04/22 13:07ID:???
>>238
あんた235の意味を解ってないな
/\\newfolder/
こうなる事を期待したって事だろ
024323803/04/22 16:16ID:???
>>242
確かにお前みたいな知障が考えていることは解らないなぁ
0244nobodyさん03/04/22 16:42ID:???
>>239
「エラーを出すスクリプト」を晒してくれないとわからん。

0245nobodyさん03/04/23 00:26ID:???
perlでcsvを編集してメールで転送するプログラムを
作成しようと思ったのだが、全くの初心者のため
paerl自体の実行が失敗している。
誰かなんとかしてくれ。
0246nobodyさん03/04/23 00:27ID:???
m/ / => 変数展開してから正規表現担当に渡す
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:???
John the ripper
0249nobodyさん03/04/23 00:38ID:???
>>247
自分で調べろボケが。
とっとと失せろ
0250nobodyさん 03/04/23 00:39ID:???
>>247
crypt関数のdecrypt基本的に無理
仕様的には、Desはdecrypt出来るんだがperlでは出来な威実装をしてある。
あと、MD5は絶対できないといった感じ
0251nobodyさん03/04/23 00:43ID:???
ジョンか・・・
>>247みたいなやつには13金のジェイソンのほうが
0252nobodyさん03/04/23 00:44ID:???
そんなことないよ。あぁ、解読っていうより、同じものになる
値の1つを見つける、っていうことなんだけど。>>248でやれ
025325203/04/23 00:45ID:???
>>250へのレスだったのです
0254nobodyさん03/04/23 00:49ID:???
ファイルのrenameしようとおもったんだけど消えてしまった。
元に戻す方法ある?
025525003/04/23 00:49ID:???
>>253
質問の意味そのままであるが?
cryptの照合方法はどうすればいいかってなら別の答えも出来るんだがねぇ
0256nobodyさん03/04/23 00:50ID:???
>>254
意味わからんって。
チョンは日本語覚えてから来てください。
025724703/04/23 00:51ID:???
ども、助かりました。とっとと消えます。
まともに答えてくれたからサンクス。
13金・・・古!!!
0258nobodyさん03/04/23 00:57ID:???
renameで変更後のファイル名のファイルが存在したら、消えることになる。あきらめろ。
025925403/04/23 00:57ID:???
>>256
ハァ?
チョンってなあに?
元に戻す方法がわからないなら
返答すんなよ。
ば〜〜か。
0260nobodyさん03/04/23 00:59ID:???
>>259
朝鮮人に決まってるだろ。低脳
026125003/04/23 01:02ID:???
>>259
つーか、しょーも無い事で腹立てる前に、ちゃんとperlの関数を勉強してこいよ・・・
0262nobodyさん03/04/23 07:06ID:???
掲示板に自動で書き込むツールを作りたいんですけど
方法がさっぱりわかりません。
ヒントでいいんでわかりやすく教えてください。
お願いいたします。
0263nobodyさん03/04/23 07:40ID:???
>>262
ttp://member.nifty.ne.jp/hippo2000/perltips/LWP.html#An_Example
0264nobodyさん03/04/23 08:58ID:???
さっぱりわからない = 学習する気は無い
0265nobodyさん03/04/23 09:41ID:???
>>262
ここはPerlスレなので、あなたの質問はスレ違いです。
0266nobodyさん03/04/23 12:07ID:???
>>265
なぜ?
perlでプログラム組むんですけど・・。
荒らしは帰れ
0267nobodyさん03/04/23 13:02ID:???
>>266
Perlのコーディングで困ってる人のスレです。

まったくのゼロから質問するなや
0268nobodyさん03/04/23 16:32ID:???
質問させてください。
今、Perlのコメント部分を削除するスクリプトを組んでるんですが、
#から始まる文字を削る事はできるのですが、
$#演算子まで削られてしまいます。

$len =~ s/((\$#)*.*)#.*$/$1/g;

・・・と、こんな事もしてみたのですが、ダメでした・・・
どんな風に表現すれば、$#を削らずに行けるでしょうか?
よろしくお願いします。
0269nobodyさん03/04/23 17:12ID:???
一行ずつ読み込むとして

while(<PERLFILE>){
if($_ =~ /^#/){ $_ = ''; }
#出力処理
}

じゃ駄目ですか?
0270nobodyさん03/04/23 17:14ID:???
>>268
$len = <<'EOL';
my @array = ('a' ,'b', 'c'); # コメント1
print STDOUT @array if $#array > 1; # コメント2
# push(@array, 'ぬるぽ');
EOL

$len =~ s/(?<!\$)#.*//gm;
print STDOUT $len;

# ----出力結果----
my @array = ('a' ,'b', 'c');
print STDOUT @array if $#array > 1;

# ----出力結果----
027125003/04/23 17:17ID:???
>>269
必ずしも、先頭に有るわけじゃ無いからのぉ

$data =~ s/(?<!\$)#.*$//g;

とか・・・
0272nobodyさん03/04/23 17:43ID:???
>>269
>>270
>>271

お答えいただきありがとうございます。
正常に動くようになりました・・・が、
(?<・・・)←これってなんですか???
(?=・・・) とか (?!・・・) とかなら分かるのですが・・・
本にも載ってない・・・
よろしければ、お答えを・・・
027327203/04/23 18:41ID:???
・・・と、いろいろネットで調べた結果、なんなのか分かりました。
しかし・・・ラクダ本にも載ってなかった・・・
なぜ???探し方が悪かったのかな・・・???

とにかく、ありがとうございました。
0274nobodyさん03/04/23 18:51ID:???
なんでみんな弱者に厳しいのに
最弱者である自分には甘いの?
■ このスレッドは過去ログ倉庫に格納されています