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

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

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

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0103nobodyさん2008/03/12(水) 21:10:03ID:???
>>101様
レスありがとうございます
受信後の処理は、次のような処理を記述しております

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $form, $ENV{'CONTENT_LENGTH'});
} else {
$form = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $form);
foreach (@pairs) {
($name, $value) = split(/=/, $_);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/>/>/g;
$value =~ s/</</g;
&jcode'convert(*value, 'sjis');
&jcode'convert(*name, 'sjis');
$FORM{$name} = $value;
}

GETだとうまく処理されるので2行目の
read(STDIN, $form, $ENV{'CONTENT_LENGTH'});
が怪しそうですね。
CGI.pm?で調べられるのかどうなのかまだよくわかっておりませんが
まずいところの見当すらつかなかったので助かります。
ありがとうございます。
0104nobodyさん2008/03/12(水) 21:18:29ID:???
ぱっと見た感じ問題なさそうだけどな

しかしnameにも日本語を使ってるのか
0105nobodyさん2008/03/13(木) 00:55:15ID:???
KENTのコピペ臭がするのは俺だけ?
0106nobodyさん2008/03/13(木) 01:19:37ID:???
>>103
うーん、区切りがほんとに’&’なのかな。
一回、 print $form ; やってみれば?
0107nobodyさん2008/03/13(木) 02:21:43ID:???
Perl4時代のこの定番処理がいまだに使われてるってのもなぁ
0108nobodyさん2008/03/13(木) 03:58:19ID:???
そこでcgi-lib.plですよw
0109nobodyさん2008/03/13(木) 13:54:44ID:???
最近、GET/POSTのデータやテキストファイルを自前で読み込まなきゃならないことがあって
「あれ? どうやるんだっけ?」と本気で焦った俺。

使わないとそんなもんだよな。
0110nobodyさん2008/03/13(木) 20:56:52ID:???
>>109
ライブラリが整備されてそっち使うと忘れるんだよな
0111nobodyさん2008/03/14(金) 00:19:02ID:jE/64EXv
くだすれにも書き込んだ者ですが。

$aaa=1;
if($aaa==1||$aaa==3)
これをもっと簡潔に書くにはどうすればいいですか。

あと、「$aaaが8のn倍ならマッチさせる」というのも
わかりませんでした、おねがいしますm(_ _)m
0112nobodyさん2008/03/14(金) 00:26:38ID:???
!($aaa % 8) ← これで8の倍数のチェックだけど、マイナス値は試してないのでわかんないw

8で割ってみて余りが0なら割り切れてるので8の倍数ということ
0113nobodyさん2008/03/14(金) 00:34:03ID:???
$aaa=1;
if($aaa==1||$aaa==3)

if ($aaa =~ /^[13]$/)
こんなのできないこともないけど、そのままでいいんじゃないか?
01141112008/03/14(金) 00:40:08ID:jE/64EXv
>112
そういうやりかたもあるんですね。

>113
極端にいえば
if($aaa==1||$aaa==5||$aaa==13||$aaa==17||$aaa==25||$aaa==34||)
こんなに長くなってしまう。
これじゃあまりにもじゃないですか?
0115nobodyさん2008/03/14(金) 01:07:31ID:???
$aaa==9 や $aaa==21 が入ってなくて $aaa==34 が出てくるから
長くなるんだと思う。
0116nobodyさん2008/03/14(金) 01:13:26ID:???
ありえる数字を列挙させて、それのチェック対象が1つの変数なら
1つの変数に対して配列で一気にチェックできた気がする

grep 使ったような使わなかったような・・・ごめん。 俺にはもう無理w
0117nobodyさん2008/03/14(金) 01:41:34ID:???
長くて見づらいけど、処理量が多くて重くなるよりはマシかな。
そんな劇的な違いは無いとしても気分的になんとなくw
0118nobodyさん2008/03/14(金) 01:51:12ID:???
重いと言っても何百万回も繰り返さないから、こうしちゃうなw
if($aaa =~ /^(1|5|13|17|25|34)$/)
0119nobodyさん2008/03/14(金) 06:02:08ID:???
%tmp = map { $_ , 1 } ( 1, 5, 13, 17, 25, 34 ) ;
if ( defined $tmp{$aaa} ){
 print "俺の名を言ってみろ\n" ;
}
0120nobodyさん2008/03/14(金) 11:41:19ID:???
>>116
grep使う方法だとこうかな?

