[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/13 10:37 / Filesize : 211 KB / Number-of Response : 804
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:nobodyさん mailto:sage [2008/02/25(月) 19:25:51 ID:???]
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ pc11.2ch.net/test/read.cgi/php/1189939783/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/


137 名前:nobodyさん mailto:sage [2008/03/18(火) 11:07:18 ID:???]
小難しく考えるなよ
stat使えばいいだろ

138 名前:nobodyさん [2008/03/18(火) 17:51:36 ID:yz+TlyvN]
お世話になっております。

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

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

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

以上 ご助力いただけますとありがたいです。


139 名前:nobodyさん mailto:sage [2008/03/18(火) 18:20:21 ID:???]
>>138
デバッグの基本、$fugaをprintしてみる

140 名前:nobodyさん mailto:sage [2008/03/18(火) 18:25:39 ID:???]
>>138
$hoge と $fuga に数字がきちんと入ってたら、最初に文字列として認識してようと、
+= の段階で数字として扱ってくれるだろ…。他の部分のミスじゃね?

141 名前:nobodyさん mailto:sage [2008/03/18(火) 18:26:00 ID:???]
$hogeか$fugaに数字以外の記号(改行とか)が混じっていると予想

142 名前:138 [2008/03/18(火) 18:30:10 ID:yz+TlyvN]
RESありがとうございますっ

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

num $fuga
int $fuga
などで数字と明言する方法があったような気がするのですが
私の勘違いでしょうか???

143 名前:nobodyさん mailto:sage [2008/03/18(火) 18:35:55 ID:???]
勘違い。
っつーかデバッグして調べろよ

144 名前:nobodyさん mailto:sage [2008/03/18(火) 19:26:34 ID:???]
内容が多いハッシュの値があって、それをデータベースに格納するのに、
そのまま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文を構築してデータを格納しているのですが、
もう少しスマートな方法は無いでしょうか?

145 名前:nobodyさん mailto:sage [2008/03/18(火) 19:50:13 ID:???]
 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)の辺りは、
もうちょっとスマートな方法がありそう…。



146 名前:nobodyさん mailto:sage [2008/03/18(火) 20:25:49 ID:???]
>>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 } );

てきとーに書いたから、' とか抜けてても勘弁。

147 名前:nobodyさん mailto:sage [2008/03/18(火) 21:49:40 ID:???]
>>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);

148 名前:138 [2008/03/19(水) 16:21:54 ID: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>";
}
}
}
(続く)

149 名前:138 [2008/03/19(水) 16:23:18 ID: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{名前}->数
とのハッシュデータを取得できますでしょうか?

以上 ご助力をいただけますとありがたいです。


150 名前:nobodyさん mailto:sage [2008/03/19(水) 16:44:42 ID:???]
日本語で

151 名前:nobodyさん mailto:sage [2008/03/19(水) 16:56:44 ID:???]
ひどすぎワロタwww

152 名前:nobodyさん mailto:sage [2008/03/19(水) 17:13:34 ID:???]
$hash{名前}->数ってこれはリファレンス的な意味じゃないよね?
$hash{名前} = 数で取り出したいってこと?
$splitdata[10]てなに?空じゃないの?
$hashには$hash{$splitdata[7]} = 0; この部分でしか入れてないよね?


153 名前:nobodyさん mailto:sage [2008/03/19(水) 17:20:14 ID:???]
> (フォーマットは「名前\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] したいんじゃないのかな。

154 名前:153 mailto:sage [2008/03/19(水) 17:21:25 ID:???]
最後の行 $hash{

155 名前:153 mailto:sage [2008/03/19(水) 17:23:29 ID:???]
すみません。} を打とうとしたら shift + enter を押して鬱。
$hash{$splitdata[0]} の } が抜けてました。



156 名前:nobodyさん mailto:sage [2008/03/19(水) 17:28:37 ID:???]
map { $hash->{$_->[0]} += $_->[7]; } map { chomp; [split(/\t/)]; } @data;

157 名前:nobodyさん mailto:sage [2008/03/19(水) 23:15:18 ID:???]
このスレが相応しいかわかりませんが質問させてください。

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 のはずです

