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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/05/25(水) 06:36:28ID:PVpWgcdf
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0035nobodyさん2005/05/26(木) 03:45:31ID:???
@array =(0,1,2,3);
$index= rand @array;
print $array[$index], "\n";
print "<BR>\n";print "<BR>\n";

配列の要素をランダムに取り出した時、
その要素を固定して留めるにはどうしたらいいでしょうか。
当たり前なんですが、更新ボタンを押すと要素が変化してしまいます。

こんな風に無理矢理別の変数に突っ込んでみようとしましたが
$array[$index]=$mem;
$memには何も記録されませんでした。
0036nobodyさん2005/05/26(木) 04:58:14ID:???
>>19
my $hogehoge = new ABCD::Saitama;
my $st = $hogehoge->db->wakame('wake wakame');

 を書き直すと

my $hogehoge = ABCD::Saitama->new();
my $tmp = $hogehoge->db();
my $st = $tmp->wakame('wake wakame');

 と同等、意味は

1行目の左辺: ABCD::Saitamaパッケージで定義されているnew関数を呼出す。
1行目のnew関数: ABCD::Saitamaパッケージと関連付けされたリファレンスを返す。
1行目の右辺: new関数の戻り値であるリファレンスを$hogehogeに代入。
2行目の左辺: ABCD::Saitamaパッケージで定義されているdb関数を呼出す。
2行目のdb関数: 何かのパッケージと関連付けされたリファレンスを返す。
2行目の右辺: db関数の戻り値であるリファレンスを$tmpに代入。
3行目の左辺: 何かのパッケージで定義されているwakame関数に引数を渡して呼出す。
3行目のwakame関数: 引き数を受け取って何かの値を返す。
3行目の引き数: この場合の引き数とは'wake wakame'という文字列定数のこと。
3行目の右辺: wakame関数の戻り値である何かの値を$stに代入。
0037nobodyさん2005/05/26(木) 05:05:38ID:???
>>36
あっ、左辺と右辺を書きまちごうたけど、まっいっか。
0038nobodyさん2005/05/26(木) 07:47:44ID:???
>>32
fileを指定できると他人のパソコンのファイルが勝手に引き出せるので無理
アップファイルをサーバにテンポラリとして保存しておき確認OKならそのファイルを使うようにする。
ただ確認画面で処理をやめられた場合にテンポラリファイルがゴミとして残るのでガベージコレクションみたいな処理が必要。
0039nobodyさん2005/05/26(木) 11:23:28ID:7fGLJWg9
すいません質問お願いします。
自分で作った掲示板で、書込み内容を修正しようとおもったのですが、
削除機能がついてないので、ftpでログをダウンロードして
書込み内容を修正してからアップロードしたら
きちんと表示されなくなりました。

ログの保存方法は
title<>name<>kakikominaiyou
title<>name<>kakikominaiyou
見たいな感じ記録して
読み込みは
open(LOG,"$logname");
@log = <LOG>;
for($i=0;$i<@log;$i++){
}
なのですが、
@log = <LOG>のところで一行づつ読み込めてないようなのですが
どこに原因があるのでしょうか?お願いします。
0040nobodyさん2005/05/26(木) 11:49:50ID:???
>>17
 まず open(ABC, ">") じゃなくて open(ABC, "+<") に変えるべき。

>>35
 >>37

>>39
 ヒント : $log = <LOG>; print $log; ってやったらどんな文字列が出る?
0041nobodyさん2005/05/26(木) 16:07:48ID:???
お願いします。

がらくたBOOKさんの「SiteHistory」を改造中です。
ttp://tinkle.cside.com/book/cgi/cgi.htm
項目をがらりと変えたのですが、どうもうまくいきません。修正しようとすると、一番上の行のカウンターだけ残して全ログが消えてしまいます。
とりあえず、修正サブルーチンは以下の通りです。
---------------------
sub edit3 {
if ($in{'pass'} ne "$pass") { &error("パスワードが違います"); }
# ログファイル読み込み
open (FILE, "$data") || &error("ファイルが開けません");
@data = <FILE>;
close(FILE);
# カウント退避
$count = shift (@data);
foreach $line (@data) {
($no,$coview,$name,$tel,$genre,$floor,$all,$fday_i,$sday_i) = split(/<>/,$line);
chomp;
if ($no eq $in{'edit_no'}){
$line = "$no<>$in{'coview'}<>$in{'name'}<>$in{'tel'}<>$in{'genre'}<>$in{'floor'}<>$in{'all'}<>$in{'fday_i'}<>$in{'sday_i'}<>\n";
}else {$line = "$no<>$coview<>$name<>$tel<>$genre<>$floor<>$all<>$fday_i<>$sday_i<>\n"; }
push(@new,$line);
}
# ログを更新
unshift(@renew,"$count");
open(OUT,">$data") || &error("削除処理を失敗しました");
print OUT @renew;
close(OUT);
&admin;}
-----------
どこが間違っているのでしょう?
0042nobodyさん2005/05/26(木) 17:09:45ID:???
それを丸投げって言うんだよ
0043nobodyさん2005/05/26(木) 17:27:51ID:???
思考を放棄したら人としておしまいですよ
0044392005/05/26(木) 18:44:15ID:7fGLJWg9
>>40
レスありがとうございます。
試してみたところ
書込み内容の改行のところで一行と扱われてしまっているようです。
なにかいい方法はないのでしょうか?

