Perlコーディング初心 ..
[2ch|▼Menu]
75:nobodyさん
08/03/10 16:46:11
すみません、下のソースで、sendmailをcloseしたときにエラー($?=256)が返されてしまうのですが、
これはどう対処すべきなのでしょうか…?

#タイトルのエンコード
$subject = encode('iso-2022-jp', $subject); # iso-2022-jpにエンコード
$subject = encode_base64($subject, ''); # Base64にエンコード
$subject = '=?iso-2022-jp?B?' . $subject . '?='; # ヘッダー文字列の追加
# 本文のエンコード
$content = encode('iso-2022-jp', $content); # iso-2022-jpにエンコード

# メール送信
$cnt=<<"EOT";
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=iso-2022-jp
From: $from
To: $to
Subject: $subject

$content
EOT
open MAIL, "| /usr/sbin/sendmail -t" or &err("Cannot open sendmail: $!");
print MAIL $cnt;
close MAIL or &err("Cannot close sendmail: !=$! ?=$?");

76:nobodyさん
08/03/10 17:53:13 dzM4A1jo
マルチポスト君に応える回答は御座いませぬ
他池

77:75
08/03/10 19:29:36
自己解決出来たので報告です。
>>75のは、「文字コードが意味不明だゴラァ」と言われていたようでした。
(『encode』とは『UTF-8から』sjisやらiso-2022-jpやらにエンコードする機能。
 一度UTF-8に『decode』しなければならなかった。)

 以上、スレ汚し失礼しました。

78:nobodyさん
08/03/10 22:41:42
$lineの内容と同じ行がlog.txtになかったら、$lineをlog.txtの末尾に追記する
といったものを作りたいのですが上手く行きません。

症状は、エラーは吐かず、同じ行があっても末尾に追記されてしまいます。
ご教授いただけたら助かります。

foreach my $aaa ( @{$data->{'aaa'}} ) {
$line="This is $aaa->{'msg'}";
$chk=0;
open( DAT, "./log.txt" );
while ( <DAT> ) {
if( $_ == $line ){
$chk++;
}
}
close( DAT );
if( $chk == 0 ){
open(FILE, ">>./log.txt");
$line="$line\n";
print FILE $line;
close(FILE);
}
}


79:nobodyさん
08/03/10 22:51:05
chomp使えばいいんじゃない?

80:nobodyさん
08/03/10 23:25:05
問.localtimeは配列を吐きますが、localtimeの動作の逆(配列を入れたら経過秒数合計が返ってくる)はどうしますか。

81:nobodyさん
08/03/10 23:34:28 dzM4A1jo
たしかGMTから秒数を返すモジュールがあったはず
比較的簡単に見つかるはずだからググッてみそ

82:nobodyさん
08/03/10 23:42:22
>>78
==

83:nobodyさん
08/03/10 23:43:47
>>81
ありがとうございます。
別サイトのRSSのタイムスタンプを読み、データベース化するのに秒数の方が効率がいいと思いました。
ただ標準実装では出来ないようなのでYYYYMMDDhhmmssで行こうと思います。

チラシの裏
RSSの仕様のいい加減さと各サイトの独自拡張と欧文フォーマットの日付表記ウザすぎですね。
少々殺意を覚えました。YahooやgooやニュースサイトのRSSを見てみると、バージョン違いで
タグが違う(pubDateやらdc:dateやら)はまだ許せますが、フォーマットもめちゃくちゃですね。

Mon, 10 Mar 2008 19:17:02 +0900
Mon,10 Mar 2008 11:02:29 +0900
2008-03-10T21:56:00+09:00

少なくとも3パターンはあるようで、非常に嘆かわしいと思いました。

84:nobodyさん
08/03/11 00:00:51 kt3GGsX4
XMLが自由すぎて使いづらいのが難点よねw