if ( grep { $aaa == $_ } qw( 1 5 13 17 25 34  ) ) {
    # code here
}
0121nobodyさん2008/03/14(金) 11:42:57ID:???
# no 5.10
grep { $aaa == $_ } qw/1 5 13 17 25/;

#
use List::MoreUtils qw/any/;
any { $aaa == $_ } qw/1 5 13 17 25/;

# use 5.10
$aaa ~~ [qw/1 5 13 17 25/];
0122nobodyさん2008/03/14(金) 11:53:06ID:???
ほとんどの場合、ブロックより式の方が早いので
my %tmp = map +( $_ => 1 ), ( 1, 5, 13, 17, 25, 34 );
grep $aaa == $_ ,( 1, 5, 13, 17, 25, 34 );

0123nobodyさん2008/03/14(金) 14:50:45ID:???
dankogaiがエントリ書いてた
ttp://blog.livedoor.jp/dankogai/archives/51017983.html
0124nobodyさん2008/03/14(金) 15:48:58ID:???
>>111 >>113-122
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_can_i_tell_whether_a_certain_element_is_contained_in_a_list_or_array
0125nobodyさん2008/03/14(金) 22:34:42ID:exCIvuwa
Perl初心者です。宜しくお願いします。

ディレクトリ探索し、ディレクトリの中の「.txt」をファイルを見つけたら
その行数を出力したいのですが、「open(FH, "$_") or die;」のところで
落ちます。何がいけないのでしょうか?


---ここから
use File::Find;

my $dir = 'TestDir';

find(\&print_file, $dir);

sub print_file {
  $_ = $File::Find::name;

  if (/.+\.txt/) {
    print "$_ \t";

    open(FH, "$_") or die;
    1 for <FH>;
    print $. . "行\n";
    close(FH);
  } else {
    print "$_ \n";
  }
}
0126nobodyさん2008/03/14(金) 22:50:02ID:???
>>125
open(FH, "$_") or die "$! [$_]";
1 while <FH>;

とでもして吐かれたエラーメッセージを読む。
0127nobodyさん2008/03/14(金) 23:25:19ID:???
>>125
File::Find の find では pwd が変りますが、
$File::Find::name で得られるのはこの場合は $dir からのパス。

use Cwd ;
して if 文の中に
print getcwd ;
して確認してみそ。

簡単な解決方法は、$dir にゼッタイパスを突っ込め。
それから perldoc File::Find くらいしろ。
0128nobodyさん2008/03/16(日) 19:27:01ID:483Ek7KZ
Commonで漢字を含むデータをPOSTしたいのですが、漢字部分が出力されません。
以下で生成されたcontentをチェックしても、漢字だけ消えています。
どの様にすれば良いでしょうか。
よろしくお願いいたします。
use encoding "shift-jis";
LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my %form=('test'=>'漢字123');
my $request = POST('http://test.test',[%form]);
my $con=$request->content;
print "test:$form{test}\n";
print "content:$con\n";

出力
test:漢字123
content:test=123
0129nobodyさん2008/03/16(日) 22:26:04ID:???
>>128
# use encoding "shift-jis";
# LWP::UserAgent;
0130nobodyさん2008/03/16(日) 23:03:42ID:eaCmNgRi
はじめましてこんにちは。
自作の掲示板を作ってまして、ある書き込みにレスが付いた場合は
そのレスの数をカウントして画面に表示させる、という事をやってます。
現状はこんな感じです。

print "($res)<br>\n" if ($res ne "");

レスがある場合は(9)とかの某かの数字、レスが付いてない場合は空白という所までは
上手く行ってるのですが、
この(9)の部分を赤で出力したいと思ってます。

出来れば上記の命令の中だけで完結させたいのですが、無理でしょうか?
0131nobodyさん2008/03/16(日) 23:16:51ID:???
>>130
print qq|<span style="color:red;">($res)</span><br>\n| if $res;

Webサイト制作初心者用質問スレ Part 194
http://pc11.2ch.net/test/read.cgi/hp/1204015309/

△▲ WebProg 初心者の質問 Part17 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1204462146/
0132nobodyさん2008/03/17(月) 02:23:56ID:WVXzjYIy
>>129
ありがとうございました。
ただ、UserAgentは使うのでコメントアウトできません。
EUCでソースを書き、1行目だけコメントアウトで解決しました。
0133nobodyさん2008/03/17(月) 11:04:17ID:+D1UxdpV
>>126
>>127
ありがとうございました。解決しました。
01341302008/03/17(月) 21:21:26ID:iYfDDUad
>>131
ありがとうございました、無事に解決いたしました。
これを応用して、文字のサイズを変える事もやってみましたが上手く行きました!

ところで考え方の確認を1つ。。。
admin.cgiで生成した画面から、subって画像をUPロード。
その画像を、album.cgiという別の画面上に表示させていて上手く動いてるのですが、
「その画像がUPされた日時をalbum.cgiの画面上に表示させる。」という事を考えています。

すごーく単純に考えて、
「subる直前に日時を取得して、それを変数に格納。その変数をalbum.cgiに渡して、その変数をprintすればOKかも。」
と考えてやってますが上手く行きません。(表示すらされない。)

もともとCOBOラーなもんで、この手のコーディングは激苦手なのですが四苦八苦しながら何とかやってます。
変数の初期化は?変数は共通変数なのかpg内変数なのか?受け渡しはどうやってやるのか?
などなど色々疑問は尽きませんが、そもそも上記の考え方でおかしくはないですか?

0135nobodyさん2008/03/17(月) 22:03:37ID:???
>>134
>>1-3

△▲ WebProg 初心者の質問 Part17 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1204462146/

CGI: Common Gateway Interface part 13
http://pc11.2ch.net/test/read.cgi/php/1126436361/
0136nobodyさん2008/03/18(火) 10:37:05ID:???
>>134
CGIプログラム:バッチ
htmlフォーム:コマンドライン
と考えれば、おのずと答えが見えると思われ。

各バッチ処理間でデータをやり取りするには、
・ファイルまたはDBに格納する
・コマンドラインオプションを利用しうまく受け渡す方法を考える
のいずれかになる。

CGIプログラム間でうまくデータを受け渡すには
・セッション(ファイルまたはDB)を利用する
・htmlフォームデータとして生成しPOSTする(値を変えられたくなければHIDE要素にする)
のいずれかになる。
0137nobodyさん2008/03/18(火) 11:07:18ID:???
小難しく考えるなよ
stat使えばいいだろ
0138nobodyさん2008/03/18(火) 17:51:36ID:yz+TlyvN
お世話になっております。

----------------
sub test{
$hoge = shift;
$fuga = shift;
$hoge += $fuga;
}
----------------

のような感じのプログラムを作っていましたが
うまくいかなくてどうしてだろうかと考えた所
文字列として認識していたっぽいです。

この $fuga を 数字に明言したいのですが
どのようにやるのでしょうか?

以上 ご助力いただけますとありがたいです。
0139nobodyさん2008/03/18(火) 18:20:21ID:???
>>138
デバッグの基本、$fugaをprintしてみる
0140nobodyさん2008/03/18(火) 18:25:39ID:???
>>138
$hoge と $fuga に数字がきちんと入ってたら、最初に文字列として認識してようと、
+= の段階で数字として扱ってくれるだろ…。他の部分のミスじゃね?
0141nobodyさん2008/03/18(火) 18:26:00ID:???
$hogeか$fugaに数字以外の記号(改行とか)が混じっていると予想
01421382008/03/18(火) 18:30:10ID:yz+TlyvN
RESありがとうございますっ

$hogeか$fugaに数字以外の記号が入っている場合もあり
ソノ場合は0として扱いたいのですが
数字が入っていた場合は数字として扱いたいのです、、、

num $fuga
int $fuga
などで数字と明言する方法があったような気がするのですが
私の勘違いでしょうか???
0143nobodyさん2008/03/18(火) 18:35:55ID:???
勘違い。
っつーかデバッグして調べろよ
0144nobodyさん2008/03/18(火) 19:26:34ID:???
内容が多いハッシュの値があって、それをデータベースに格納するのに、
そのままSQL文を書くと長いので
 my ( @n, @q, @p );
 foreach my $key ( keys %hash ) {
  push @n, $key;
  push @q, '?';
  push @p, $hash{$key};
 }
 my $sth=$dbh->prepare('INSERT INTO test('.join(',',@n).') VALUES('.join(',',@q).')');
 $sth->execute(@p);
という形でSQL文を構築してデータを格納しているのですが、
もう少しスマートな方法は無いでしょうか?
0145nobodyさん2008/03/18(火) 19:50:13ID:???
 my $sth=$dbh->prepare('INSERT INTO test('.join(',',keys %data).') VALUES('.join(',',map{'?'}(keys %data)).')');
 $sth->execute(map{$data{$_}}(keys %data));
適当にmapで記述したら、ここまで短くなりましたが、map{'?'}(keys %data)の辺りは、
もうちょっとスマートな方法がありそう…。
0146nobodyさん2008/03/18(火) 20:25:49ID:???
>>145
スマートな方法より可読性を選んだら?
keys %data を三回も呼ぶんだったらアレイに突っ込むだろ。
ついでに、join ',' も二回あるんだったらサブルーチンかなんかにしちまえ。<= 嘘。
sub foo { return join ',', @_ ;} ;
@arr = keys %data ;
my $sth=$dbh->prepare('INSERT INTO test('. &foo( @arr ) .') VALUES('. &foo( ('?') x @arr) ).')');
$sth->execute( @data{ @arr } );

てきとーに書いたから、' とか抜けてても勘弁。
0147nobodyさん2008/03/18(火) 21:49:40ID:???
>>138
#!/usr/bin/perl -w
use strict;
use Scalar::Util qw(looks_like_number);
test(@ARGV);
test(map looks_like_number($_) ? $_ : 0, @ARGV);
sub test {
  my($hoge, $fuga) = @_;
  print "hoge:[$hoge] fuga:[$fuga] ";
  $hoge += $fuga;
  print "result:[$hoge]\n";
}

>>144
my $col = join ',', my @col = keys %hash;
my $phs = join ',', ('?') x @col;
my $sth = $dbh->prepare("INSERT INTO test($col) VALUES($phs)");
$sth->execute(values %hash);
01481382008/03/19(水) 16:21:54ID:uoUGbd4u
>147さん RESありがとうございます。
>143さん おっしゃるとおりでした。
すいません。デバッグしてみますと整数になっていなかった訳ではなくバグでした。
下記のようなプログラムでタブ区切りのファイル内の$filename
(フォーマットは「名前\t\t\t\t\t\t\t数\t\n」)
でハッシュデータで $hash{名前}->数
とやろうとして下記のようにプログラムを組んでみました。
----------------
open(FH,"$filename"); my @data = <FH>; close(FH);
my %hash = ();
foreach(@data){
my @splitdata= split(/\t/);
if(defined $hash{$splitdata[7]}){
print "<>$splitdata[7]no$hash{$splitdata[7]} ha mouaru<><br>";
}else{
$hash{$splitdata[7]} = 0;
print "$splitdata[7] wo sengen<br>";
}
}
my $key;
foreach $key ( keys %hash ) {
print "$key<br>";
foreach(@data){
my @splitdata= split(/\t/);
if($key eq $splitdata[7]){
print "$hash{$key} ni $splitdata[10] tumari $hash{$key} += $splitdata[10];wo tasu<br>";
$hash{$key} += $splitdata[10];
print "$hash{$key} : $hash{$splitdata[7]}<br>";
}
}
}
(続く)
01491382008/03/19(水) 16:23:18ID:uoUGbd4u
(続き)
----------------
それで出力が
print "$hash{$key} ni $splitdata[10] tumari $hash{$key} += $splitdata[10];wo tasu<br>";
$hash{$key} += $splitdata[10];
print "$hash{$key} : $hash{$splitdata[7]}<br>";
の所が
0 ni 2 tumari 0 += 2 ;wo tasu
0 : 0となっていたのですが どのようにすれば
ハッシュデータで $hash{名前}->数
とのハッシュデータを取得できますでしょうか?

以上 ご助力をいただけますとありがたいです。
0150nobodyさん2008/03/19(水) 16:44:42ID:???
日本語で
0151nobodyさん2008/03/19(水) 16:56:44ID:???
ひどすぎワロタwww
0152nobodyさん2008/03/19(水) 17:13:34ID:???
$hash{名前}->数ってこれはリファレンス的な意味じゃないよね?
$hash{名前} = 数で取り出したいってこと?
$splitdata[10]てなに?空じゃないの?
$hashには$hash{$splitdata[7]} = 0; この部分でしか入れてないよね?
0153nobodyさん2008/03/19(水) 17:20:14ID:???
> (フォーマットは「名前\t\t\t\t\t\t\t数\t\n」)

$splitdata[0] が「名前」
$splitdata[7] が「数」
に見える。

コードは
$splitdata[7] が「名前」
$splitdata[10] が「数」
っぽいことになってるし、いつのまにか $splitdata[10] に 2 が入ってるし、よくわかんない。

(exists $hash{$splitdata[0]}) かどうか調べて、なかったら用意して
$hash{$splitdata[0] += $splitdata[7] したいんじゃないのかな。
01541532008/03/19(水) 17:21:25ID:???
最後の行 $hash{
01551532008/03/19(水) 17:23:29ID:???
すみません。} を打とうとしたら shift + enter を押して鬱。
$hash{$splitdata[0]} の } が抜けてました。
0156nobodyさん2008/03/19(水) 17:28:37ID:???
map { $hash->{$_->[0]} += $_->[7]; } map { chomp; [split(/\t/)]; } @data;
0157nobodyさん2008/03/19(水) 23:15:18ID:???
このスレが相応しいかわかりませんが質問させてください。

perl 5.8.4
mysql 4.1.11
OS debian

上記の環境でお勉強目的で BBS を作成しています。
データ自体は utf8 で格納出来ているはずですが、 perl 取得した結果を print した
際に文字化けが発生してしまいます。何処を注意すべきでしょうか?

# やってる内容をかいつまんで記入します
use DBI;use utf8;use Encode;
binmode STDIN, ":encoding(utf8)";
binmode STDOUT, ":encoding(utf8)";
$db = DBI->connect("DBI:mysql:database:localhost:$port", "hoge", "hoge");
$db->prepare("set character set utf8");
あとはセレクトして print しているだけ

# DB の中身は dump したファイルが utf8 で出力されていたのでデータは utf8 のはずです
0158nobodyさん2008/03/19(水) 23:41:08ID:???
>>157
OSの設定はutf-8か、日本語が表示できるシェルを使ってるか
0159nobodyさん2008/03/19(水) 23:45:37ID:???
BBSなんだからHTML吐いてるんじゃないの?
それでメタタグの文字コード宣言が違うとか
01601572008/03/20(木) 12:29:10ID:???
おはようございます。
apache を使ってブラウザ上に表示させてます。
メタタグには一応 utf-8 って記入してます。

ブラウザ側の文字コードも utf-8 になってました
0161nobodyさん2008/03/20(木) 12:38:21ID:???
BOM付いてる希ガス
0162nobodyさん2008/03/20(木) 13:03:57ID:???
for ($i=0; $i<6; $i++) {

for ($j=0+$i*10; $j<10+$i*10; $j++) {

$box[$i][$j] = $j;

};
};

print "$box[0][0]\n";
print "$box[0][1]\n";
print "$box[0][2]\n";
print "$box[0][3]\n";
print "$box[0][4]\n";
print "$box[0][5]\n";
print "$box[0][6]\n";
print "$box[0][7]\n";
print "$box[0][8]\n";
print "$box[0][9]\n";
print "$box[1][0]\n";
print "$box[1][1]\n";
print "$box[1][2]\n";
print "$box[1][3]\n";
print "$box[1][4]\n";
print "$box[1][5]\n";
print "$box[1][6]\n";
print "$box[1][7]\n";
print "$box[1][8]\n";
print "$box[1][9]\n";

上記のプログラムを実行すると、$box[1][x]が表示されないのはなぜ?
0163nobodyさん2008/03/20(木) 13:33:56ID:???
print "$box[1][0+$i*10]\n";だから。
0164nobodyさん2008/03/20(木) 13:41:13ID:???
$box[$i][$j] = $j;

の行の次に

print "[$i][$j]\n";

入れて表示してみ
0165nobodyさん2008/03/20(木) 13:42:25ID:???
$box[$i][$j] = $i * 10 + $j;
期待する動作はこれかな?
0166nobodyさん2008/03/20(木) 13:43:46ID:???
>>163
俺には理解不能だ
もうちと、噛み砕いておしえてくれ
01671622008/03/20(木) 13:44:57ID:???
みなさん、レスありがと。
今、飯食ってるから
終わったら試してみる。
0168nobodyさん2008/03/20(木) 13:54:36ID:???
>>164
意図した動きになってる。
iもjもちゃんと入れ子になって
ループしている
0169nobodyさん2008/03/20(木) 13:56:38ID:???
>>164
あ!ごめんなさい
ちと、おかしい
0170nobodyさん2008/03/20(木) 14:02:32ID:???
>>165
そうでした。
01711622008/03/20(木) 14:03:22ID:???
皆様、ありがとうございます。
解決できました。

PG久しぶりなんで、
頭が退化してたようです。
0172nobodyさん2008/03/20(木) 14:11:42ID:???
10 x 10 の箱に連番を入れたかっただけだけど、配列のインクリメントでちとボケてただけですね
まぁ俺もたまに似たようなミスするのであまりコケにできないwww
0173nobodyさん2008/03/20(木) 15:57:38ID:???
またお願いします。

見た目の桁数を8桁に揃えたいんです。
先頭は空白にしたいのですが、下記でうまくいきません。

$len = 8 - length($num);
$head = " " x $len;
$txt = $head.$num;

2行目を
$head = "a" x $len;
とすれば、先頭に
"a"は入って、桁が揃うんです。

それとも連続空白を表す記号みたいな物は
あるのでしょうか?
0174nobodyさん2008/03/20(木) 16:03:28ID:???
webブラウザが半角スペースをつぶしちゃうからとかじゃなくて?
0175nobodyさん2008/03/20(木) 16:12:49ID:???
>>174
げ!、ソースを見たらちゃんと空白が入ってました。
ブラウザで表示すると空白がなくなっちゃう。。。
これはなんでですか?
0176nobodyさん2008/03/20(木) 16:43:28ID:???
ブラウザの仕様
0177nobodyさん2008/03/20(木) 17:00:56ID:???
ブラウザで桁をそろえたいなら、表示する部分のフォントを
font-family: monospace;
にしたうえで空白を   にすればいいです。
0178nobodyさん2008/03/20(木) 20:32:02ID:cqY9pHpE
<pre></pre>
01791622008/03/20(木) 22:32:36ID:???
>>178
それは、クライアントの読み込みが遅くなるので
あきらめました。
 にしました。
01801622008/03/20(木) 22:33:29ID:???
& n b s p ;

に、しました。
0181nobodyさん2008/03/20(木) 23:06:14ID:???
「&amp;nbsp;にしました」と書けばok
0182nobodyさん2008/03/20(木) 23:17:39ID:???
>>181
むぅ、また、難しいことを言うな。
明日、調べます。
0183nobodyさん2008/03/20(木) 23:33:13ID:???
>>182
いやいや、難しい話でなく。>>181が言ってるのは
「&amp;nbsp;にしました」と入力して投稿すれば
「&nbsp;にしました」と表示されるからスペース不要ってだけの話だと思うよ。

# でも確か専ブラによって表示が違ったはず。<エンティティ方面
0184nobodyさん2008/03/21(金) 10:02:10ID:???
nbsp;でも詰まるよ
HTMLでalign=rightのほうがいいんじゃない?
0185nobodyさん2008/03/21(金) 10:37:17ID:???
それはプロポーショナルたからな
桁そろえるのにHTMLのブロック要素を使わなかったり
固定幅フォントを使わないのはバカだゆん
01861572008/03/21(金) 11:32:07ID:???
>>157 です
自己解決決しました。

SQL を実行する前に SET NAMES utf8 を実行する必要があったみたいです。
一旦 SET NAMES utf8 を実行した後で select/insert/etc... を実行しないと
化けてしまうようです。
ナゼ化けるのかは理解できていませんが・・・。
# たぶん utf-8 以外で MySQL から出力しようとして化けてしまうとは思いますが理解できていません。
0187nobodyさん2008/03/21(金) 13:27:45ID:???
ふと>>144の解答で疑問に思ったのですが…

ハッシュ値の並び方が呼び出しのタイミング等で
一致しないのは知ってますが、keys %hash と values %hash の
並び方って必ず組み合わせが一致するのでしょうか?
0188nobodyさん2008/03/21(金) 13:31:00ID:???
keys使ってからをvaluesを使うまでにハッシュの内容を変えなかった場合一致するよ
0189nobodyさん2008/03/21(金) 18:55:25ID:???
どなたか、10進数を26進数(使える文字はAからZ)に変換するサブルーチンを教えてください
0190nobodyさん2008/03/21(金) 21:10:27ID:???
>>189

my $Number10 = 1234; # 10進数

# 2進数
#my @digits = ('0','1');
# 16進数
#my @digits = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
# 8進数
#my @digits = ('0','1','2','3','4','5','6','7','8');
# 26進数
my @digits = ('A'..'Z');

print &to_base($Number10,\@digits);

sub to_base {
my $num = shift;
my $digits = shift;
my $dignum = @{$digits};
my $result = '';
while ($num > 0) {
substr($result,0,0) = $$digits[ $num % $dignum ];
$num = int ($num / $dignum);
}
return length $result ? $result : $$digits[0];
}
0191nobodyさん2008/03/21(金) 21:33:13ID:???
>>189
sub conv($){
my $alpha = 'A' ;
$alpha ++ for 1 .. $_[0] ;
return $alpha ;
}
printf "%d\t%s\n", $_, conv $_ for 0 .. 200 ;
0192nobodyさん2008/03/21(金) 21:53:29ID:???
191は取り消し
0193nobodyさん2008/03/21(金) 23:12:27ID:???
my $alpha = q{A} ;
my %table2 = map { $_, $_ } 0..1 ;
my %table8 = map { $_, $_ } 0..7 ;
my %table16 = ( ( map {$_, $_ } 0..9 ), map{ $_, $alpha ++ } 10..15 );
$alpha = q{A} ;
my %table26 = map{ $_, $alpha ++ } 0 .. 25 ;

sub trans($$){
  my %table = %{ shift @_ } ;
  my $num = shift ;
  my $int = keys %table ;
  my $res = q{} ;
  until( $num / $int <1){
  $res = $table{ $num % $int } . $res ;
  $num = int ( $num / $int) ;
  }
  return $table{$num}. $res ;
}
for ( 0 .. 1000 ){
  print $_ . qq{\t}
  . ( trans \%table26, $_ ) . qq{\t}
  . ( trans \%table2, $_ ) . qq{\t}
  . ( sprintf "%b", $_ ) . qq{\t}
  . ( trans \%table8, $_ ) . qq{\t}
  . ( sprintf "%o", $_ ) . qq{\t}
  . ( trans \%table16, $_ ) . qq{\t}
  . ( sprintf "%x", $_ ) . qq{\n}
  ;
}
0194nobodyさん2008/03/22(土) 07:21:59ID:???
>>190-193

ありがとうございます。
さっぱり分かりませんが、
使ってみます。
0195nobodyさん2008/03/22(土) 07:40:27ID:???
>>190
教えて頂いて申し訳ないですが、
Zの次がBAになってしまいます。
Zの次はAAにしたいのです。
0196nobodyさん2008/03/22(土) 08:02:49ID:???
>>195
それだったら191使えば?
0197nobodyさん2008/03/22(土) 08:39:40ID:???
>>196

>>191は取り消しって書いてあるから、
試してなかったんだけど、
試したら、うまくいってると思う。
なんで、取り消したんだろう???
0198nobodyさん2008/03/22(土) 08:46:28ID:???
>>197
Excel式の26進数もどきだから。
0199nobodyさん2008/03/22(土) 08:53:15ID:???
>>198
よく分からんが、ありがと。
しかし、>>191の処理速度は遅いね。
0200nobodyさん2008/03/22(土) 09:14:56ID:???
>>193
は、なんかエラーが出て動かないorz
0201nobodyさん2008/03/22(土) 09:21:39ID:???
>>190をなんとか改造できないだろうか。
ちと、考えてみる。
でも、自分には無理な気がする。
0202nobodyさん2008/03/22(土) 09:22:10ID:???
>>191は、26進数じゃない。使うな。
10進数676は、26進数では、
676/26 = 26 余り0
26/26 = 1 余り0
で、1 0 0(BAAが正しい)が、
>>191だとZAになる。

>>200
インデントの為の全角スペースを除け。

■ このスレッドは過去ログ倉庫に格納されています