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

Perlコーディング初心者質問スレ Part 46

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/01/18(水) 02:17:46ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0709nobodyさん2006/02/16(木) 14:29:23ID:???
抽象的な質問で申し訳ないけど教えて欲しいっす。

言語切り替えが出来るように作ってあるページで、
フランス語なんかに言語を切り替えると文字化けして、その文字化けがタグを侵食したり
して表示が崩れたりします。フランス語やドイツ語を扱う時に注意する点ってどういうとこ
だか、誰かアドバイスもらえませんか?

ページは全部Perlで組んでます。
0710nobodyさん2006/02/16(木) 14:40:42ID:???
UTF-8人生で
0711nobodyさん2006/02/16(木) 19:00:13ID:???
index.html内で
<form action=aaa.cgi>
<input type=submit value=更新>
</form>
としているのですが、これだとボタンをクリックすると画面がaaa.cgiに移動してしまいます。
画面が一切変化しないでaaa.cgiを動かすにはどうすればよいでしょうか?
0712nobodyさん2006/02/16(木) 19:37:26ID:???
>>711
つ <form action="aaa.cgi" target="_blank">
0713nobodyさん2006/02/16(木) 20:02:38ID:???
>>711
Status: 204
07147112006/02/16(木) 20:32:43ID:???
レスありがとうございます。

>>712
別窓も開かない形にはできないでしょうか?
07157112006/02/16(木) 20:37:34ID:???
>>713

おぉ!できました!ありがとうございました。
0716nobodyさん2006/02/17(金) 00:28:06ID:???
>>706
perldoc CGIの「FETCHING THE PARAMETER LIST AS A HASH」という項目を読め。
07176762006/02/17(金) 00:50:26ID:LOkWB/9e
>>685
こんなソースです↓

if ($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN, $post, $ENV{'CONTENT_LENGTH'});
}else{ $post = $ENV{'QUERY_STRING'};}

for (split(/&/, $post)){
($word, $value) = m/^(\w+)=(.*)$/;
$value =~ s/\+/ /g;
$value =~ s/%([0-9A-F]{2})/pack('C', $1)/egi;
$q{$word} = $value;}

print <<EOS;
"Content-Type: text/html; charset=Shift_JIS"

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>たいとる</title>
</head><body>
〜略

PCでは大丈夫ですが携帯では表示はしても反応なしです
どなたかフォローお願いします
0718nobodyさん2006/02/17(金) 00:52:34ID:???
>>717
print <<EOS;
"Content-Type: text/html; charset=Shift_JIS"

これおかしくね?
何でダブルクォートが・・

つか略すな。そこも大事だ。
07196762006/02/17(金) 01:29:23ID:LOkWB/9e
>>718
>>705の下段
0720nobodyさん2006/02/17(金) 01:37:53ID:???
>>719
お前がゆうな。
0721nobodyさん2006/02/17(金) 01:42:50ID:???
>>719
シネ
0722nobodyさん2006/02/17(金) 01:49:09ID:???
>>718
お前はそれだけの情報で足りると思ってんのか?
エスパーさん向けだな。

つか>>719で萎えた。
名前の欄はちゃんと確認しようねボクちゃん。
0723nobodyさん2006/02/17(金) 01:59:20ID:???
おみくじCGIとか小学生でもやらねーよwwwwwwww
0724nobodyさん2006/02/17(金) 03:03:07ID:???
今 >>723 がいいこと言った
0725nobodyさん2006/02/17(金) 03:33:08ID:???
<title>676と愉快な仲間達</title>
0726nobodyさん2006/02/17(金) 03:36:38ID:???
>>718-725
悔しいのは分かるがContent-lengthも知らない香具師はとりあえず黙ってろ




最近アレだな、厨房っぽいのが常駐してんだな
0727nobodyさん2006/02/17(金) 03:44:28ID:???
>>726=>>676さんですかそうですか。

テメーさんも黙ってれば?
0728nobodyさん2006/02/17(金) 03:55:29ID:???
<title>ゆかいなどうぶつ</title>
0729nobodyさん2006/02/17(金) 03:57:25ID:???
>>727
構ってもらえなかったのが相当寂しかったんだよ。生暖かく見守ってあげようよ。
0730nobodyさん2006/02/17(金) 04:05:10ID:???
<title>みんな、学生さんかな?</title>
0731nobodyさん2006/02/17(金) 04:22:14ID:???
さすがWebProg板
07327062006/02/17(金) 04:51:48ID:RcUmmaVq
>>716
ありがとうございます。