158 名前:nobodyさん mailto:sage [2008/03/19(水) 23:41:08 ID:???]
>>157
OSの設定はutf-8か、日本語が表示できるシェルを使ってるか

159 名前:nobodyさん mailto:sage [2008/03/19(水) 23:45:37 ID:???]
BBSなんだからHTML吐いてるんじゃないの?
それでメタタグの文字コード宣言が違うとか

160 名前:157 mailto:sage [2008/03/20(木) 12:29:10 ID:???]
おはようございます。
apache を使ってブラウザ上に表示させてます。
メタタグには一応 utf-8 って記入してます。

ブラウザ側の文字コードも utf-8 になってました


161 名前:nobodyさん mailto:sage [2008/03/20(木) 12:38:21 ID:???]
BOM付いてる希ガス

162 名前:nobodyさん mailto:sage [2008/03/20(木) 13:03:57 ID:???]
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]が表示されないのはなぜ?

163 名前:nobodyさん mailto:sage [2008/03/20(木) 13:33:56 ID:???]
print "$box[1][0+$i*10]\n";だから。

164 名前:nobodyさん mailto:sage [2008/03/20(木) 13:41:13 ID:???]
$box[$i][$j] = $j;

の行の次に

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

入れて表示してみ

165 名前:nobodyさん mailto:sage [2008/03/20(木) 13:42:25 ID:???]
$box[$i][$j] = $i * 10 + $j;
期待する動作はこれかな?



166 名前:nobodyさん mailto:sage [2008/03/20(木) 13:43:46 ID:???]
>>163
俺には理解不能だ
もうちと、噛み砕いておしえてくれ

167 名前:162 mailto:sage [2008/03/20(木) 13:44:57 ID:???]
みなさん、レスありがと。
今、飯食ってるから
終わったら試してみる。

168 名前:nobodyさん mailto:sage [2008/03/20(木) 13:54:36 ID:???]
>>164
意図した動きになってる。
iもjもちゃんと入れ子になって
ループしている

169 名前:nobodyさん mailto:sage [2008/03/20(木) 13:56:38 ID:???]
>>164
あ!ごめんなさい
ちと、おかしい

170 名前:nobodyさん mailto:sage [2008/03/20(木) 14:02:32 ID:???]
>>165
そうでした。

171 名前:162 mailto:sage [2008/03/20(木) 14:03:22 ID:???]
皆様、ありがとうございます。
解決できました。

PG久しぶりなんで、
頭が退化してたようです。

172 名前:nobodyさん mailto:sage [2008/03/20(木) 14:11:42 ID:???]
10 x 10 の箱に連番を入れたかっただけだけど、配列のインクリメントでちとボケてただけですね
まぁ俺もたまに似たようなミスするのであまりコケにできないwww

173 名前:nobodyさん mailto:sage [2008/03/20(木) 15:57:38 ID:???]
またお願いします。

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

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

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

それとも連続空白を表す記号みたいな物は
あるのでしょうか?

174 名前:nobodyさん mailto:sage [2008/03/20(木) 16:03:28 ID:???]
webブラウザが半角スペースをつぶしちゃうからとかじゃなくて?

175 名前:nobodyさん mailto:sage [2008/03/20(木) 16:12:49 ID:???]
>>174
げ!、ソースを見たらちゃんと空白が入ってました。
ブラウザで表示すると空白がなくなっちゃう。。。
これはなんでですか?



176 名前:nobodyさん mailto:sage [2008/03/20(木) 16:43:28 ID:???]
ブラウザの仕様

177 名前:nobodyさん mailto:sage [2008/03/20(木) 17:00:56 ID:???]
ブラウザで桁をそろえたいなら、表示する部分のフォントを
font-family: monospace;
にしたうえで空白を   にすればいいです。

178 名前:nobodyさん [2008/03/20(木) 20:32:02 ID:cqY9pHpE]
<pre></pre>

179 名前:162 mailto:sage [2008/03/20(木) 22:32:36 ID:???]
>>178
それは、クライアントの読み込みが遅くなるので
あきらめました。
 にしました。