わかりやすく言うと
title<>name<>書込み内容の改行
書込み内容の途中
title<>name<>書込み内容

上記のように出力されてしまいます。
0045nobodyさん2005/05/26(木) 19:16:41ID:???
>>44
ログの改行コードの扱いを整理した方が良いと思う。
その掲示板の CGI やエディタや ftp クライアントなどが、
それぞれどんな改行コードを想定しているかとか改行コードを変換したりしてないかとか、
そういうあたりを。
0046nobodyさん2005/05/26(木) 20:31:30ID:???
>>44
つまり、ログに保存するとき、例えば、

my $str = "その書き込み内容の改行";
$str =~ s/\r?\n/<br>/g;

とかで改行タグを無くしなさい。
1行ごとにログ保存してる掲示板とかならみんなやってることだぞ。
0047nobodyさん2005/05/26(木) 20:33:06ID:3LXc6fmj
自サイト内アイテムを検索する場合の
検索システムのルーチンについて質問です。

1.検索結果と同じ数の変数を作り、
  検索結果をその変数に格納する
   ↓
2.1〜50件、または51〜100件までと表示する際、
  1の変数から取り出して表示する

という考え方で合ってますでしょうか。
0048352005/05/26(木) 21:40:41ID:4tEZgW2V
>40
すみません、どうして>37と書かれているのかわかりません
>37に書いてある事の意味は何となく理解できますが
難しすぎて応用の域に達しませんでした…。
0049nobodyさん2005/05/26(木) 22:25:58ID:???
>>48
 >>40
 > こんな風に無理矢理別の変数に突っ込んでみようとしましたが
 > $array[$index]=$mem;
 > $memには何も記録されませんでした。

 >>37
 > 左辺と右辺を書きまちごうたけど