use CGI;
CGI::ReadParse();
とすることで、%inをそのまま利用でき、$incfnも$inへ変更してファイル名が無事に取得できました。
ただ、マルチパートの画像を取り出すことができません。
open (OUTFILE,">>/usr/local/web/users/feedback");
 while ($bytesread=read($filename,$buffer,1024)) {
  print OUTFILE $buffer;
 }
close $filename;
としても0byteとなってしまいます。
今まで調べて試行錯誤してみましたが、どうにもなりませんでした。
どなたかアドバイスを頂けないでしょうか。
0733nobodyさん2006/02/17(金) 04:56:57ID:???
html の <form> タグがある行を書いてごらん
07347062006/02/17(金) 04:58:30ID:RcUmmaVq
>>733
<form action="./***.cgi" method="POST" ENCTYPE="multipart/form-data">
としております。
0735nobodyさん2006/02/17(金) 06:13:19ID:???
input radioでデータを取りたいんですが何故かデータが転送されないんです。
0736nobodyさん2006/02/17(金) 09:20:24ID:???
そうですか。
次からは独り言はチラシの裏にでも書いてね。
0737nobodyさんNGNG
>>735
ラジオボタンを選択してないとか。
0738nobodyさん2006/02/17(金) 12:39:23ID:???
>>732
$filenameの内容をどこから取得してるか明かせ。
多分、問題はそこ。
0739nobodyさん2006/02/17(金) 13:07:05ID:???
>>732
どうでもいいが
close OUTFILE;
とやってファイルハンドルをクローズじゃまいか
0740nobodyさん2006/02/17(金) 17:48:02ID:???
>739
よく気が付いたなw

ちゃんと閉じられてなかっただけっていうオチかな?