180 名前:162 mailto:sage [2008/03/20(木) 22:33:29 ID:???]
& n b s p ;

に、しました。

181 名前:nobodyさん mailto:sage [2008/03/20(木) 23:06:14 ID:???]
「&amp;nbsp;にしました」と書けばok

182 名前:nobodyさん mailto:sage [2008/03/20(木) 23:17:39 ID:???]
>>181
むぅ、また、難しいことを言うな。
明日、調べます。

183 名前:nobodyさん mailto:sage [2008/03/20(木) 23:33:13 ID:???]
>>182
いやいや、難しい話でなく。>>181が言ってるのは
「&amp;nbsp;にしました」と入力して投稿すれば
「&nbsp;にしました」と表示されるからスペース不要ってだけの話だと思うよ。

# でも確か専ブラによって表示が違ったはず。<エンティティ方面

184 名前:nobodyさん mailto:sage [2008/03/21(金) 10:02:10 ID:???]
nbsp;でも詰まるよ
HTMLでalign=rightのほうがいいんじゃない?

185 名前:nobodyさん mailto:sage [2008/03/21(金) 10:37:17 ID:???]
それはプロポーショナルたからな
桁そろえるのにHTMLのブロック要素を使わなかったり
固定幅フォントを使わないのはバカだゆん



186 名前:157 mailto:sage [2008/03/21(金) 11:32:07 ID:???]
>>157 です
自己解決決しました。

SQL を実行する前に SET NAMES utf8 を実行する必要があったみたいです。
一旦 SET NAMES utf8 を実行した後で select/insert/etc... を実行しないと
化けてしまうようです。
ナゼ化けるのかは理解できていませんが・・・。
# たぶん utf-8 以外で MySQL から出力しようとして化けてしまうとは思いますが理解できていません。


187 名前:nobodyさん mailto:sage [2008/03/21(金) 13:27:45 ID:???]
ふと>>144の解答で疑問に思ったのですが…

ハッシュ値の並び方が呼び出しのタイミング等で
一致しないのは知ってますが、keys %hash と values %hash の
並び方って必ず組み合わせが一致するのでしょうか?

188 名前:nobodyさん mailto:sage [2008/03/21(金) 13:31:00 ID:???]
keys使ってからをvaluesを使うまでにハッシュの内容を変えなかった場合一致するよ

189 名前:nobodyさん mailto:sage [2008/03/21(金) 18:55:25 ID:???]
どなたか、10進数を26進数(使える文字はAからZ)に変換するサブルーチンを教えてください

190 名前:nobodyさん mailto:sage [2008/03/21(金) 21:10:27 ID:???]
>>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];
}

191 名前:nobodyさん mailto:sage [2008/03/21(金) 21:33:13 ID:???]
>>189
sub conv($){
my $alpha = 'A' ;
$alpha ++ for 1 .. $_[0] ;
return $alpha ;
}
printf "%d\t%s\n", $_, conv $_ for 0 .. 200 ;

192 名前:nobodyさん mailto:sage [2008/03/21(金) 21:53:29 ID:???]
191は取り消し

193 名前:nobodyさん mailto:sage [2008/03/21(金) 23:12:27 ID:???]
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}
  ;
}

194 名前:nobodyさん mailto:sage [2008/03/22(土) 07:21:59 ID:???]
>>190-193

ありがとうございます。
さっぱり分かりませんが、
使ってみます。


195 名前:nobodyさん mailto:sage [2008/03/22(土) 07:40:27 ID:???]
>>190
教えて頂いて申し訳ないですが、
Zの次がBAになってしまいます。
Zの次はAAにしたいのです。



196 名前:nobodyさん mailto:sage [2008/03/22(土) 08:02:49 ID:???]
>>195
それだったら191使えば?

197 名前:nobodyさん mailto:sage [2008/03/22(土) 08:39:40 ID:???]
>>196

>>191は取り消しって書いてあるから、
試してなかったんだけど、
試したら、うまくいってると思う。
なんで、取り消したんだろう???