0050nobodyさん2005/05/26(木) 22:28:55ID:???
>>47
ようわからんけどあってることにしとく。
0051nobodyさん2005/05/26(木) 22:45:13ID:???
【ゴールデンレス】
  ∩ ・∀・)∩∩ ´∀`)∩  このレスを見た人はコピペでもいいので
   〉     _ノ 〉     _ノ10分以内に3つのスレへ貼り付けてください。
  ノ ノ  ノ  ノ ノ  ノそうすれば14日後好きな人から告白されるわ宝くじは当たるわ
  し´(_)   し´(_) 出世しまくるわ体の悪い所全部治るわでえらい事です
0052352005/05/26(木) 23:12:36ID:Q34ppmGc
>49
>36を一生懸命よんでまっすたごめんなさい…できました
ところで、>35に付け加える感じなんですが

$tmp01 = "シュウマイ";
$tmp02 = "餃子";
$tmp03 = "食いてぇ〜";
@array = (01,02,03);
$index = rand @array;
my $mem = $array[$index];

これで、$tmp.$memのようにして
print "$tmp.$mem"\n";
$tmp01〜$tmp03の中身(シュウマイとか)を表示させたいんですが
やっぱりうまく行きません……どうしたらいいでしょうか?
0053nobodyさん2005/05/27(金) 00:32:30ID:???
>>52
$tmp01 = "シュウマイ";
$tmp02 = "餃子";
$tmp03 = "食いてぇ〜";
@array = ('01','02','03');
$index = rand @array;
my $mem = $array[$index];
print "${tmp.$mem}\n";
0054nobodyさん2005/05/27(金) 00:39:41ID:???
>>53
@array = qw"シュウマイ 餃子 食いてぇ〜";
print "$array[rand@array]\n";
0055532005/05/27(金) 04:39:59ID:OuNiDnY3
レスありがとうございます、いろいろなやりかたがあるのですね。
表示ができました。

それと、どうしても詰まってしまったんですが
スクリプト上で、${tmp.$mem}を$tmp01〜$tmp03と認識させて、
以降の処理に使いたい場合はどうすれば良いのでしょうか?

$tmp01 = "0";
$tmp02 = "0";
$tmp03 = "0";
@array = ('01','02','03');
$index = rand @array;
my $mem = $array[$index];

${tmp.$mem} = 1;
#$tmp01〜$tmp03に1を代入したい

printで表示させた時はうまくいったのですが、スクリプト上だと
${tmp.$mem}を$tmp01〜$tmp03そのものとは認識してくれなくて、ここで止まってます
${tmp.$mem}の結果を該当する$tmp01〜$tmp03にすり替えるには…?
0056532005/05/27(金) 05:03:41ID:???
勘違いしてました、できますよねちょっと寝てきます

ぎゃぼー
0057nobodyさん2005/05/27(金) 06:32:17ID:???
$tmp01〜$tmp03 を @tmp に変えれば use strict 下でも動いていろいろ楽だろうに。
何事も考え方一つだ! ・・・対位法でも学んでおくかい?
0058nobodyさん2005/05/27(金) 07:19:03ID:???
こんな書き方も出来るけど、お勧めできない。
my $tmp01 = "シュウマイ";
my $tmp02 = "餃子";
my $tmp03 = "食いてぇ〜";
my @array = \($tmp01, $tmp02, $tmp03);
my $index = rand @array;
my $mem = ${$array[$index]};
print "$mem\n";

いつも思うのけど、なぜ配列を使うのを嫌うのだろう。
0059アップロードの質問2005/05/27(金) 07:28:24ID:???
>>38
レスありがとうございます。

>fileを指定できると他人のパソコンのファイルが勝手に引き出せるので無理
なるほど、そういう事なのですか。。。そう言われればそうですよね。

>アップファイルをサーバにテンポラリとして保存しておき確認OKならそのファイルを使うようにする。
>ただ確認画面で処理をやめられた場合にテンポラリファイルがゴミとして残るのでガベージコレクションみたいな処理が必要。
やはり最初のsubmitで送信してしまわないといけないのですね。。。
ご指摘の通り、確認画面でやめられた時の「ゴミ」が気になっていたので
なんとか確認ページからのアップロード処理を出来ないものかと思っていました。

とりあえず、疑問はなくなりスッキリしました。
ありがとうございます!
0060nobodyさん2005/05/27(金) 14:45:20ID:???
use vars qw($A $B);

↑このvarsてのは何なのですか?
後qwとかqqとかもありますが、それについての詳細もお伺いしたいのですが
0061nobodyさん2005/05/27(金) 14:46:50ID:???
そうやってひとつひとつここで聞いていくつもりか?
0062nobodyさん2005/05/27(金) 14:55:18ID:???
>>60
 >>7
 あるいはぐぐればすぐでてくるっつ
0063nobodyさん2005/05/27(金) 15:11:30ID:???
>>61
はい。
0064nobodyさん2005/05/27(金) 15:17:51ID:???
>>63
さあ、はやく上司の愛想伺いに戻るんだ
0065nobodyさん2005/05/27(金) 15:18:50ID:???
>>63
最低限、>>1くらい読みなさい。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません
0066532005/05/27(金) 15:55:26ID:???
>57
$tmp01〜$tmp03を@tmp('$tmp01','$tmp02','$tmp03')とまとめるという事でしょうか?

実は$tmpの01〜03以外にも、別の変数$soc01〜03があって
$tmp01の内容が$soc01に、$tmp02が$soc02に(以下略)…
対応している、という仕組みになってます
なので、数字だけ出して割り振ろうと考えてました。

配列を使うのを嫌うというか、有効な使い方がまだよくわからんとです…。
見てると多分効率悪いんでしょうね、ネットで調べながらやってるんですが応用は難しいです、

あ、>60は自分じゃないです
0067nobodyさん2005/05/27(金) 15:57:50ID:???
>>65
当然読んでおります。マナーですから。
0068nobodyさん2005/05/27(金) 16:24:21ID:???
>>66
こう使うって意味だと思う
@tmp = ("シュウマイ", "餃子", "ラーメン");
#$tmp[0] = "シュウマイ";
#$tmp[1] = "餃子";
#$tmp[2]= "食いてぇ〜";
@soc = (100, 200, 300);
$count = @tmp;
$index = int(rand $count);
print "$tmp[$index] $soc[$index]円";
0069nobodyさん2005/05/27(金) 17:20:12ID:???
>>66
> 数字だけ出して割り振ろうと〜
余計配列とかのが適してない?
ハッシュ(連想配列)でもいいかもしれない。

my $tmp01 = 'シュウマイ';
my $tmp02 = '餃子';
my $soc01 = 100:
my $soc02 = 200:

ってやるより、

my %menu = (
    'シュウマイ', => 100,
    '餃子' => 200,
);

とかやった芳がわかりやすいと思わないかい?。
0070nobodyさん2005/05/27(金) 17:22:02ID:???
ごめんちょっとtypoってるわ
0071nobodyさん2005/05/27(金) 17:56:56ID:???
個人的には

my @db = (
{name=>'シュウマイ',price=>100},
{name=>'餃子',price=>200}
);

ってやるのが好き
Template Toolkit にもそのまま貼りつけられて楽だし
0072532005/05/27(金) 18:10:05ID:???
>68
この例でようやく直感的に理解できました、そうですよね変数をしまっておけるんですよね
正直な所、配列の本当の便利さがよくわかってませんでした、すごい便利なんですね、恥ずかしい

配列もちゃんと理解してなかったのにアレですが、>69のハッシュは使えそうだなと思ってました
ただ、要素をランダムに選び取るというのがどうやったらいいのか全くわからなくて
今までここでお世話なった分で何とか$tmpを取り出す所まではできたんですが、
@array = ('01', '02','03',);
$index= rand @array;
my $sed=$array[$index];
%hash = ($tmp01=>$soc01, $tmp02=>$soc02, $tmp03=>$soc03,);
%hash_value = reverse %hash;
print $hash_value{${soc.$tmp}};

$socの中身を一緒に取り出すというのができませんでした。
(eachだと1つではなく、全部取り出してしまいますよね?)
下2行のvalueの所をkeyに、socをtmpに変えても何も出てこない…
reverse関数で何故こういう結果が出るのかも実はよくわかりません……
0073532005/05/27(金) 18:11:34ID:???
>71のは…なんか…なんか……なんかすごいですね
よくわかりませんがすげえー そんなやり方もあるのか!
0074nobodyさん2005/05/27(金) 19:45:37ID:???
>>72
それだとすごく >>68 と >>69 意味ないなw
どうしてもその 01, 02, 03, ってのは必要なの?
0, 1, 2, じゃだめなの?

どうしても 01, 02, 03 にしたいなら、こう書くのは?

my %hash = (
    '01' => { tmp => $tmp1, soc => $soc1 },
    '02' => { tmp => $tmp2, soc => $soc2 },
    '03' => { tmp => $tmp3, soc => $soc3 },
);
my @key = keys %hash; # ex) 01, 02, 03
my $index = rand @key # ex) 1
my $sed = $key[$index]; # ex) 02
my $r = $hash{$sed}; # ex) { tmp => $tmp2, soc => $soc2 }
print $r->{tmp}; # $tmp2
print $r->{soc}; # $soc2

1行1行やるのはまわりくどいけどとりあえず。
0075532005/05/27(金) 20:10:30ID:???
>73
ですよね…生かせてないなと思いつつ、どうしたらいいもんか思いつきませんでした…。

>0, 1, 2, じゃだめなの?
全然だめじゃないです。ファイルの名前つける時のクセで0つけてました

'01' => { tmp => $tmp1, soc => $soc1 },
あの、無知で恥ずかしいんですがこれってどうなってるんでしょうか?
01〜03がキーで{}の中身が値、{}の中で値が二種類ある、という状態でしょうか。
>71のも見て「?」ってなったんですが、ハッシュってキー1つに対して
値1つを格納しておく物だと思ってたんですが…1:1じゃない場合もあるという事 ??

まずは>73で教えてもらったので勉強してもちょっと頑張ってみます。
0076nobodyさん2005/05/27(金) 20:49:21ID:C4o5Scf8
>>40
>>17ですが、遅レスですいません。
データ項目に点数という項目があり、データが追加される度に点数の降順に並べ替えて書き込みを
行っています。こういった場合でもopen(ABC, ">") を使わない方法はありますでしょうか?
0077nobodyさん2005/05/27(金) 20:53:42ID:???
パンチ5分の2は元気かな
0078nobodyさん2005/05/27(金) 20:56:48ID:C4o5Scf8
よろしくお願いします。
a.cgiからb.cgiを呼び出すときに、引数を渡したいのですが、
以下のような渡し方では根本的に間違っているのでしょうか?

【a.cgi側】
print "<FORM METHOD=\"POST\" ACTION=\"b.cgi?x=1>\n";

【b.cgi側】
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
}

としているのですが、$value にはなにも入っていませんでした。
0079nobodyさん2005/05/27(金) 21:53:12ID:???
>>75
@array = (
{tmp=>'シュウマイ',soc=>100},
{tmp=>'餃子',soc=>200},
{tmp=>'ラーメン',soc=>500},
{tmp=>'チャーハン',soc=>400},
{tmp=>'半熟卵',soc=>50},
);
%hash = %{$array[rand@array]};
print "$hash{tmp}\t$hash{soc}\n";
0080nobodyさん2005/05/27(金) 22:45:10ID:???
>>79
こんなプログラム作ってみた。

%menu = (
'シュウマイ' => {soc=>100},
'餃子' => {soc=>200},
'ラーメン', => {soc=>500},
'チャーハン' => {soc=>400},
'半熟卵' => {soc=>50},
'チャーシュー' => {soc=>100},
'ライス' => {soc=>150},
'チャーシューメン' => ['ラーメン','チャーシュー','半熟卵'],
'ラーメンセット'=> ['ラーメン','ライス','半熟卵'],
'チャーシューメンセット' => ['チャーシューメン','ライス'],
'チャーハンセット' => ['ラーメン','チャーハン','半熟卵'],
'シュウマイセット' => ['ラーメンセット','シュウマイ'],
'餃子セット' => ['ラーメンセット','餃子'],
);
0081nobodyさん2005/05/27(金) 22:45:25ID:???
@menu = keys %menu;
%hash = sub{menu=>$_[1],$_[0]->(@_)}->(sub{
my $code = shift;
my $key = shift;
if(ref $menu{$key} eq 'HASH'){
return(tmp=>$key,soc=>$menu{$key}{soc});
}elsif(ref $menu{$key} eq 'ARRAY'){
my @tmp;
my $soc;
foreach my $key(@{$menu{$key}}){
my %hash = $code->($code,$key);
push @tmp, $hash{tmp};
$soc += $hash{soc};
}
return(tmp=>join(":",@tmp),soc=>$soc);
}else{
return(tmp=>'',soc=>0);
}
},$menu[rand@menu]);
print "$hash{menu}\t[$hash{tmp}]\t$hash{soc}\n";
0082nobodyさん2005/05/27(金) 22:47:14ID:???
>>78
hidden
0083nobodyさん2005/05/27(金) 23:31:46ID:???
>>78
ヒント : action="b.cgi?x=1" の x=1 は $ENV{'QUERY_STRING'} に記録される。


>>75
0, 1, 2 、どっちでもいいなら >>71 および >>79 の方法にしとくのが一番いいかと。
まあ、>>79 はわざわざ %hash にしなくても、別に無名ハッシュのままでいいじゃん、とは思うけどな。

%hash = %{$array[rand@array]};
print "$hash{tmp}\t$hash{soc}\n";
↓
$hash = $array[ rand @array ];
print "$hash->{tmp} \t $hash->{soc} \n";

矢印演算子、覚えればいろいろベンリだぞ。


>>80-81 は・・・まあ好みで
0084nobodyさん2005/05/27(金) 23:41:49ID:???
>矢印演算子、覚えればいろいろベンリだぞ。

何か違くね?
0085nobodyさん2005/05/27(金) 23:51:07ID:???
・・・エ、何が?(:´д`) arrow operator ?
0086nobodyさん2005/05/28(土) 06:51:40ID:???
>>85
>>83の一文だと、矢印演算子が万能みたいだって言いたいんじゃね?