でも最後にちゃんと閉じられなくてもスクリプトが終われば閉じられると思ったし、ん〜なんだろ
0741nobodyさん2006/02/17(金) 17:51:12ID:???
つか $filename がどういった経緯でセットされてるか分からんので特務レベルエスパーじゃないと(;´Д`)
0742nobodyさん2006/02/17(金) 17:55:00ID:???
>>741
でもまあ $filename っていう変数名からして十中八九 read() の使い方間違えてるんだろうね。
0743nobodyさん2006/02/17(金) 17:57:35ID:???
もしかして
read("d:\test.txt", $readduff, 1024);
みたいな使い方を想像してるのかな?
0744nobodyさん2006/02/17(金) 21:15:59ID:???
LWPを使用しhttps接続まで試みたのですが、httpsのみ接続がうまくいきません。
Crypt-SSLeay-0.51はインストール済みでございます。

ソースは下記です。
ご教示いただけますと幸いです。

sub post_request{
use LWP::UserAgent;

my ($req_url, $data) = @_;

my $ua = LWP::UserAgent->new;

my $req = HTTP::Request->new(POST => $req_url);
$req->content_type('application/x-www-form-urlencoded');
$req->content($data);

my $res = $ua->request($req);

if($res->is_success){
return $res->as_string;
}
else{
return "";
}
}
0745nobodyさん2006/02/17(金) 21:36:53ID:???
なんで SSLeayを使わない
0746nobodyさん2006/02/17(金) 22:33:50ID:???
$textの中から「title」という文字を検索したいのですが
$tmp = index( $text , 'title' );としました。
しかし、「title」だけではなく「TITLE」という文字の可能性もあり
そちらも同時に検索したいのですが、良い方法はありますか?
0747nobodyさん2006/02/17(金) 22:38:03ID:???
>>745
SSLeayはインストールさえしておけばLWPが自動的に
使用してくれると仕様書に書いてありましたが、認識に
相違がございますでしょうか。
0748nobodyさん2006/02/17(金) 22:43:44ID:???
>>746
正規表現こそがPerlの華。
$text =~ /title/i
だけどこれじゃ位置を知ることはできないから、使える用途はやや限られる。
多くの場合位置を知らなくても処理できるんだけどね。
本当にそれが現れる位置を知りたいなら、先に小文字に合わせてしまうという手がある
$tmp = index( lc $text , 'title' );
0749nobodyさん2006/02/17(金) 22:52:04ID:???
>>748
下の方法で上手く行きました。
ありがとうございます。
0750nobodyさん2006/02/18(土) 00:16:59ID:???
>>748
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perlfunc.pod#pos_SCALAR__

$text = 'foo title bar tiTle, baz titlE foo Title, bar TITLE baz title';
print uc substr($text, pos($text) - 9, 4) while $text =~ /title/gi;
0751nobodyさん2006/02/18(土) 00:19:21ID:???
>>748
@-でわかるよ。

% perl -e '$text="aaaTitle"; $text =~ /title/i; print $-[0];'
3
0752nobodyさん2006/02/18(土) 00:25:35ID:???
>>750-751
そんな機能が……精進します
0753nobodyさん2006/02/18(土) 02:12:59ID:Hc0+hkLt
携帯だと実行できません
なので携帯でも実行できるように改造おねがいします

if ($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN, $post, $ENV{'CONTENT_LENGTH'});}
else{$post = $ENV{'QUERY_STRING'};}

for (split(/&/, $post)){
($word, $value) = m/^(\w+)=(.*)$/;
$value =~ s/\+/ /g;
$value =~ s/%([0-9A-F]{2})/pack('C', $1)/egi;
$q{$word} = $value;}

if ($q{'WORD'} ne ''){
for (split(/\r*\n+/, $q{'WORD'})){next unless /(.+)/;$word = $1;}
}

print <<EOS;
"Content-Type: text/html; charset=Shift_JIS"

<html><head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>たいとる</title>
</head><body>
$word
<form method="POST">
<input type="SUBMIT" value=" テスト "><input type="text" name="WORD">
</form></body></html>
EOS
0754nobodyさん2006/02/18(土) 02:18:16ID:???
>>753
自分でやる気が無い人はスレ違い
http://pc8.2ch.net/test/read.cgi/php/1127916965/
0755nobodyさん2006/02/18(土) 02:20:21ID:???
>>753
おみくじCGIの方ですか

<form method="POST">

actionを指定しないと確かドコモじゃ実行できないんじゃなかったか。
つか普通に記述ミスだろ
0756nobodyさん2006/02/18(土) 02:56:52ID:Hc0+hkLt
>>755
記述忘れでした
ありがとうございました
0757nobodyさん2006/02/18(土) 05:25:34ID:???
まだおみくじやってんのか(;´Д`)
0758nobodyさん2006/02/18(土) 07:46:55ID:???
リスト1
1139355934
1139301779
1139325935
1139231627
1139409916
リスト2
1139231627
1139301779
1139355934
1139325935
のようにリスト1とリスト2があって、それぞれ$list1[連番]$list2[連番]のようになっています。
リスト1の上から順に読み込んで、読み込んだ内容がリスト2のどれかと一致したとき
$check[$list1の内容]を1にしたいと考えています。下のようにやってみましたがうまくいきませんでした。
どのようにしたら実現できるのでしょうか。ご教唆お願いします。
   $num=-1;
   until($list1dir_filenum==$num){
   $num++;
   print "$list1name[$num]\n";
      $list2num=-1;
      until($list2dir_filenum==$list2num){
      $list2num++;
      print "$list2name[$list2num]\n";
         if ($list1name[$num]eq$list2name[$list2num]){
         $val=$list1name[$num];
         $namecheck[$val]="1";
         }
      }
   }
0759nobodyさん2006/02/18(土) 08:16:20ID:???
>>758
一ついえることは
× 教唆
○ 教示
0760nobodyさん2006/02/18(土) 08:27:09ID:???
>>758
言ってる事とやってる事が違うような、、
07617582006/02/18(土) 08:29:29ID:???
>>759
すいません。goo辞書で確認してみたら自分が間違いでした。教示ですね。ありがとうございます。
で、質問のほうはどのようにしたらうまくいくのでしょうか。お願いします。
0762nobodyさん2006/02/18(土) 08:38:48ID:???
>>758
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#data__arrays