198 名前:nobodyさん mailto:sage [2008/03/22(土) 08:46:28 ID:???]
>>197
Excel式の26進数もどきだから。

199 名前:nobodyさん mailto:sage [2008/03/22(土) 08:53:15 ID:???]
>>198
よく分からんが、ありがと。
しかし、>>191の処理速度は遅いね。

200 名前:nobodyさん mailto:sage [2008/03/22(土) 09:14:56 ID:???]
>>193
は、なんかエラーが出て動かないorz

201 名前:nobodyさん mailto:sage [2008/03/22(土) 09:21:39 ID:???]
>>190をなんとか改造できないだろうか。
ちと、考えてみる。
でも、自分には無理な気がする。

202 名前:nobodyさん mailto:sage [2008/03/22(土) 09:22:10 ID:???]
>>191は、26進数じゃない。使うな。
10進数676は、26進数では、
676/26 = 26 余り0
26/26 = 1 余り0
で、1 0 0(BAAが正しい)が、
>>191だとZAになる。

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



203 名前:nobodyさん mailto:sage [2008/03/22(土) 09:38:25 ID:???]
>>202

ありがと。
>>191は、遅い理由も含めて、使用しないことにする。
>>191さん、申し訳ない。

204 名前:nobodyさん mailto:sage [2008/03/22(土) 09:44:17 ID:???]
>>193

zの次がbaになるorz

205 名前:nobodyさん mailto:sage [2008/03/22(土) 09:45:28 ID:???]
>>203
202=191=193=俺なので気にするな。



206 名前:nobodyさん mailto:sage [2008/03/22(土) 10:17:00 ID:???]
Math::BaseCalcモジュールでも使えば良いんでないか?

207 名前:nobodyさん mailto:sage [2008/03/22(土) 10:39:29 ID:???]
>>206
まず、インストールのいかたが分からないので、
そこから、調べてみる

208 名前:nobodyさん mailto:sage [2008/03/22(土) 10:39:45 ID:???]
インストールのしかた

209 名前:nobodyさん mailto:sage [2008/03/22(土) 10:54:33 ID:???]
ppm install Math-BaseCalc

210 名前:nobodyさん mailto:sage [2008/03/22(土) 10:57:42 ID:???]
インストールできました。

$calc = new Math::BaseCalc(digits => ['a'..'z']);
$ans = $calc->to_base($number);

これもzの次にbaが出るorz


211 名前:nobodyさん mailto:sage [2008/03/22(土) 11:22:42 ID:???]
当り前だろ、A=0 B=0扱いなんだから
おまいがやりたい事は26進とは言わない

212 名前:nobodyさん mailto:sage [2008/03/22(土) 11:23:35 ID:???]
B=1だ orz

213 名前:nobodyさん mailto:sage [2008/03/22(土) 11:32:56 ID:???]
うぅーん、そうなると
私が意図したものは
どう書けばいいのだろうか???

214 名前:nobodyさん mailto:sage [2008/03/22(土) 12:54:31 ID:???]
出来た!実に単純だった。

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];
}

215 名前:nobodyさん mailto:sage [2008/03/22(土) 13:06:15 ID:???]
間違えた、こうだ。

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];
}



216 名前:nobodyさん mailto:sage [2008/03/22(土) 14:55:10 ID:???]
ブルートフォースアタックに使えそうなコードだなw