85:nobodyさん
08/03/11 00:17:08
安易に拡張性を求めたら墓穴を掘るいい例だよね
自由にできるのは結構なことだけど,良く使う日時のフォーマットくらい統一してほしいぜ・・・

86:nobodyさん
08/03/11 00:31:27
>>83
Time::Local (の timelocal) は組込関数ではないが標準モジュール。
故意に抜かない限り入っている。

87:nobodyさん
08/03/11 00:55:54
フォーマットを統一するものを書いてみました。無駄があったらご指摘お願いします。
#!/usr/local/bin/perl
sub DateFmt{
my $str=$_[0];
my $i,$temp,$num;
if($str =~ /[0-9]{4}?(-[0-9]{2}?){2}?T[0-9]{2}?:[0-9]{2}?:[0-9]{2}?\+[0-9]{2}?:[0-9]{2}?/){
return $str;
}
$str =~ s/^[a-zA-Z]{3}?\,//;
$str =~ s/^\ +//g;
@mname = ('Jun','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
$i=1;
foreach $temp (@mname){
$num=sprintf("%02d",$i);
$str =~ s/$temp/$num/i;
$i++;
}
($day,$month,$year,$hms,$jst) = split(/ /,$str);
$jst =~ s/\+(..)(..)/+$1:$2/;
return "$year-$month-${day}T$hms$jst";
}
print &DateFmt("Mon, 10 Mar 2008 19:17:02 +0900");
print "\n";
print &DateFmt("Mon,10 Mar 2008 11:02:29 +0900");
print "\n";
print &DateFmt("2008-03-10T21:56:00+09:00");
print "\n";

88:nobodyさん
08/03/11 05:18:16
読むのもめんどくせえよ

use Date::Parse;
print str2time($_), "\n" for <DATA>;
__DATA__
Mon, 10 Mar 2008 19:17:02 +0900
Mon,10 Mar 2008 11:02:29 +0900
2008-03-10T21:56:00+09:00

89:nobodyさん
08/03/11 05:24:13
XML::RSSでEUCのRSSを読み込むにはどうしたらいいんだ

90:nobodyさん
08/03/11 09:52:01
変換してから読み込めば?

91:nobodyさん
08/03/11 09:53:07
>>87
+0900の部分はグリニッジ比だから-から始まることもあり得る。

92:nobodyさん
08/03/11 12:11:54 PA7R3QgS
CPANモジュールのSpreadsheet::WriteExcelを導入しています。
このモジュールのあるバージョン以下の場合はメソッドA実行、それ以外はメソッドB実行
といった振り分けを行いたいのですが、モジュールのバージョンをperl上で調べるには
どうすればいいのでしょうか?
print $SpreadSheet::WriteExcel::VERSION;
としても、何も表示されませんでした。

93:nobodyさん
08/03/11 12:35:37
version 2.18 はそれできちんと表示された。その他の version は知らん。
ソースに当ってみたら?

94:nobodyさん
08/03/11 13:47:11
>>93
レスありがとうございます。わざわざ調べて頂きどうもです。

やってしまいました。
print $SpreadSheet::WriteExcel::VERSION;
ではなく、
print $Spreadsheet::WriteExcel::VERSION;
でした。これははずかしい(*´Д`)
バージョン2.15、2.20とも表示されました。大変失礼しました。

95:nobodyさん
08/03/11 14:00:50
どっちも同じなのだがw

96:nobodyさん
08/03/11 14:26:49
大文字小文字

97:nobodyさん
08/03/11 14:34:32
あ〜ww

98:nobodyさん
08/03/12 10:02:54
>>94
use strict汁!

99:nobodyさん
08/03/12 20:50:08
突然すみません。
Perlの勉強中で簡素なプログラムを作成しているのですが
POSTでデータがうまく送信できなくて困っています。
同じコードでMETHOD="GET"とすると送信できるのですが
パスワード入力などをするため、URLにパラメータを表示したくないのです。
お知恵を拝借させてください。よろしくお願いします

100:nobodyさん
08/03/12 20:55:51
>>99
POSTで送ることがわかってるなら調べれば簡単だと思うんだが。
CGI.pmとか使うと簡単にできる

101:nobodyさん
08/03/12 21:02:36
送信出来ないのでなく受信したあとの処理が出来てないに1000ペリカ

102:nobodyさん
08/03/12 21:04:45
>>100
迅速なレス、感謝します。
浅学でお恥ずかしいのですがCGI.pmについてこれから調べてみます。
ありがとうございます。

103:nobodyさん
08/03/12 21:10:03
>>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?で調べられるのかどうなのかまだよくわかっておりませんが
まずいところの見当すらつかなかったので助かります。
ありがとうございます。

104:nobodyさん
08/03/12 21:18:29
ぱっと見た感じ問題なさそうだけどな

しかしnameにも日本語を使ってるのか

105:nobodyさん
08/03/13 00:55:15
KENTのコピペ臭がするのは俺だけ?

106:nobodyさん
08/03/13 01:19:37
>>103
うーん、区切りがほんとに’&’なのかな。
一回、 print $form ; やってみれば?

107:nobodyさん
08/03/13 02:21:43
Perl4時代のこの定番処理がいまだに使われてるってのもなぁ


108:nobodyさん
08/03/13 03:58:19
そこでcgi-lib.plですよw

109:nobodyさん
08/03/13 13:54:44
最近、GET/POSTのデータやテキストファイルを自前で読み込まなきゃならないことがあって
「あれ? どうやるんだっけ?」と本気で焦った俺。

使わないとそんなもんだよな。


110:nobodyさん
08/03/13 20:56:52
>>109
ライブラリが整備されてそっち使うと忘れるんだよな

111:nobodyさん
08/03/14 00:19:02 jE/64EXv
くだすれにも書き込んだ者ですが。

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

あと、「$aaaが8のn倍ならマッチさせる」というのも
わかりませんでした、おねがいしますm(_ _)m

112:nobodyさん
08/03/14 00:26:38
!($aaa % 8) ← これで8の倍数のチェックだけど、マイナス値は試してないのでわかんないw

8で割ってみて余りが0なら割り切れてるので8の倍数ということ

113:nobodyさん
08/03/14 00:34:03
$aaa=1;
if($aaa==1||$aaa==3)

if ($aaa =~ /^[13]$/)
こんなのできないこともないけど、そのままでいいんじゃないか?

114:111
08/03/14 00:40:08 jE/64EXv
>112
そういうやりかたもあるんですね。

>113
極端にいえば
if($aaa==1||$aaa==5||$aaa==13||$aaa==17||$aaa==25||$aaa==34||)
こんなに長くなってしまう。
これじゃあまりにもじゃないですか?

115:nobodyさん
08/03/14 01:07:31
$aaa==9 や $aaa==21 が入ってなくて $aaa==34 が出てくるから
長くなるんだと思う。

116:nobodyさん
08/03/14 01:13:26
ありえる数字を列挙させて、それのチェック対象が1つの変数なら
1つの変数に対して配列で一気にチェックできた気がする

grep 使ったような使わなかったような・・・ごめん。 俺にはもう無理w

117:nobodyさん
08/03/14 01:41:34
長くて見づらいけど、処理量が多くて重くなるよりはマシかな。
そんな劇的な違いは無いとしても気分的になんとなくw

118:nobodyさん
08/03/14 01:51:12
重いと言っても何百万回も繰り返さないから、こうしちゃうなw
if($aaa =~ /^(1|5|13|17|25|34)$/)

119:nobodyさん
08/03/14 06:02:08
%tmp = map { $_ , 1 } ( 1, 5, 13, 17, 25, 34 ) ;
if ( defined $tmp{$aaa} ){
 print "俺の名を言ってみろ\n" ;
}

120:nobodyさん
08/03/14 11:41:19
>>116
grep使う方法だとこうかな?

if ( grep { $aaa == $_ } qw( 1 5 13 17 25 34  ) ) {
    # code here
}

121:nobodyさん
08/03/14 11:42:57
# 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/];

122:nobodyさん
08/03/14 11:53:06
ほとんどの場合、ブロックより式の方が早いので
my %tmp = map +( $_ => 1 ), ( 1, 5, 13, 17, 25, 34 );
grep $aaa == $_ ,( 1, 5, 13, 17, 25, 34 );



123:nobodyさん
08/03/14 14:50:45
dankogaiがエントリ書いてた
URLリンク(blog.livedoor.jp)

124:nobodyさん
08/03/14 15:48:58
>>111 >>113-122
URLリンク(www.kt.rim.or.jp)

125:nobodyさん
08/03/14 22:34:42 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";
  }
}

126:nobodyさん
08/03/14 22:50:02
>>125
open(FH, "$_") or die "$! [$_]";
1 while <FH>;

とでもして吐かれたエラーメッセージを読む。

127:nobodyさん
08/03/14 23:25:19
>>125
File::Find の find では pwd が変りますが、
$File::Find::name で得られるのはこの場合は $dir からのパス。

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

簡単な解決方法は、$dir にゼッタイパスを突っ込め。
それから perldoc File::Find くらいしろ。

128:nobodyさん
08/03/16 19:27:01 483Ek7KZ
Commonで漢字を含むデータをPOSTしたいのですが、漢字部分が出力されません。
以下で生成されたcontentをチェックしても、漢字だけ消えています。
どの様にすれば良いでしょうか。
よろしくお願いいたします。
use encoding "shift-jis";
LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my %form=('test'=>'漢字123');
my $request = POST('URLリンク(test.test)',[%form]);
my $con=$request->content;
print "test:$form{test}\n";
print "content:$con\n";

出力
test:漢字123
content:test=123

129:nobodyさん
08/03/16 22:26:04
>>128
# use encoding "shift-jis";
# LWP::UserAgent;

130:nobodyさん
08/03/16 23:03:42 eaCmNgRi
はじめましてこんにちは。
自作の掲示板を作ってまして、ある書き込みにレスが付いた場合は
そのレスの数をカウントして画面に表示させる、という事をやってます。
現状はこんな感じです。

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

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

出来れば上記の命令の中だけで完結させたいのですが、無理でしょうか?


131:nobodyさん
08/03/16 23:16:51
>>130
print qq|<span style="color:red;">($res)</span><br>\n| if $res;

Webサイト制作初心者用質問スレ Part 194
スレリンク(hp板)

△▲ WebProg 初心者の質問 Part17 ▼▽
スレリンク(php板)

132:nobodyさん
08/03/17 02:23:56 WVXzjYIy
>>129
ありがとうございました。
ただ、UserAgentは使うのでコメントアウトできません。
EUCでソースを書き、1行目だけコメントアウトで解決しました。


133:nobodyさん
08/03/17 11:04:17 +D1UxdpV
>>126
>>127
ありがとうございました。解決しました。

134:130
08/03/17 21:21:26 iYfDDUad
>>131
ありがとうございました、無事に解決いたしました。
これを応用して、文字のサイズを変える事もやってみましたが上手く行きました!

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

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

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



135:nobodyさん
08/03/17 22:03:37
>>134
>>1-3

△▲ WebProg 初心者の質問 Part17 ▼▽
スレリンク(php板)

CGI: Common Gateway Interface part 13
スレリンク(php板)

136:nobodyさん
08/03/18 10:37:05
>>134
CGIプログラム:バッチ
htmlフォーム:コマンドライン
と考えれば、おのずと答えが見えると思われ。

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

CGIプログラム間でうまくデータを受け渡すには
・セッション(ファイルまたはDB)を利用する
・htmlフォームデータとして生成しPOSTする(値を変えられたくなければHIDE要素にする)
のいずれかになる。

137:nobodyさん
08/03/18 11:07:18
小難しく考えるなよ
stat使えばいいだろ

138:nobodyさん
08/03/18 17:51:36 yz+TlyvN
お世話になっております。

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

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

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

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


139:nobodyさん
08/03/18 18:20:21
>>138
デバッグの基本、$fugaをprintしてみる

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

141:nobodyさん
08/03/18 18:26:00
$hogeか$fugaに数字以外の記号(改行とか)が混じっていると予想

142:138
08/03/18 18:30:10 yz+TlyvN
RESありがとうございますっ

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

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

143:nobodyさん
08/03/18 18:35:55
勘違い。
っつーかデバッグして調べろよ

144:nobodyさん
08/03/18 19:26:34
内容が多いハッシュの値があって、それをデータベースに格納するのに、
そのまま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さん
08/03/18 19:50:13
 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さん
08/03/18 20:25:49
>>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さん
08/03/18 21:49:40
>>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
08/03/19 16:21:54 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
08/03/19 16:23:18 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さん
08/03/19 16:44:42
日本語で

151:nobodyさん
08/03/19 16:56:44
ひどすぎワロタwww

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


153:nobodyさん
08/03/19 17:20:14
> (フォーマットは「名前\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
08/03/19 17:21:25
最後の行 $hash{

155:153
08/03/19 17:23:29
すみません。} を打とうとしたら shift + enter を押して鬱。
$hash{$splitdata[0]} の } が抜けてました。

156:nobodyさん
08/03/19 17:28:37
map { $hash->{$_->[0]} += $_->[7]; } map { chomp; [split(/\t/)]; } @data;

157:nobodyさん
08/03/19 23:15:18
このスレが相応しいかわかりませんが質問させてください。

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さん
08/03/19 23:41:08
>>157
OSの設定はutf-8か、日本語が表示できるシェルを使ってるか

159:nobodyさん
08/03/19 23:45:37
BBSなんだからHTML吐いてるんじゃないの?
それでメタタグの文字コード宣言が違うとか

160:157
08/03/20 12:29:10
おはようございます。
apache を使ってブラウザ上に表示させてます。
メタタグには一応 utf-8 って記入してます。

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


161:nobodyさん
08/03/20 12:38:21
BOM付いてる希ガス

162:nobodyさん
08/03/20 13:03:57
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さん
08/03/20 13:33:56
print "$box[1][0+$i*10]\n";だから。

164:nobodyさん
08/03/20 13:41:13
$box[$i][$j] = $j;

の行の次に

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

入れて表示してみ

165:nobodyさん
08/03/20 13:42:25
$box[$i][$j] = $i * 10 + $j;
期待する動作はこれかな?

166:nobodyさん
08/03/20 13:43:46
>>163
俺には理解不能だ
もうちと、噛み砕いておしえてくれ

167:162
08/03/20 13:44:57
みなさん、レスありがと。
今、飯食ってるから
終わったら試してみる。

168:nobodyさん
08/03/20 13:54:36
>>164
意図した動きになってる。
iもjもちゃんと入れ子になって
ループしている

169:nobodyさん
08/03/20 13:56:38
>>164
あ!ごめんなさい
ちと、おかしい

170:nobodyさん
08/03/20 14:02:32
>>165
そうでした。

171:162
08/03/20 14:03:22
皆様、ありがとうございます。
解決できました。

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

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

173:nobodyさん
08/03/20 15:57:38
またお願いします。

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

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

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

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

174:nobodyさん
08/03/20 16:03:28
webブラウザが半角スペースをつぶしちゃうからとかじゃなくて?

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

176:nobodyさん
08/03/20 16:43:28
ブラウザの仕様

177:nobodyさん
08/03/20 17:00:56
ブラウザで桁をそろえたいなら、表示する部分のフォントを
font-family: monospace;
にしたうえで空白を   にすればいいです。

178:nobodyさん
08/03/20 20:32:02 cqY9pHpE
<pre></pre>

179:162
08/03/20 22:32:36
>>178
それは、クライアントの読み込みが遅くなるので
あきらめました。
 にしました。

180:162
08/03/20 22:33:29
& n b s p ;

に、しました。

181:nobodyさん
08/03/20 23:06:14
「&amp;nbsp;にしました」と書けばok

182:nobodyさん
08/03/20 23:17:39
>>181
むぅ、また、難しいことを言うな。
明日、調べます。

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

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

184:nobodyさん
08/03/21 10:02:10
nbsp;でも詰まるよ
HTMLでalign=rightのほうがいいんじゃない?

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

186:157
08/03/21 11:32:07
>>157 です
自己解決決しました。

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


187:nobodyさん
08/03/21 13:27:45
ふと>>144の解答で疑問に思ったのですが…

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

188:nobodyさん
08/03/21 13:31:00
keys使ってからをvaluesを使うまでにハッシュの内容を変えなかった場合一致するよ

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

190:nobodyさん
08/03/21 21:10:27
>>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さん
08/03/21 21:33:13
>>189
sub conv($){
my $alpha = 'A' ;
$alpha ++ for 1 .. $_[0] ;
return $alpha ;
}
printf "%d\t%s\n", $_, conv $_ for 0 .. 200 ;

192:nobodyさん
08/03/21 21:53:29
191は取り消し

193:nobodyさん
08/03/21 23:12:27
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さん
08/03/22 07:21:59
>>190-193

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


195:nobodyさん
08/03/22 07:40:27
>>190
教えて頂いて申し訳ないですが、
Zの次がBAになってしまいます。
Zの次はAAにしたいのです。

196:nobodyさん
08/03/22 08:02:49
>>195
それだったら191使えば?

197:nobodyさん
08/03/22 08:39:40
>>196

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

198:nobodyさん
08/03/22 08:46:28
>>197
Excel式の26進数もどきだから。

199:nobodyさん
08/03/22 08:53:15
>>198
よく分からんが、ありがと。
しかし、>>191の処理速度は遅いね。

200:nobodyさん
08/03/22 09:14:56
>>193
は、なんかエラーが出て動かないorz

201:nobodyさん
08/03/22 09:21:39
>>190をなんとか改造できないだろうか。
ちと、考えてみる。
でも、自分には無理な気がする。

202:nobodyさん
08/03/22 09:22:10
>>191は、26進数じゃない。使うな。
10進数676は、26進数では、
676/26 = 26 余り0
26/26 = 1 余り0
で、1 0 0(BAAが正しい)が、
>>191だとZAになる。

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



203:nobodyさん
08/03/22 09:38:25
>>202

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

204:nobodyさん
08/03/22 09:44:17
>>193

zの次がbaになるorz

205:nobodyさん
08/03/22 09:45:28
>>203
202=191=193=俺なので気にするな。

206:nobodyさん
08/03/22 10:17:00
Math::BaseCalcモジュールでも使えば良いんでないか?

207:nobodyさん
08/03/22 10:39:29
>>206
まず、インストールのいかたが分からないので、
そこから、調べてみる

208:nobodyさん
08/03/22 10:39:45
インストールのしかた

209:nobodyさん
08/03/22 10:54:33
ppm install Math-BaseCalc

210:nobodyさん
08/03/22 10:57:42
インストールできました。

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

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


211:nobodyさん
08/03/22 11:22:42
当り前だろ、A=0 B=0扱いなんだから
おまいがやりたい事は26進とは言わない

212:nobodyさん
08/03/22 11:23:35
B=1だ orz

213:nobodyさん
08/03/22 11:32:56
うぅーん、そうなると
私が意図したものは
どう書けばいいのだろうか???

214:nobodyさん
08/03/22 12:54:31
出来た!実に単純だった。

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さん
08/03/22 13:06:15
間違えた、こうだ。

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さん
08/03/22 14:55:10
ブルートフォースアタックに使えそうなコードだなw


217:138
08/03/24 22:18:54 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さん
08/03/24 22:49:38
レスあっただろ

219:nobodyさん
08/03/24 22:52:29
>>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さん
08/03/24 23:29:25
>>219
その @arrangeData を >>217 のコードに食わせても
 name1 : 11
 name2 : 22
 name3 : 0
 name4 : 44
になるんよね。"name3\tぱ\t" にしたりしても。

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

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


222:nobodyさん
08/03/26 01:00:59
sort { $hash{$b} <=> $hash{$a} } keys %hash;

223:nobodyさん
08/03/26 01:01:47
>>221
質問が漠然とし過ぎてるんで、この辺一通り読んでから来て。
URLリンク(www.kt.rim.or.jp)
URLリンク(perldoc.jp)

224:nobodyさん
08/03/26 01:05:19
>>222さんのでわかりました!
>>223さんのも読んでおきます!
どうもでした!!

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

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

226:nobodyさん
08/03/26 14:32:04
そんな需要は稀なんだろ
一旦保存してから読み直せば?

227:nobodyさん
08/03/26 14:47:06
>>225
httpd が受け取る/受け取らないという話でなく、
プログラム中の処理の流れでという意味なら
URLリンク(perldoc.jp)
の「ファイル・アップロード・フィールドの作成」の項

228:nobodyさん
08/03/26 22:35:17 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は空白です。

URLリンク(q.hatena.ne.jp)
とかを見るとどう見てもこれで正しいようにしか思えないのですが何故?


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

229:nobodyさん
08/03/26 22:45:43
同じ変数でも名前空間が異なれば別物

230:nobodyさん
08/03/26 22:57:38
>>228
<q cite="URLリンク(perldoc.jp)">
my はリストアップされた変数を、囲っているブロック、ファイル、eval の中で
ローカルな (レキシカルな) ものにします。
</q>

URLリンク(www.kt.rim.or.jp)

231:nobodyさん
08/03/26 23:12:52
my と use strict を取っ払ってみると print されたり。
変数の局所化とか strict とは無縁になるけど。

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

232:nobodyさん
08/03/27 01:07:20
local

233:nobodyさん
08/03/27 01:23:34 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使うべし。
URLリンク(memo.majide.com)

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

234:nobodyさん
08/03/27 10:30:16
>>233
説明で「 -> 1」とかを使ったら混乱するだろjk

235:nobodyさん
08/03/27 12:35:04
正直すまんかった
234が責任を持って書き換えます。おながい。

236:nobodyさん
08/03/27 12:36:10
>>228
こうするのさ。

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

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

237:nobodyさん
08/03/27 16:59:46
our wwwwwwwwwwwwwwwwwwwwwwwwww

238:nobodyさん
08/03/27 19:04:51
○|_|| ̄ wwwwwwwwwwwwwww

239:nobodyさん
08/03/27 22:17:48
oL/

240:228
08/03/27 23:49:16 OO8NUyXN
>>229-236
さっぱりわからんがサンクス。調べてみる
iniファイルやPHPみたいに簡単に取得できる方法はないのかのう・・・

241:nobodyさん
08/03/27 23:56:27
>iniファイルやPHPみたいに簡単に取得できる方法
だからモジュール紹介されてるやんけwww

242:nobodyさん
08/03/28 00:17:56
ワロタ

243:233
08/03/28 00:26:56
>>240
感想でいいからくれ
何がさっぱりわからんと思ったか書いてくれれば分かりやすくもういっかい書くよ。

1. リンクを開いたと思うんだが、何が意味不明だと思った(全部ってのはなしで)
2. 何を作っててプログラム暦何年か教えてくれ。

スレ汚しならすまん。ちょっと個人的に技法よりも心理障壁に興味がある。

244:nobodyさん
08/03/28 10:02:51
新人教育かw

245:nobodyさん
08/03/28 15:01:30 jpsDmJfA
ログに保存されている日付を以下のように整形するにはどうしたらいいんでしょう?

2008/03/28(金) 09:30:08

08/3/28 9:30


246:nobodyさん
08/03/28 15:33:52
>>245
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');

247:nobodyさん
08/03/28 15:36:13
use strict;

my $orgdate = '2008/03/28(金) 09:30:08';
my @splitdata = $orgdate =~ /(\d{2})+/g;

printf("%02d/%02d/%02d %02d:%02d:%02d", @splitdata);


248:nobodyさん
08/03/28 15:46:09
s{\d\d(\d\d/\d+/\d+)[^ ]+( \d+:\d+):\d+}{$1$2};

249:nobodyさん
08/03/28 15:48:45
指定がないけど %02d/%d/%d %d:%02d を期待されてそうな気がする

250:nobodyさん
08/03/28 15:57:20
なるほど。

s{\d\d(\d\d)/0?(\d+)/0?(\d+)[^ ]+ 0?(\d+):(\d+):\d+}{$1/$2/$3 $4:$5};

251:nobodyさん
08/03/28 16:45:45
my @splitdata = $orgdate =~ /(\d{1,2})+/g;
my $datetime = sprintf("%02d/%d/%d %d:%d:%d", @splitdata);


252:nobodyさん
08/03/28 16:49:23
間違えた

my @splitdata = $orgdate =~ /(\d{1,2})+/g;
my $datetime = sprintf("%02d/%d/%d %d:%d", @splitdata);
print $datetime;

253:nobodyさん
08/03/28 16:59:35
2008/03/28(金) 09:30:08から08/3/28(Fri) 9:30にするにはどうする?



254:nobodyさん
08/03/28 17:35:24
>>247-252
もはや、知らない奴が見たら暗号でしかないなw



255:nobodyさん
08/03/28 19:09:17
javascriptのプログラムをPerlに移植しようとしていて、複合代入演算子の挙動が違うのでとまどっています。
例えばjavascriptで
var c=1;alert(c=c+(c*=10)+(c*=100));
は1011
Perlで
my $c=1;print($c=$c+($c*=10)+($c*=100));
は1020
になります。
そこで、この問題について載っているサイトがあれば教えてください。


256:nobodyさん
08/03/28 20:04:35
式の途中で値を変えるやり方がまずいとは思うけどね

257:nobodyさん
08/03/28 23:58:05
加算の評価順は定義されてないという事を知らずに
> var c=1;alert(c=c+(c*=10)+(c*=100));
こう書くのはクズグラマー。

258:nobodyさん
08/03/29 03:54:49
>>255
URLリンク(www.st.rim.or.jp)

259:nobodyさん
08/03/29 04:33:29
>>253
年を二桁にしたら100年後に困るぞ!

260:nobodyさん
08/03/29 08:45:59
>>253
s/^\d\d//;
s/^(\d\d\/)0/$1/;
s/金/Fri/;
s/:\d\d$//;

261:nobodyさん
08/03/29 14:59:25
>>259
19xxから20xxに変わったが、2桁で困ってないので100年後も同様に困らない。

262:nobodyさん
08/03/29 17:09:47
>>259
百年後なんて俺等死んでるから気にする必要ないw

263:nobodyさん
08/03/29 17:56:41
そういう屑のせいで困る人たちもいるわけだ

264:nobodyさん
08/03/29 19:27:22
>>262
医学の進歩は目覚しいから、お前のような底辺奴隷はむしろ死ねないかもしれない。

265:259
08/03/30 22:02:27
ジョークを真に受ける馬鹿がこんなに多いとは・・・

266:nobodyさん
08/03/30 23:27:37
>>265
更にジョークを真に受けた馬鹿の登場ですか?


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4937日前に更新/211 KB
担当:undef