my @list1 = (0..9, 5..9);
my @list2 = (1, 5, 10, 10);
my %check;
{
  my(%saw1, %saw2, %count);
  # ++$count{$_} == 2 && ++$check{$_} for # 要素が多い時
  # %check = map ++$count{$_} == 2 ? ($_, 1) : (), # map で一気に
  %check = map +($_, 1), grep ++$count{$_} == 2, # 段階を踏んで
    grep(!$saw1{$_}++, @list1), # それぞれのリストが既に
    grep(!$saw2{$_}++, @list2), # ユニークなら必要無し
  ;
}
print map "$_\n", sort { $a <=> $b } keys %check;
0763nobodyさん2006/02/18(土) 08:39:26ID:???
確認してないけど、だいたいこんな感じかな?
for $i (0 .. $#list1){
$check[$i]= grep($list1[$i] eq $_, @list2);
}
0764nobodyさん2006/02/18(土) 08:42:47ID:???
>>758
> $check[$list1の内容]
早まるなっそんな馬鹿でかい数を配列の添え字に使ったら
すごい量のメモリが確保されるぞ
0765nobodyさん2006/02/18(土) 11:31:58ID:???
俺さあ、エルピーダの仕事してるんだよね。
世の中こういうヘボだらけになって、メモリをガンガン使って欲しい。
0766nobodyさん2006/02/18(土) 11:49:24ID:???
>>764
・・・・マジで?
0767nobodyさん2006/02/18(土) 12:34:04ID:???
もし1要素1バイトとしたら理論的には約1ギガだけど、実際にはどれぐらいになるんだろう??
0768nobodyさん2006/02/18(土) 12:58:01ID:???
入れる値によって可変するからLONGなら8GB
テキスト入れた日にゃ・・・Perl落ちw
0769nobodyさん2006/02/18(土) 13:01:05ID:???
ってか Stringであつかえばいいんちゃうの・・?
0770nobodyさん2006/02/18(土) 13:02:07ID:???
・・・・ ごめ! ハッシュかと思ってた! 配列かYO!!
0771nobodyさん2006/02/18(土) 13:09:37ID:???
実際にはそんな事にならないから。
嘘だと思うならやってみれ。
0772nobodyさん2006/02/18(土) 13:11:23ID:???
Out of memory っていわれるね
07737652006/02/18(土) 13:21:35ID:???
Out of memoryといわれたらデータ構造考え直さずに、64ビット化しろ。
頭使わず、メモリ使え。
0774nobodyさん2006/02/18(土) 13:35:07ID:???
>>773がなんていうか、かわいそうとうか…
0775nobodyさん2006/02/18(土) 16:14:55ID:???
数年前に通ったPerl教室じゃ
おみくじこそPerlの真こっちゅおって言ってたなぁ・・・
この前通りかかったら別の教室になってた
0776nobodyさん2006/02/18(土) 17:47:39ID:???
いいじゃん、randの使い方の勉強にはなるぜ
0777 ◆TWARamEjuA NGNG
お神籤は、また戻しちゃうからなぁ。。。
くじ引きみたいなのがよろしいかと@randの使い方?(って好きなように使えばいいけれども)
0778nobodyさん2006/02/19(日) 00:53:45ID:???
Larryはおみくじ引かせるためにPerlつくったんですかそーですか
0779nobodyさん2006/02/19(日) 01:32:35ID:xuHW0Wkn
一行目にカウンターを入れたいので、二行目からforeachでまわしたいのですけど、
どんな風に書いたらよいですか?

データファイル

4234                 ←一行目(カウンター)
さいたま市<>県庁<>アリーナ<>レッズ  ←二行目以降はループで
川越市<>時の鐘<>古都
秩父市<>祭り<>花の街



プログラム

open(FILE, "<hogehoge.dat");
eval{ flock(FILE, 1) };
@log = <FILE>;

一行目の読み込み
@logの一行目

二行目以降はこの処理
@logの二行目以降
0780nobodyさん2006/02/19(日) 01:47:56ID:???
>>779
カウンタと次からのデータは切っても切れないものなの?
違うファイルにしてもいい希ガス。
で、foreachじゃなくて、for (my $i = 1; $i ++; @log) {}
で、いい希ガス。
0781nobodyさん2006/02/19(日) 01:49:33ID:???
shiftしなさい。
0782nobodyさんNGNG
my($readline) = <FILE>;
$readline =~ s/\x0D\x0A|\x0D|\x0A/;
my($cnt) = int($readline);

while($readline = <FILE>){
  〜処理〜
}
0783nobodyさん2006/02/19(日) 01:50:09ID:???
>>779
配列に読み込んでforeachするのが良いかどうかは置いといて。
一行最初に読めば良いじゃん。

open(FILE, "<hogehoge.dat");
eval{ flock(FILE, 1) };
$counter = <FILE>;
@log = <FILE>;
0784nobodyさん2006/02/19(日) 02:08:39ID:???
>>778
え?知らなかったの?
0785nobodyさん2006/02/19(日) 14:03:52ID:???


┌→┐
↑話↓
└←┘

0786nobodyさん2006/02/19(日) 15:17:40ID:???
>785
しょうがねぇじゃん
過去ログ読まねぇんだもんorz
0787nobodyさん2006/02/19(日) 17:04:46ID:???
┌←┐  ┌→┐
↓  ↑  ↑  ↓
└→┘  └←┘
    ↑↑
───────
  低  気  圧