そもそも>>75はリファレンスを知らなさそうだし
リファレンスをデリファレンスするのに
矢印演算子が使えるよってのが適切ではないかと
0087nobodyさん2005/05/28(土) 11:01:56ID:???
便利なのは「矢印演算子」じゃなくて「リファレンス」だろ。
矢印演算子を全く使わなくてもデリファレンスやメソッドコールはできるからな。
0088nobodyさん2005/05/28(土) 11:19:45ID:???
>>86-87
ああ、そうだね。 リファレンス。
それはわかるけど、でも >>83 のは >>79 に対して言ったんだけどなw

> %hash = %{$array[rand@array]};。
せっかくリファレンス使ってるのに、わざわざそんなくどい書きかたしなくても、って。
矢印知ってたら楽に書けるのになーと。

まあ誤解生ましたようで正直スマンかった。
0089nobodyさん2005/05/28(土) 11:49:47ID:???
ああ、全然関係無い話ね。紛らわしい。
0090752005/05/28(土) 12:47:52ID:???
矢印演算子とリファレンス、ググって調べてみました。
>75の疑問がすんなり解決しました… 多次元配列って訳がわからなくて今まで無視してました

何か色々とお世話になってしまって、すごく助かりました
いただいたレスのスクリプトや内容を把握しきれてない部分が多いので、
名無しに戻ってまた勉強してきます。目が回りそうです。

