Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0035nobodyさん
2005/05/26(木) 03:45:31ID:???$index= rand @array;
print $array[$index], "\n";
print "<BR>\n";print "<BR>\n";
配列の要素をランダムに取り出した時、
その要素を固定して留めるにはどうしたらいいでしょうか。
当たり前なんですが、更新ボタンを押すと要素が変化してしまいます。
こんな風に無理矢理別の変数に突っ込んでみようとしましたが
$array[$index]=$mem;
$memには何も記録されませんでした。
0036nobodyさん
2005/05/26(木) 04:58:14ID:???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に代入。
0038nobodyさん
2005/05/26(木) 07:47:44ID:???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:???まず 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:???004439
2005/05/26(木) 18:44:15ID:7fGLJWg9レスありがとうございます。
試してみたところ
書込み内容の改行のところで一行と扱われてしまっているようです。
なにかいい方法はないのでしょうか?
わかりやすく言うと
title<>name<>書込み内容の改行
書込み内容の途中
title<>name<>書込み内容
上記のように出力されてしまいます。
0045nobodyさん
2005/05/26(木) 19:16:41ID:???ログの改行コードの扱いを整理した方が良いと思う。
その掲示板の CGI やエディタや ftp クライアントなどが、
それぞれどんな改行コードを想定しているかとか改行コードを変換したりしてないかとか、
そういうあたりを。
0046nobodyさん
2005/05/26(木) 20:31:30ID:???つまり、ログに保存するとき、例えば、
my $str = "その書き込み内容の改行";
$str =~ s/\r?\n/<br>/g;
とかで改行タグを無くしなさい。
1行ごとにログ保存してる掲示板とかならみんなやってることだぞ。
0047nobodyさん
2005/05/26(木) 20:33:06ID:3LXc6fmj検索システムのルーチンについて質問です。
1.検索結果と同じ数の変数を作り、
検索結果をその変数に格納する
↓
2.1〜50件、または51〜100件までと表示する際、
1の変数から取り出して表示する
という考え方で合ってますでしょうか。
004835
2005/05/26(木) 21:40:41ID:4tEZgW2Vすみません、どうして>37と書かれているのかわかりません
>37に書いてある事の意味は何となく理解できますが
難しすぎて応用の域に達しませんでした…。
0049nobodyさん
2005/05/26(木) 22:25:58ID:???>>40
> こんな風に無理矢理別の変数に突っ込んでみようとしましたが
> $array[$index]=$mem;
> $memには何も記録されませんでした。
>>37
> 左辺と右辺を書きまちごうたけど
0051nobodyさん
2005/05/26(木) 22:45:13ID:???∩ ・∀・)∩∩ ´∀`)∩ このレスを見た人はコピペでもいいので
〉 _ノ 〉 _ノ10分以内に3つのスレへ貼り付けてください。
ノ ノ ノ ノ ノ ノそうすれば14日後好きな人から告白されるわ宝くじは当たるわ
し´(_) し´(_) 出世しまくるわ体の悪い所全部治るわでえらい事です
005235
2005/05/26(木) 23:12:36ID:Q34ppmGc>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:???$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:???@array = qw"シュウマイ 餃子 食いてぇ〜";
print "$array[rand@array]\n";
005553
2005/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にすり替えるには…?
005653
2005/05/27(金) 05:03:41ID:???ぎゃぼー
0057nobodyさん
2005/05/27(金) 06:32:17ID:???何事も考え方一つだ! ・・・対位法でも学んでおくかい?
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:???レスありがとうございます。
>fileを指定できると他人のパソコンのファイルが勝手に引き出せるので無理
なるほど、そういう事なのですか。。。そう言われればそうですよね。
>アップファイルをサーバにテンポラリとして保存しておき確認OKならそのファイルを使うようにする。
>ただ確認画面で処理をやめられた場合にテンポラリファイルがゴミとして残るのでガベージコレクションみたいな処理が必要。
やはり最初のsubmitで送信してしまわないといけないのですね。。。
ご指摘の通り、確認画面でやめられた時の「ゴミ」が気になっていたので
なんとか確認ページからのアップロード処理を出来ないものかと思っていました。
とりあえず、疑問はなくなりスッキリしました。
ありがとうございます!
0060nobodyさん
2005/05/27(金) 14:45:20ID:???↑このvarsてのは何なのですか?
後qwとかqqとかもありますが、それについての詳細もお伺いしたいのですが
0061nobodyさん
2005/05/27(金) 14:46:50ID:???0065nobodyさん
2005/05/27(金) 15:18:50ID:???最低限、>>1くらい読みなさい。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません
006653
2005/05/27(金) 15:55:26ID:???$tmp01〜$tmp03を@tmp('$tmp01','$tmp02','$tmp03')とまとめるという事でしょうか?
実は$tmpの01〜03以外にも、別の変数$soc01〜03があって
$tmp01の内容が$soc01に、$tmp02が$soc02に(以下略)…
対応している、という仕組みになってます
なので、数字だけ出して割り振ろうと考えてました。
配列を使うのを嫌うというか、有効な使い方がまだよくわからんとです…。
見てると多分効率悪いんでしょうね、ネットで調べながらやってるんですが応用は難しいです、
あ、>60は自分じゃないです
0068nobodyさん
2005/05/27(金) 16:24:21ID:???こう使うって意味だと思う
@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:???> 数字だけ出して割り振ろうと〜
余計配列とかのが適してない?
ハッシュ(連想配列)でもいいかもしれない。
my $tmp01 = 'シュウマイ';
my $tmp02 = '餃子';
my $soc01 = 100:
my $soc02 = 200:
ってやるより、
my %menu = (
'シュウマイ', => 100,
'餃子' => 200,
);
とかやった芳がわかりやすいと思わないかい?。
0070nobodyさん
2005/05/27(金) 17:22:02ID:???0071nobodyさん
2005/05/27(金) 17:56:56ID:???my @db = (
{name=>'シュウマイ',price=>100},
{name=>'餃子',price=>200}
);
ってやるのが好き
Template Toolkit にもそのまま貼りつけられて楽だし
007253
2005/05/27(金) 18:10:05ID:???この例でようやく直感的に理解できました、そうですよね変数をしまっておけるんですよね
正直な所、配列の本当の便利さがよくわかってませんでした、すごい便利なんですね、恥ずかしい
配列もちゃんと理解してなかったのにアレですが、>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関数で何故こういう結果が出るのかも実はよくわかりません……
007353
2005/05/27(金) 18:11:34ID:???よくわかりませんがすげえー そんなやり方もあるのか!
0074nobodyさん
2005/05/27(金) 19:45:37ID:???それだとすごく >>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行やるのはまわりくどいけどとりあえず。
007553
2005/05/27(金) 20:10:30ID:???ですよね…生かせてないなと思いつつ、どうしたらいいもんか思いつきませんでした…。
>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>>17ですが、遅レスですいません。
データ項目に点数という項目があり、データが追加される度に点数の降順に並べ替えて書き込みを
行っています。こういった場合でもopen(ABC, ">") を使わない方法はありますでしょうか?
0077nobodyさん
2005/05/27(金) 20:53:42ID:???0078nobodyさん
2005/05/27(金) 20:56:48ID:C4o5Scf8a.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:???@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:???こんなプログラム作ってみた。
%menu = (
'シュウマイ' => {soc=>100},
'餃子' => {soc=>200},
'ラーメン', => {soc=>500},
'チャーハン' => {soc=>400},
'半熟卵' => {soc=>50},
'チャーシュー' => {soc=>100},
'ライス' => {soc=>150},
'チャーシューメン' => ['ラーメン','チャーシュー','半熟卵'],
'ラーメンセット'=> ['ラーメン','ライス','半熟卵'],
'チャーシューメンセット' => ['チャーシューメン','ライス'],
'チャーハンセット' => ['ラーメン','チャーハン','半熟卵'],
'シュウマイセット' => ['ラーメンセット','シュウマイ'],
'餃子セット' => ['ラーメンセット','餃子'],
);
0081nobodyさん
2005/05/27(金) 22:45:25ID:???%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";
0083nobodyさん
2005/05/27(金) 23:31:46ID:???ヒント : 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:???0086nobodyさん
2005/05/28(土) 06:51:40ID:???>>83の一文だと、矢印演算子が万能みたいだって言いたいんじゃね?
そもそも>>75はリファレンスを知らなさそうだし
リファレンスをデリファレンスするのに
矢印演算子が使えるよってのが適切ではないかと
0087nobodyさん
2005/05/28(土) 11:01:56ID:???矢印演算子を全く使わなくてもデリファレンスやメソッドコールはできるからな。
0088nobodyさん
2005/05/28(土) 11:19:45ID:???ああ、そうだね。 リファレンス。
それはわかるけど、でも >>83 のは >>79 に対して言ったんだけどなw
> %hash = %{$array[rand@array]};。
せっかくリファレンス使ってるのに、わざわざそんなくどい書きかたしなくても、って。
矢印知ってたら楽に書けるのになーと。
まあ誤解生ましたようで正直スマンかった。
0089nobodyさん
2005/05/28(土) 11:49:47ID:???009075
2005/05/28(土) 12:47:52ID:???>75の疑問がすんなり解決しました… 多次元配列って訳がわからなくて今まで無視してました
何か色々とお世話になってしまって、すごく助かりました
いただいたレスのスクリプトや内容を把握しきれてない部分が多いので、
名無しに戻ってまた勉強してきます。目が回りそうです。
もしまた詰まったら助けたって下さい〜このスレの人皆やさしい!幸あれ!ほんとありがとう!
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:???0094nobodyさん
2005/05/28(土) 20:58:22ID:???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:???0097926
2005/05/28(土) 21:08:01ID:???URLデコードは考えてません・・・。
009892
2005/05/28(土) 21:13:29ID:???test.cgi?%83%7d%83%7e%83%80%83%81%83%82
(マミムメモ)でやってみましたが、結果同様でした。
ちょっと舌足らずでした。最初に上記の様にアクセスした時はうまくいくのですが、
それで出てきたリンクを使って再帰的にアクセスした時に文字化けを起こします。
0100nobodyさん
2005/05/28(土) 22:59:52ID:z135H4rkif( scalar @BUF==5) { … }
この二つの条件式の書き方で、下の方が良いとか上の方が良いと言うことはありますか?
0101nobodyさん
2005/05/29(日) 00:02:47ID:???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記述し忘れましたが、同点の場合は、できれば日付の降順にしたいです。
0105nobodyさん
2005/05/29(日) 15:17:33ID:???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:???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:???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:???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:???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:???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/eeChjMopen(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そっくりそのまま落としてきて、subject.txtとして保存するんでもいいす。
むしろそれがしたいっす。
おながいします。
0113nobodyさん
2005/05/29(日) 17:32:22ID:???0114nobodyさん
2005/05/29(日) 17:44:34ID:???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:???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:???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ほれ、俺の力作
GET http://news19.2ch.net/newsplus/subject.txt > subject.txt
0118nobodyさん
2005/05/29(日) 18:43:53ID:???>>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:???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/XuV40121nobodyさん
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とりあえず、localhostからhttp://localhost/subject.txtを呼び出して、コピーをローカルに作ることに成功しました♪
ありがとうございました。
0123nobodyさん
2005/05/29(日) 22:28:02ID:???Scalar::Utilのlooks_like_numberで数値かどうかは調べられるから、
両方が数値なら==、どっちかが数値でなけりゃeqでいいんでねーの?
0124nobodyさん
2005/05/30(月) 02:00:43ID:sacYxvRrできましたー
んが!
鯖がそのcgiに広告つけやがる。javascriptはきだすcgiなんで、んなことされたら
台無しなんですが…というわけで、鯖探し中。とにかく、
解決したっぽいです、ありがとー
0125nobodyさん
2005/05/30(月) 04:08:17ID:???0126nobodyさん
2005/05/30(月) 04:30:03ID:???>>124 print する Content-type を JS用に変えたら広告着かないサバも結構あるよ
0128nobodyさん
2005/05/30(月) 16:13:42ID:efT5hV/s0129nobodyさん
2005/05/30(月) 16:17:17ID:???0130nobodyさん
2005/05/30(月) 16:38:57ID:???乙。とだけ言っておこう
ってか
んなわけないやろw
普通そういう考えに至らない。自演常習者ならではの発想。
0132nobodyさん
2005/05/30(月) 19:01:53ID:2nqscNNylooks_like_number ってライブラリか何かですか?普通に使える関数でしょうか?
できれば使い方を教えてもらえないでしょうか?
0133nobodyさん
2005/05/30(月) 19:04:21ID:???「Scalar::Utilの」って言ってくれてるんだから、まずは自分で調べてみましょう。
perldoc Scalar::Util
0134106,107,108
2005/05/30(月) 19:34:37ID:???0135nobodyさん
2005/05/30(月) 19:37:51ID:2nqscNNy私の素人用の本には載っていなくて、検索でなんとか
【@bool = DBI::looks_like_number(@array);リストの各要素について、数値に見え
ばTRUE、そうでなければFALSEを返します。未定義、あるいは空文字であれば、undef
もしくは空文字を返します。】
ってのは見つけたのですが、そもそもScalar::Utilってのがさっぱり分かりません。
素人考えで昨日から if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
とか色々やってるんですが、もう疲れました。先生、そろそろ答えを。。
■ このスレッドは過去ログ倉庫に格納されています