217 名前:138 [2008/03/24(月) 22:18:54 ID: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で数値が入りません。
どうしてでしょうか?


218 名前:nobodyさん mailto:sage [2008/03/24(月) 22:49:38 ID:???]
レスあっただろ

219 名前:nobodyさん mailto:sage [2008/03/24(月) 22:52:29 ID:???]
>>138
#!/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;

220 名前:nobodyさん mailto:sage [2008/03/24(月) 23:29:25 ID:???]
>>219
その @arrangeData を >>217 のコードに食わせても
 name1 : 11
 name2 : 22
 name3 : 0
 name4 : 44
になるんよね。"name3\tぱ\t" にしたりしても。

データのフォーマットが本人の説明と違うように思う。
という指摘が前回もあったような。

221 名前:nobodyさん mailto:sage [2008/03/26(水) 00:57:12 ID:???]
質問です。ある文字列の集合を集計して出現頻度の高い順に取り出すため、
対象の集合をそのままハッシュのキーにして値を++したんですが、
ハッシュはソートできませんよね。配列を使うしかないでしょうか。


222 名前:nobodyさん mailto:sage [2008/03/26(水) 01:00:59 ID:???]
sort { $hash{$b} <=> $hash{$a} } keys %hash;

223 名前:nobodyさん mailto:sage [2008/03/26(水) 01:01:47 ID:???]
>>221
質問が漠然とし過ぎてるんで、この辺一通り読んでから来て。
www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html
perldoc.jp/docs/perl/5.8.8/perldsc.pod

224 名前:nobodyさん mailto:sage [2008/03/26(水) 01:05:19 ID:???]
>>222さんのでわかりました!
>>223さんのも読んでおきます!
どうもでした!!

225 名前:nobodyさん [2008/03/26(水) 09:29:51 ID:LilkylgS]
CGI.pmを使ってアップロードされたファイルの途中まで読んで
そこで終わりにしたい場合はどうしたらいいでしょうか?

どうも全部読むか、失敗かの選択しかないみたいなんですが。。



226 名前:nobodyさん mailto:sage [2008/03/26(水) 14:32:04 ID:???]
そんな需要は稀なんだろ
一旦保存してから読み直せば?

227 名前:nobodyさん mailto:sage [2008/03/26(水) 14:47:06 ID:???]
>>225
httpd が受け取る/受け取らないという話でなく、
プログラム中の処理の流れでという意味なら
perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
の「ファイル・アップロード・フィールドの作成」の項

228 名前:nobodyさん [2008/03/26(水) 22:35:17 ID: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は空白です。

q.hatena.ne.jp/1190815879
とかを見るとどう見てもこれで正しいようにしか思えないのですが何故?


他にこんなところで迷ってる人居ないから環境の問題なんだろうか?
CoLinux,perl5.8.6

229 名前:nobodyさん mailto:sage [2008/03/26(水) 22:45:43 ID:???]
同じ変数でも名前空間が異なれば別物

230 名前:nobodyさん mailto:sage [2008/03/26(水) 22:57:38 ID:???]
>>228
<q cite="perldoc.jp/docs/perl/5.10.0/perlfunc.pod#item_my_EXPR_my">
my はリストアップされた変数を、囲っているブロック、ファイル、eval の中で
ローカルな (レキシカルな) ものにします。
</q>

www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Perl_Modules

231 名前:nobodyさん mailto:sage [2008/03/26(水) 23:12:52 ID:???]
my と use strict を取っ払ってみると print されたり。
変数の局所化とか strict とは無縁になるけど。

はてなでやり取りしてる人らはそうしてるんじゃないかな。

232 名前:nobodyさん mailto:sage [2008/03/27(木) 01:07:20 ID:???]
local

233 名前:nobodyさん [2008/03/27(木) 01:23:34 ID:R/qLdwoI]
>>228
hoge.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使うべし。
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

当然だがファイル間は文字コードは統一しとけよ
それでしんだひとをみたことがあります。>俺自身

234 名前:nobodyさん mailto:sage [2008/03/27(木) 10:30:16 ID:???]
>>233
説明で「 -> 1」とかを使ったら混乱するだろjk

235 名前:nobodyさん mailto:sage [2008/03/27(木) 12:35:04 ID:???]
正直すまんかった
234が責任を持って書き換えます。おながい。



236 名前:nobodyさん mailto:sage [2008/03/27(木) 12:36:10 ID:???]
>>228
こうするのさ。

---const.pl---
$x="あいうえお";
1;

---main.cgi---
use strict;
our $x;
require "./const.pl";
print $x;

237 名前:nobodyさん mailto:sage [2008/03/27(木) 16:59:46 ID:???]
our wwwwwwwwwwwwwwwwwwwwwwwwww






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<211KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef