Perlコーディング初心者質問スレ Part 57
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/02/25(月) 19:25:51ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0167162
2008/03/20(木) 13:44:57ID:???今、飯食ってるから
終わったら試してみる。
0171162
2008/03/20(木) 14:03:22ID:???解決できました。
PG久しぶりなんで、
頭が退化してたようです。
0172nobodyさん
2008/03/20(木) 14:11:42ID:???まぁ俺もたまに似たようなミスするのであまりコケにできない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:???0175nobodyさん
2008/03/20(木) 16:12:49ID:???げ!、ソースを見たらちゃんと空白が入ってました。
ブラウザで表示すると空白がなくなっちゃう。。。
これはなんでですか?
0176nobodyさん
2008/03/20(木) 16:43:28ID:???0177nobodyさん
2008/03/20(木) 17:00:56ID:???font-family: monospace;
にしたうえで空白を にすればいいです。
0178nobodyさん
2008/03/20(木) 20:32:02ID:cqY9pHpE0180162
2008/03/20(木) 22:33:29ID:???に、しました。
0181nobodyさん
2008/03/20(木) 23:06:14ID:???0183nobodyさん
2008/03/20(木) 23:33:13ID:???いやいや、難しい話でなく。>>181が言ってるのは
「 にしました」と入力して投稿すれば
「 にしました」と表示されるからスペース不要ってだけの話だと思うよ。
# でも確か専ブラによって表示が違ったはず。<エンティティ方面
0184nobodyさん
2008/03/21(金) 10:02:10ID:???HTMLでalign=rightのほうがいいんじゃない?
0185nobodyさん
2008/03/21(金) 10:37:17ID:???桁そろえるのにHTMLのブロック要素を使わなかったり
固定幅フォントを使わないのはバカだゆん
0186157
2008/03/21(金) 11:32:07ID:???自己解決決しました。
SQL を実行する前に SET NAMES utf8 を実行する必要があったみたいです。
一旦 SET NAMES utf8 を実行した後で select/insert/etc... を実行しないと
化けてしまうようです。
ナゼ化けるのかは理解できていませんが・・・。
# たぶん utf-8 以外で MySQL から出力しようとして化けてしまうとは思いますが理解できていません。
0187nobodyさん
2008/03/21(金) 13:27:45ID:???ハッシュ値の並び方が呼び出しのタイミング等で
一致しないのは知ってますが、keys %hash と values %hash の
並び方って必ず組み合わせが一致するのでしょうか?
0188nobodyさん
2008/03/21(金) 13:31:00ID:???0189nobodyさん
2008/03/21(金) 18:55:25ID:???0190nobodyさん
2008/03/21(金) 21:10:27ID:???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:???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:???0193nobodyさん
2008/03/21(金) 23:12:27ID:???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}
;
}
0197nobodyさん
2008/03/22(土) 08:39:40ID:???>>191は取り消しって書いてあるから、
試してなかったんだけど、
試したら、うまくいってると思う。
なんで、取り消したんだろう???
0202nobodyさん
2008/03/22(土) 09:22:10ID:???10進数676は、26進数では、
676/26 = 26 余り0
26/26 = 1 余り0
で、1 0 0(BAAが正しい)が、
>>191だとZAになる。
>>200
インデントの為の全角スペースを除け。
0206nobodyさん
2008/03/22(土) 10:17:00ID:???0208nobodyさん
2008/03/22(土) 10:39:45ID:???0209nobodyさん
2008/03/22(土) 10:54:33ID:???0210nobodyさん
2008/03/22(土) 10:57:42ID:???$calc = new Math::BaseCalc(digits => ['a'..'z']);
$ans = $calc->to_base($number);
これもzの次にbaが出るorz
0211nobodyさん
2008/03/22(土) 11:22:42ID:???おまいがやりたい事は26進とは言わない
0212nobodyさん
2008/03/22(土) 11:23:35ID:???0213nobodyさん
2008/03/22(土) 11:32:56ID:???私が意図したものは
どう書けばいいのだろうか???
0214nobodyさん
2008/03/22(土) 12:54:31ID:???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) - 1;
}
return length $result ? $result : $$digits[0];
}
0215nobodyさん
2008/03/22(土) 13:06:15ID:???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) - 1;
}
return length $result ? $result : $$digits[0];
}
0216nobodyさん
2008/03/22(土) 14:55:10ID:???0217138
2008/03/24(月) 22:18:54ID:wHKnZ0l2スイマセン。色々試しましたがヤハリ分からないのでコチラに書き込みをさせていただきます。
「名前\t数\t」というデータ(@arrangeData)から
$hash{名前}=合計数とのhashデータを作成したいのです。
# データを宣言
foreach(@arrangeData){
my @splitdata = split(/\t/);
if(defined $hash{$splitdata[0]}){
}else{
$hash{$splitdata[0]} = 0;
}
}
my $key;
print "取得した数を数える。<br>";
# 取得した数を合計する。
foreach(@arrangeData){
my @splitdata= split(/\t/);
foreach $key ( keys %hash ) {
if($key eq $splitdata[0]){
print "$hash{ $key } ni $splitdata[1] tumari $hash{$key} += $splitdata[1];wo tasu<br>";
$hash{$key} += $splitdata[1];
print "$key : $hash{$key}<br>";
}
}
}
とのプログラムでは何故か
$hash{$key} += $splitdata[1];
print "$key : $hash{$key}<br>";
が0で数値が入りません。
どうしてでしょうか?
0218nobodyさん
2008/03/24(月) 22:49:38ID:???0219nobodyさん
2008/03/24(月) 22:52:29ID:???#!/usr/bin/perl -w
use strict;
# use Scalar::Util qw(looks_like_number);
sub looks_like_number { $_[0] =~ /([0-9]+)/ ? $1 : 0 }
my @arrangeData = (
"name1\t1\t", "name2\t2\t", "name3\t\t", "name4\t4\t",
"name1\t10\t", "name2\t20\t", "name3\t\t", "name4\t40\t",
);
my %hash;
for (@arrangeData) {
my($name, $num) = split /\t/;
$hash{$name} += looks_like_number($num) ? $num : 0;
}
print "key:[$_] value:[$hash{$_}]\n" for sort keys %hash;
0220nobodyさん
2008/03/24(月) 23:29:25ID:???その @arrangeData を >>217 のコードに食わせても
name1 : 11
name2 : 22
name3 : 0
name4 : 44
になるんよね。"name3\tぱ\t" にしたりしても。
データのフォーマットが本人の説明と違うように思う。
という指摘が前回もあったような。
0221nobodyさん
2008/03/26(水) 00:57:12ID:???対象の集合をそのままハッシュのキーにして値を++したんですが、
ハッシュはソートできませんよね。配列を使うしかないでしょうか。
0222nobodyさん
2008/03/26(水) 01:00:59ID:???0223nobodyさん
2008/03/26(水) 01:01:47ID:???質問が漠然とし過ぎてるんで、この辺一通り読んでから来て。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html
http://perldoc.jp/docs/perl/5.8.8/perldsc.pod
0225nobodyさん
2008/03/26(水) 09:29:51ID:LilkylgSそこで終わりにしたい場合はどうしたらいいでしょうか?
どうも全部読むか、失敗かの選択しかないみたいなんですが。。
0226nobodyさん
2008/03/26(水) 14:32:04ID:???一旦保存してから読み直せば?
0227nobodyさん
2008/03/26(水) 14:47:06ID:???httpd が受け取る/受け取らないという話でなく、
プログラム中の処理の流れでという意味なら
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
の「ファイル・アップロード・フィールドの作成」の項
0228nobodyさん
2008/03/26(水) 22:35:17ID:OE9DSfjk定数なんかを別ファイルに置いてそこから取得したい。
---const.pl---
my $x="あいうえお";
1;
---main.cgi---(ヘッダとかは略)
use strict;
require "./const.pl";
print $x;
とするとGlobal symbol "$x" requires explicit package nameという
$xが定義されていませんエラーになります。
use strict外すと$xは空白です。
http://q.hatena.ne.jp/1190815879
とかを見るとどう見てもこれで正しいようにしか思えないのですが何故?
他にこんなところで迷ってる人居ないから環境の問題なんだろうか?
CoLinux,perl5.8.6
0229nobodyさん
2008/03/26(水) 22:45:43ID:???0230nobodyさん
2008/03/26(水) 22:57:38ID:???<q cite="http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod#item_my_EXPR_my">
my はリストアップされた変数を、囲っているブロック、ファイル、eval の中で
ローカルな (レキシカルな) ものにします。
</q>
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Perl_Modules
0231nobodyさん
2008/03/26(水) 23:12:52ID:???変数の局所化とか strict とは無縁になるけど。
はてなでやり取りしてる人らはそうしてるんじゃないかな。
0232nobodyさん
2008/03/27(木) 01:07:20ID:???0233nobodyさん
2008/03/27(木) 01:23:34ID:R/qLdwoIhoge.pm
package hoge;
sub kaze_hiita{
"hayaku neru"
}
our $x = 1;
1;
foo.pl
use hoge;
print hoge::kaze_hiita; -> 早く寝る
print $hoge::x; -> 1
$hoge::x = 10;
print $hoge::x; -> 10
関数のときのみ::じゃなくて->が使えるんだぜ。
あと関数の尻尾には();って書いてあると俺はうれしい。
ハッシュで渡すとさらにうれしい。
あと、そゆのがコンフィグを一杯つかうなら
普通に Auto-Config使うべし。
http://memo.majide.com/index.php?%A1%DAPerl%A1%DBConfig-Auto%A4%CB%A4%E8%A4%EB%C0%DF%C4%EA%A5%D5%A5%A1%A5%A4%A5%EB%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF
当然だがファイル間は文字コードは統一しとけよ
それでしんだひとをみたことがあります。>俺自身
0235nobodyさん
2008/03/27(木) 12:35:04ID:???234が責任を持って書き換えます。おながい。
0236nobodyさん
2008/03/27(木) 12:36:10ID:???こうするのさ。
---const.pl---
$x="あいうえお";
1;
---main.cgi---
use strict;
our $x;
require "./const.pl";
print $x;
0237nobodyさん
2008/03/27(木) 16:59:46ID:???0238nobodyさん
2008/03/27(木) 19:04:51ID:???0239nobodyさん
2008/03/27(木) 22:17:48ID:???0240228
2008/03/27(木) 23:49:16ID:OO8NUyXNさっぱりわからんがサンクス。調べてみる
iniファイルやPHPみたいに簡単に取得できる方法はないのかのう・・・
0241nobodyさん
2008/03/27(木) 23:56:27ID:???だからモジュール紹介されてるやんけwww
0242nobodyさん
2008/03/28(金) 00:17:56ID:???0243233
2008/03/28(金) 00:26:56ID:???感想でいいからくれ
何がさっぱりわからんと思ったか書いてくれれば分かりやすくもういっかい書くよ。
1. リンクを開いたと思うんだが、何が意味不明だと思った(全部ってのはなしで)
2. 何を作っててプログラム暦何年か教えてくれ。
スレ汚しならすまん。ちょっと個人的に技法よりも心理障壁に興味がある。
0244nobodyさん
2008/03/28(金) 10:02:51ID:???0245nobodyさん
2008/03/28(金) 15:01:30ID:jpsDmJfA2008/03/28(金) 09:30:08
↓
08/3/28 9:30
0246nobodyさん
2008/03/28(金) 15:33:52ID:???sub reduce_date {
my @date = split /\D+/, $_[0];
$date[0] -= 2000;
sprintf '%02d/%d/%d %d:%d', @date[0..4];
}
print reduce_date('2008/03/28(金) 09:30:08');
0247nobodyさん
2008/03/28(金) 15:36:13ID:???my $orgdate = '2008/03/28(金) 09:30:08';
my @splitdata = $orgdate =~ /(\d{2})+/g;
printf("%02d/%02d/%02d %02d:%02d:%02d", @splitdata);
0248nobodyさん
2008/03/28(金) 15:46:09ID:???0249nobodyさん
2008/03/28(金) 15:48:45ID:???0250nobodyさん
2008/03/28(金) 15:57:20ID:???s{\d\d(\d\d)/0?(\d+)/0?(\d+)[^ ]+ 0?(\d+):(\d+):\d+}{$1/$2/$3 $4:$5};
0251nobodyさん
2008/03/28(金) 16:45:45ID:???my $datetime = sprintf("%02d/%d/%d %d:%d:%d", @splitdata);
0252nobodyさん
2008/03/28(金) 16:49:23ID:???my @splitdata = $orgdate =~ /(\d{1,2})+/g;
my $datetime = sprintf("%02d/%d/%d %d:%d", @splitdata);
print $datetime;
0253nobodyさん
2008/03/28(金) 16:59:35ID:???0255nobodyさん
2008/03/28(金) 19:09:17ID:???例えばjavascriptで
var c=1;alert(c=c+(c*=10)+(c*=100));
は1011
Perlで
my $c=1;print($c=$c+($c*=10)+($c*=100));
は1020
になります。
そこで、この問題について載っているサイトがあれば教えてください。
0256nobodyさん
2008/03/28(金) 20:04:35ID:???0257nobodyさん
2008/03/28(金) 23:58:05ID:???> var c=1;alert(c=c+(c*=10)+(c*=100));
こう書くのはクズグラマー。
0258nobodyさん
2008/03/29(土) 03:54:49ID:???http://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
0263nobodyさん
2008/03/29(土) 17:56:41ID:???0265259
2008/03/30(日) 22:02:27ID:???■ このスレッドは過去ログ倉庫に格納されています