もしまた詰まったら助けたって下さい〜このスレの人皆やさしい!幸あれ!ほんとありがとう!
0091nobodyさん2005/05/28(土) 13:44:25ID:mN70gA2+
>>83
>>78ですが、おかげさまで分かりました。ありがとうございます。
0092nobodyさん2005/05/28(土) 19:21:59ID:/z95VPw7
クエリを使用してマルチバイト文字を入力する為、以下のコードを作成しました。

>> test.cgi
#!/usr/bin/perl
#cgiはEUCで記述
require './jcode.pl';
print <<'END_OF_HEADER';
Content-type: text/html; charset=EUC-JP

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=euc-jp"></HEAD><BODY>
END_OF_HEADER
  $query = $ENV{'QUERY_STRING'}; #クエリ文字列を得る
  print &jcode'getcode(\$query); #入力されたクエリの文字コード
  &jcode'convert(*query, 'euc'); #EUCに変換
  print ' to ', &jcode'getcode(\$query), '<BR>'; #変換されたことを確認
  print '<A HREF="test.cgi?', $query, '">', $query, '</A>'; # 文字化け発生部分
print <<'END_OF_FOOTER';
</BODY></HTML>
END_OF_FOOTER
<<

3: 半角文字及び、一部の全角文字(あいうえお、アイウエオ 等)では成功。しかし、一部の全角文字(まみむめも、マミムメモ 等)で、文字化けを起こします。
マルチバイト文字の2バイト目が悪さをすると思ってEUCにしたんですが、このコードでは処理が不完全なようです。問題部分の指摘をどうぞよろしくお願いいたします。
0093nobodyさん2005/05/28(土) 20:47:58ID:???
Jcode.pmとかEncode.pmは使えないの?
0094nobodyさん2005/05/28(土) 20:58:22ID:???
どこでURL unescapeしてんだ?
0095nobodyさん2005/05/28(土) 21:01:04ID:???
"文字化け"っつーか・・・
$query =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
とかしてないけど平気なのか?
0096nobodyさん2005/05/28(土) 21:02:05ID:???
かぶった orz
00979262005/05/28(土) 21:08:01ID:???
とりあえずIEに「http://〜/test.cgi?マミムメモ」とダイレクトに入力しちゃってる段階なので、
URLデコードは考えてません・・・。
0098922005/05/28(土) 21:13:29ID:???
URLデコードを入れて、
test.cgi?%83%7d%83%7e%83%80%83%81%83%82
(マミムメモ)でやってみましたが、結果同様でした。

ちょっと舌足らずでした。最初に上記の様にアクセスした時はうまくいくのですが、
それで出てきたリンクを使って再帰的にアクセスした時に文字化けを起こします。
0099nobodyさん2005/05/28(土) 21:43:25ID:???
それは http://〜/test.cgi?マミムメモ みたいなリンクを出力してるからなんじゃないの?
0100nobodyさん2005/05/28(土) 22:59:52ID:z135H4rk
if( @BUF==5 ){ … }
if( scalar @BUF==5) { … }

この二つの条件式の書き方で、下の方が良いとか上の方が良いと言うことはありますか?
0101nobodyさん2005/05/29(日) 00:02:47ID:???
好きな方を使え
0102nobodyさん2005/05/29(日) 00:05:59ID:???
>>101
サンクス。特にどっちでも良いんだね。
0103nobodyさん2005/05/29(日) 14:34:29ID:I/a3Ab/R
初心者ですが、並び替えの基本を教えて下さい。

名前、点数、日付
A  80 20050529
B  100 20050523
C  70 20050525
D  80 20050524

というようなデータを点数の降順に並び替える場合はどうすれば良いのですか?
リストにセットしてsortを使っても、点数での並び替えは出来ないですよね?
一度ハッシュというものに点数をkeyとしてセットし、keyで並び替えたりする
のですか??でも同じ点数があった場合はまずいですよね?
なんかアホな質問ですいません。標準的な並べ替え方法を教えて下さい。
0104nobodyさん2005/05/29(日) 14:38:05ID:I/a3Ab/R
>>103です。
記述し忘れましたが、同点の場合は、できれば日付の降順にしたいです。
0105nobodyさん2005/05/29(日) 15:17:33ID:???
>>103
my @array = (
# 名前、点数、日付
['A',80, 20050529],
['B',100, 20050523],
['C',70, 20050525],
['D',80, 20050524],
);

my @sorted_array =
sort { $b->[2] <=> $a->[2] } # 日付で
sort { $b->[1] <=> $a->[1] } # 点数で
@array;
0106nobodyさん2005/05/29(日) 16:30:09ID:???
>>104
my @array = (
# 名前、点数、日付
['A',80, 20050529],
['B',100, 20050523],
['C',70, 20050525],
['D',80, 20050524],
['E',70, 20050526],
['F',80, 20050526],
['G',50, 20050526],
);

my @sorted_array = sort {
$b->[1] <=> $a->[1] || # 点数で
$b->[2] <=> $a->[2] # 日付で
}@array;
0107nobodyさん2005/05/29(日) 16:37:41ID:???
>>104
my @array = (
# 名前、点数、日付
{name=>'A',point=>80,date=>'2005/05/29'},
{name=>'B',point=>100,date=>'2005/05/23'},
{name=>'C',point=>70,date=>'2005/05/25'},
{name=>'D',point=>80,date=>'2005/05/24'},
{name=>'E',point=>70,date=>'2005/05/26'},
{name=>'F',point=>80,date=>'2005/05/26'},
{name=>'G',point=>50,date=>'2005/05/26'},
);