0788nobodyさん2006/02/19(日) 19:19:24ID:sHmg7IfX
質問させてもらいます
今Z-Z BOARDをレンタルしているのですが、こんど自前の掲示板を設置したいと思っています
どうしても利用者のトリップを引き継ぎたいのですが設置しようと考えている掲示板は
暗号化の部分がこのようになっています
sub tripmake{
my($key,$salt,$trip);
$_[0]=~s/◆/◇/g;
if($_[0]=~/#(.+)/){
$key=$1;
$salt=substr($key."H.",1,2);
$salt=~s/[^\.-z]/\./go;
$salt=~tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;
$trip=substr(crypt($key,$salt),-10);
$_[0]=~s/#(.+)/◆<\/B>$trip/;
}
return $_[0];
}
Z-Z BOARDのトリップにすることは可能でしょうか?
皆様よろしくお願いいたします
0789nobodyさん2006/02/19(日) 19:33:27ID:???
>可能でしょうか?
可能です



終了、次の質問どうぞ
0790nobodyさん2006/02/19(日) 20:25:14ID:???
文字コードで困っています。
LWPのgetメソッドでページの情報を取ってきたのですが
その取ってきたページで使われている文字コードが何であるかを
知る方法は無いでしょうか?
0791nobodyさん2006/02/19(日) 20:40:05ID:???
jcode.pl の getcode
0792nobodyさん2006/02/19(日) 21:41:24ID:???
Jcode.pm の getcode
0793nobodyさん2006/02/19(日) 22:05:53ID:???
Encode::Guess
0794nobodyさん2006/02/19(日) 22:34:29ID:???
utf-8のために、Encodeのがいいかもね。
0795nobodyさん2006/02/19(日) 22:52:30ID:???
NKF の・・・、無理か・・・
07967882006/02/19(日) 22:58:25ID:???
数値をどのようにしたら実現できるのでしょうか。ご教唆お願いします。
0797nobodyさん2006/02/19(日) 23:03:51ID:???
もしかしてトリップ盗聴
0798nobodyさん2006/02/20(月) 00:26:00ID:ppD/ecqF
m/$x/;
とかしたときに、$xのなかにある正規表現の特殊文字を普通の文字として扱う場合はどうしたらいいですか
0799 ◆TWARamEjuA NGNG
quotemeta $x しておくとか /\G$x\E/ しちゃうとか。
0800nobodyさん2006/02/20(月) 00:46:50ID:???
>>799
thanks.
0801nobodyさん2006/02/20(月) 08:03:48ID:???
文字コードに答えて頂いた方、ありがとうございました
jcodeのgetcodeを使いました。>>793も調べてみようと思います。
0802nobodyさん2006/02/20(月) 10:55:25ID:???
>>801
>>794
0803nobodyさん2006/02/20(月) 15:30:11ID:???
>>799
\Q$x\E じゃねーの?
08048012006/02/21(火) 02:29:14ID:???
>>801です。
jcodeを利用したのですが、まだ文字化けが起こります。

$ua = LWP::UserAgent->new();
$res = $ua->get( $inurl );
if($res->is_success)
{
   $title = $res->title;
   &jcode::convert( $title , "euc", "", "z");
}
else
{
  #異常終了処理
}

ページ取得、タイトル取得には成功しているのですが。
jcodeの使い方は合ってますか?
私の使い方が正しくないのでしょうか?
jcodeでは希望の処理はできないのでしょうか?
Encodeを使えば回避できますか?
0805nobodyさん2006/02/21(火) 02:54:00ID:???
取得のページがutf-8とかじゃ?
0806nobodyさん2006/02/21(火) 03:14:58ID:???
>>804
渡すのは型グロブかリファレンス
&jcode::convert( \$title , "euc", "", "z");
0807nobodyさん2006/02/21(火) 17:43:45ID:???
ヒアドキュメントで書かれたものなら、変数に収めてlengthできるんですけど、
普通のプリント文をlengthするにはどうしたらいいんでしょうか?

sub hoge{
  print 'momoko';
  return;
}

この、サブルーチンhogeで出力される'momoko'の長さ(6文字)を計りたいのです。

$a = length(&unko);
print $a;

だとうまくいきせん。どうやればいいんでしょうか。
0808nobodyさん2006/02/21(火) 17:50:42ID:???
>>807
&unko がどこから出てきたのかわからないけど
サブルーチンの戻り値にセットすればどう
0809nobodyさん2006/02/21(火) 17:51:46ID:???
>>807
どうしてもprintを使いたいならIO::ScalarなりIO::Stringなり、
さらに必要ならIO::Teeなりを使う必要がある。
■ このスレッドは過去ログ倉庫に格納されています