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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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 ){
とか色々やってるんですが、もう疲れました。先生、そろそろ答えを。。
0136nobodyさん2005/05/30(月) 19:44:32ID:???
ちっ!さすがに質問まで自作自演じゃあなかったか。
0137nobodyさん2005/05/30(月) 19:45:46ID:Xh5clFyG
うざいやつら...
0138nobodyさん2005/05/30(月) 20:29:17ID:???
よくわからんが、(一時的に)数値も文字として比較しては駄目なのか?
0139nobodyさん2005/05/30(月) 20:42:20ID:2nqscNNy
>>138
比較対象データが、数値・文字混在で1000件ほどあって、比較元が
数値の場合は良いのですが、文字の場合、先に違うデータ(数値?)と
一致してしまうんです。
0140nobodyさん2005/05/30(月) 21:11:58ID:???
ん?
@bool = DBI::looks_like_number(@array);
なら
if (DBI::looks_like_number($value))
は必ず真にならないか?
wantarray でちゃんと 0 か 1 で返してくれてるのかな。

あと
if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
の @wk_list[0] eq $value の部分
は、「数字の場合」、なんだから
$wk_list[0] == $value になるのでわ。
同じかも知らんが一応。

つーか数字に見えるかどうかくらい、そのモジュール使わなくても自作でできると思うがw
0141nobodyさん2005/05/30(月) 21:19:22ID:???
>135
君はまずモジュールというものを知るべきだ。
その後、CPAN を知ることにより、より幸せになれるであろう。

ttp://search.cpan.org/search?query=Scalar%3A%3AUtils&mode=all
ttp://search.cpan.org/~gbarr/Scalar-List-Util-1.15/lib/Scalar/Util.pm

で、Perl が使える環境で perldoc Scalar::Util って実行したら下と同じドキュメントが見られるはず。
ちなみに、@wk_list[0] だとスライスなので、$wk_list[0] の間違いだと思う。
>123 に従って書いてみるとこんな感じ。

use Scalar::Util qw(looks_like_number);
if(looks_like_number($wk_list[0]) && looks_like_number($value) ? $wk_list[0] == $value ; $wk_list[0] eq $value) {}

「数字のように見える」だから君の求めている結果と違う可能性はあるけどね。
0142nobodyさん2005/05/30(月) 21:27:57ID:???
それ使うと、$value が '123' か 123 か見分けられんの?
0143nobodyさん2005/05/30(月) 22:04:45ID:???
>>142
looks like number = 数値のように見える

'123'と123を見分けるにはPerlレベルでは無理だし、見分けても意味ない。
0144nobodyさん2005/05/30(月) 22:05:43ID:???
DBIにもlooks_like_number()はあるが、それだけのためならScalar::Utilの方を使うべきだろうな
0145nobodyさん2005/05/30(月) 22:08:01ID:???
ああ、一応数値と文字列を見分けることもできるか。
ttp://search.cpan.org/~gaas/Perl-API-0.01/

これでperlapiの殆どの関数を利用できるようになる。
0146nobodyさん2005/05/31(火) 06:36:25ID:???
$ENV{'TZ'} がないとき、サーバのタイムゾーンってどうやればわかるのかな?
JST とか GMT とか EST とかそういうの。
0147nobodyさん2005/05/31(火) 08:23:28ID:???
perl -e 'print `date`, "\n";'
0148nobodyさん2005/05/31(火) 08:43:42ID:???
おお、見れた! thx!
windows perl じゃ取れなかったけどw
0149nobodyさん2005/05/31(火) 08:45:01ID:???
>>146
タイムゾーン関係の設定ファイルがあるがlibcのバージョンや
OSの作法によっていろいろ違いがあり、ポータブルなのを自前
で書くのはたいへんなのでDateTime::TimeZoneモジュールを使
うのが楽だろう。

use DateTime::TimeZone;
use DateTime;

my $tz = DateTime::TimeZone->new(name => 'local');
print $tz->name, "\n";

my $dt = DateTime->now;
print $tz->short_name_for_datetime($dt), "\n";
0150nobodyさん2005/05/31(火) 08:48:39ID:???
use POSIXしてstrftimeの%Zという手もあるな。

use POSIX;
print strftime "%Z", localtime;
0151nobodyさん2005/05/31(火) 10:01:32ID:???
うは いろいろ試してみたけど POSIX 軽く鬱るくらい便利だなw すげえ。

>>149 も ありー。
でも必要なモジュール多いし揃えても何故か動かなかったw スマン。
0152nobodyさん2005/05/31(火) 11:03:00ID:TIA+apXZ
ここでいいのかどうかわかりませんが…

習作でperlでライブラリ及びdbを使わずに(なるべく多くの環境で動くことを目標に)
2ch風の掲示板を作ろうとしています。
んで、排他処理について質問…というか意見を伺いたいです。

板(blist.dat)、スレ(tlist.dat)、書き込み(スレid.dat)があります。
権限を持っていれば、板とスレも作成/論理削除が可能で、
同時に更新される可能性があります。
数は板・スレッド共に、00〜ffまで持てる物とします。

排他処理はロックファイルのリネーム方式で行おうと考えています。
なるべく軽快に動かしたい為、必要な時に必要な所だけロックをかけようと思っており、
そういう意図で必要になるロックファイルは
・lock_blist(板一覧用)
・lock_tlist(スレッド一覧用)
・lock_スレッドid(個別スレッド用)
となります。

これで組むと、ロックファイルが板の数*256個となり、最大で65536個になってしまうのですが、
これは設計としてアリ…というか必然なのでしょうか。それとも、ダメダメ(工夫の余地あり)なのでしょうか。

もちろんここに書き込む時点で多いなーという疑問を持っているのですが、
任意の一スレッドに書き込むたびに掲示板全体をロックするというのは、
それはそれで違うかなという気がしています。。

ご意見などありましたら、ご教授お願いします。
0153nobodyさん2005/05/31(火) 11:12:03ID:???
書き込むたびにスレ一覧も更新するんじゃないの?

レス数とか
0154nobodyさん2005/05/31(火) 11:17:57ID:???
あ、、、、
そうか。。。


その通りでした…orz

何ではまってたんだろう…ありがとうございますorz
0155nobodyさん2005/05/31(火) 16:14:18ID:???
お願いします。

簡単なデータベースを動作させたいと思っています。
1つのページに2×4個データを表示させたいんです。
もちろんそれ以上の情報があれば次のページへと移動です。

この「2つ目で改行・8個目でページ終了、さらに次のページ移動やページ数を計算」
というものを勉強したいのですが、どこかに良いサイトや参考となるCGIはありませんか?
0156nobodyさん2005/05/31(火) 17:58:58ID:???
たくさんあるデータをページ単位にするのとそれをページ内で
どう表示するかはわけて考えた方がいいだろうな。

前者は自分で作ってもいいが、Data::Pageとかそれっぽいのが
CPANにあるから適当に探して気に入ったものがあれば使うのも
いいだろう。次のページあるかないかとか、このページにある
データはいくつかなんてのはもちろんよく考えれば簡単に計算
で求まるとはいえめんどうだからね。もし自分で書くとしても
だらだらとスクリプトのあちこちでその場で計算しないで、
うまく手続きをまとめておくことをお勧めする。

後者はあんまり知らないのだがどうせ作るんならn×mで一般的
に作っておくと気がかわったときにいいかもしれん。

あとhtmlベタでスクリプトに埋め込むよりはTemplate Toolkit
とか使った方がすっきりするよ。
0157nobodyさん2005/05/31(火) 18:51:34ID:md7jEE3a
PHPでいうincludeをperlでやるにはどうすればいいんですか?
0158nobodyさん2005/05/31(火) 19:16:24ID:???
>>157
いちばん近いのはdoじゃないかと思う

0159nobodyさん2005/05/31(火) 19:19:00ID:???
ファイルのパーミッションを調べる方法はございますでしょうか。

statでは調べられないみたいですが、もしもございましたら
ご教授いただきたい次第です。
0160nobodyさん2005/05/31(火) 19:20:33ID:???
ちゃんと stat のリストの中にあるよ。
01611572005/05/31(火) 19:41:37ID:???
>>158
ありがとうございます
早速やってみます!
0162nobodyさん2005/05/31(火) 20:41:06ID:???
>>160
勉強になりました。
有難うございました
0163nobodyさん2005/06/01(水) 05:35:45ID:???
モジュールの中を見てるみると

require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
bootstrap なんか別のモジュール?;

みたいな流れがよくあるんですが、
これって何をやっているんでしょう?
0164nobodyさん2005/06/01(水) 10:36:57ID:???
ExporterとDynaLoaderのマニュアル嫁
0165nobodyさん2005/06/01(水) 12:03:09ID:???
>>164
んー、Exporterのほうはぐぐってみても日本語化されたマニュアルが見つからないのです。
動的にモジュールをロード?しているっぽいんですかね。
これを使えば、引数からモジュール名を得て、インポートするモジュールを選べたりするのでしょうか。
0166nobodyさん2005/06/01(水) 12:26:27ID:???
>>165
ぐぐり方が悪すぎるんじゃ...

Exporterとperlをキーワードにして日本語のページを検索すると
普通に出てきますが...
■ このスレッドは過去ログ倉庫に格納されています