my @sorted_array = sort {
$b->{point} <=> $a->{point} || # 点数で
$b->{date} cmp $a->{date} # 日付で
} @array;

print map{"$_->{name}\t$_->{point}\t$_->{date}\n"}@sorted_array;
0108nobodyさん2005/05/29(日) 16:44:36ID:???
>>103 >>104
my %hash = (
# 名前、点数、日付
'A' => {point=>80,date=>'2005/05/29'},
'B' => {point=>100,date=>'2005/05/23'},
'C' => {point=>70,date=>'2005/05/25'},
'D' => {point=>80,date=>'2005/05/24'},
'E' => {point=>70,date=>'2005/05/26'},
'F' => {point=>80,date=>'2005/05/26'},
'G' => {point=>50,date=>'2005/05/26'},
);

my @sorted_keys = sort {
$hash{$b}{point} <=> $hash{$a}{point} || # 点数で
$hash{$b}{date} cmp $hash{$a}{date} # 日付で
} keys %hash;

print map{"$_\t$hash{$_}{point}\t$hash{$_}{date}\n"}@sorted_keys;
0109nobodyさん2005/05/29(日) 17:04:57ID:???
>>103
my @array = (
# 名前、点数、日付
[qw( A 80 20050529 )],
[qw( B 100 20050523 )],
[qw( C 70 20050525 )],
[qw( D 80 20050524 )],
);

my %hash = map{
$_->[0] => {
point => $_->[1],
date => $_->[2],
}
} @array;

my @sorted_keys = sort {
$hash{$b}{point} <=> $hash{$a}{point} || # 点数で
$hash{$b}{date} <=> $hash{$a}{date} # 日付で
} keys %hash;

print map{"$_\t$hash{$_}{point}\t$hash{$_}{date}\n"}@sorted_keys;
0110nobodyさん2005/05/29(日) 17:26:07ID:???
>>103
print map{
"$_->[0]\t$_->[1]\t$_->[2]\n"
} sort {
$b->[1] <=> $a->[1] ||
$b->[2] <=> $a->[2]
} map {
[
grep {
!/^\s*$/
} split /\s+/
]
}grep{
!/^\s*$/
} split /\n/, q(
A 80 20050529
B 100 20050523
C 70 20050525
D 80 20050524
);
0111nobodyさん2005/05/29(日) 17:28:44ID:w/eeChjM
すんません質問です。

open(FH,"subject.txt");
@list=<FH>;
close(FH);

と同等のことを、http://news19.2ch.net/newsplus/subject.txtからとってきて
やりたいんですが、どげんすればいいんでしょうか?

XP上でhttpdとActivePerlでテストしてる段階で行き詰ってます。
0112nobodyさん2005/05/29(日) 17:30:16ID:w/eeChjM
>>111
そっくりそのまま落としてきて、subject.txtとして保存するんでもいいす。
むしろそれがしたいっす。
おながいします。
0113nobodyさん2005/05/29(日) 17:32:22ID:???
LWP
0114nobodyさん2005/05/29(日) 17:44:34ID:???
>>111
use LWP::Simple;

open(FH,">subject.txt");
print FH get 'http://news19.2ch.net/newsplus/subject.txt';
close(FH);
0115nobodyさん2005/05/29(日) 17:51:07ID:???
>>111
use LWP;
open(FH,">subject.txt");
binmode FH;
print FH LWP::UserAgent->new()->request(
HTTP::Request->new(
GET => 'http://news19.2ch.net/newsplus/subject.txt'
)
)->content();
close(FH);
0116nobodyさん2005/05/29(日) 18:08:16ID:???
>>112
use LWP;
open(FH,">subject.txt");
binmode FH;
print LWP::UserAgent->new(
agent => 'HogeHoge-Agent'
)->request(
HTTP::Request->new(
GET => 'http://news19.2ch.net/newsplus/subject.txt',
HTTP::Headers->new(
Referer => 'http://hogehoge/'
)
)
)->content();
close(FH);
0117nobodyさん2005/05/29(日) 18:35:04ID:EsZHM8T2
>>111
ほれ、俺の力作
GET http://news19.2ch.net/newsplus/subject.txt > subject.txt
0118nobodyさん2005/05/29(日) 18:43:53ID:???
>>111
>>116はファイルに保存できないねすまん。>>115の真似はせず一つづつ展開してみた。
use LWP;

my $url = 'http://news19.2ch.net/newsplus/subject.txt'; #取得したいコンテンツのURLを指定
my $user_agent = 'HogeHoge-Agent'; #ユーザーエージェント名を指定
my $referer_url = 'http://hogehoge/'; #参照元を指定
my $save_file = 'subject.txt'; #保存先のファイル名

my $ua = LWP::UserAgent->new(agent => $user_agent); #エージェントオブジェクトを作成
my $header = HTTP::Headers->new(Referer => $referer_url); #HTTPヘッダーオブジェクトを作成
my $request = HTTP::Request->new(GET => $url, $header); #HTTPリクエストオブジェクトを作成
my $respons = $ua->request($request); #サーバに接続してデータを取得
my $content = $respons->content(); #取得したコンテンツ内容を変数にコピー

open(FH,">$save_file"); #保存先ファイルを書込みモードでオープン
binmode FH; #保存形式をバイナリ形式に指定
print FH $content; #コンテンツ内容をファイルに保存
close(FH); #保存先ファイルを閉じる
0119nobodyさん2005/05/29(日) 19:05:27ID:???
>>111
use LWP;
open(FH,">subject.txt");
binmode FH;
LWP::UserAgent->new(
agent => 'areyakoreya'
)->request(
HTTP::Request->new(
GET => 'http://news19.2ch.net/newsplus/subject.txt',
HTTP::Headers->new(
Referer => 'http://untara.kantara.com/tekitou.html'
Cookie => 'are=nani',
)
),
sub{ print FH $_[0] },
1024*1024
);
close(FH);
0120nobodyさん2005/05/29(日) 20:41:42ID:QH9/XuV4
みなさんありがとうございます。ひとつひとつやってみます。
0121nobodyさん2005/05/29(日) 22:00:45ID:I/a3Ab/R
質問お願い致します。
@wk_list[0] と$value の共に数値、文字が混在している場合、

if( @wk_list[0] eq $value || @wk_list[0] == $value ){

と記述すると、数値同士の場合はうまくいきますが、文字の場合違う
データと一致してしまいます。数値、文字が混在の場合の比較演算は
どうすれば良いですか?
0122nobodyさん2005/05/29(日) 22:23:47ID:QH9/XuV4
>>111-112経過報告〜

とりあえず、localhostからhttp://localhost/subject.txtを呼び出して、コピーをローカルに作ることに成功しました♪

ありがとうございました。
0123nobodyさん2005/05/29(日) 22:28:02ID:???
>>121
Scalar::Utilのlooks_like_numberで数値かどうかは調べられるから、
両方が数値なら==、どっちかが数値でなけりゃeqでいいんでねーの?
0124nobodyさん2005/05/30(月) 02:00:43ID:sacYxvRr
>>122さらに経過報告〜

できましたー

んが!
鯖がそのcgiに広告つけやがる。javascriptはきだすcgiなんで、んなことされたら
台無しなんですが…というわけで、鯖探し中。とにかく、

解決したっぽいです、ありがとー
0125nobodyさん2005/05/30(月) 04:08:17ID:???
昨日は回答がとても豪華だったみたいだなw
0126nobodyさん2005/05/30(月) 04:30:03ID:???
>>105-110 >>113-119 ワロスw

>>124 print する Content-type を JS用に変えたら広告着かないサバも結構あるよ
0127nobodyさん2005/05/30(月) 11:33:30ID:???
>>125
こういうのって設問から回答まで全部一人でやってたりすることってよくあるよね。
0128nobodyさん2005/05/30(月) 16:13:42ID:efT5hV/s
いわゆる自作自演って香具師?
0129nobodyさん2005/05/30(月) 16:17:17ID:???
かみいわゆるごっど
0130nobodyさん2005/05/30(月) 16:38:57ID:???
あれを全部一人で書いたんなら
乙。とだけ言っておこう
ってか























んなわけないやろw
普通そういう考えに至らない。自演常習者ならではの発想。
0131nobodyさん2005/05/30(月) 17:25:33ID:???
まあ俺も少なくとも >>106=>>107=>>108 だとは思うがなw
0132nobodyさん2005/05/30(月) 19:01:53ID:2nqscNNy
>>123
looks_like_number ってライブラリか何かですか?普通に使える関数でしょうか?
できれば使い方を教えてもらえないでしょうか?
0133nobodyさん2005/05/30(月) 19:04:21ID:???
>>132
「Scalar::Utilの」って言ってくれてるんだから、まずは自分で調べてみましょう。

perldoc Scalar::Util
0134106,107,1082005/05/30(月) 19:34:37ID:???
くそっ、ばれたか!
0135nobodyさん2005/05/30(月) 19:37:51ID:2nqscNNy
>>133
私の素人用の本には載っていなくて、検索でなんとか
【@bool = DBI::looks_like_number(@array);リストの各要素について、数値に見え
ばTRUE、そうでなければFALSEを返します。未定義、あるいは空文字であれば、undef
もしくは空文字を返します。】
ってのは見つけたのですが、そもそもScalar::Utilってのがさっぱり分かりません。
素人考えで昨日から if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
とか色々やってるんですが、もう疲れました。先生、そろそろ答えを。。
■ このスレッドは過去ログ倉庫に格納されています