Perlコーディング初心者質問スレ Part 40
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/01/27 18:08:42ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0553nobodyさん
05/02/20 19:05:02ID:???0554nobodyさん
05/02/20 19:06:12ID:???@url = map{ $_->[0] }
sort{ $a->[1] <=> $b->[1] }
map{ m/(\d+)\.jpg$/; [$_, $1] } @url;
とか。
>>549
use FileHandle;
my $fh = FileHandle->new("hoe.txt") or die $!;
my $fh;
open($fh, "hoe.txt") or die $!;
# これは古いPerlと互換がないかも。
これで変数に入れられるから、オブジェクトでも扱える。
(クラスメンバなら、ファイルハンドルのままでも構わないのでは。)
0555549
05/02/20 19:45:08ID:???0556nobodyさん
05/02/20 20:14:16ID:O52bAFUwfor(1..100){}
などとできますが、
飛び飛びの連続値を指定する場合はどうすればいいんでしょう?
for(1.20,30..100){}
とかじゃ無理だし、なにか上手いやり方はありますか?
0557nobodyさん
05/02/20 21:01:53ID:???1と20の間に . が2個あれば行くぞ。
0558nobodyさん
05/02/20 21:04:25ID:O52bAFUwうわ、ほんとだ。
自分の場合は間に1つだけの要素を挟んだりするんですが、そのばあいは
for(1..3, 5..5, 7..9){}
こんな感じですかね。
0559nobodyさん
05/02/20 21:06:11ID:???0560nobodyさん
05/02/20 21:08:32ID:O52bAFUw0561nobodyさん
05/02/20 22:23:17ID:???if ($pid= fork){
# ここは親プロセス
}elsif (defined $pid){
# ここは子プロセス
}elsif ($! =~ /No more process/){
# A
}else {
}
上記のようなソースをたまに見かけます(らくだ本など)が、A部分には
子プロセスが作れなかったのに何がくるのでしょうか?
わたしが思うに、子プロセス生成に失敗したので結果的に親プロセス部分
しか処理されないような感じがするのですが・・・。
0563nobodyさん
05/02/20 22:51:31ID:BvAf0Y1w$hoge(perl)の数値(文字列)をそのまま hoge(flash)に。
よろしくお願いしますm(__)m
0564nobodyさん
05/02/20 23:12:34ID:BvAf0Y1w0566nobodyさん
05/02/21 01:37:00ID:???0567nobodyさん
05/02/21 02:33:04ID:ZzrL/Ht5print等で、
1. print 'あ '.(ドット)"$hoge\n";
2. print 'あ ',(カンマ)"$hoge\n";
ドットを使うのと、カンマを使うのとでの違いはありますか?
0568nobodyさん
05/02/21 04:57:26ID:???0569nobodyさん
05/02/21 10:51:03ID:???SQL文はわかってるのですが、どう受け取ればいいのか;
my $value = $sth->fetchall_arrayref;
これだと一応受け取れますが、フィールド名のハッシュになってないので扱いにくいです。
しかしハッシュ系は
my $value = $sth->fetchrow_hashref;
しか見つけられなかったのですが、無理なのでしょうか。
このやり方は1レコードだけなのですが・・・
0570nobodyさん
05/02/21 11:09:40ID:???これの文字コードをjcode.plを使って変える時って
foreach (keys %$hash) { jcode::convert(\$hash->{$_},"sjis")}
で一応できましたが、なんか変な感じ。
そもそもリファレンスさえ渡したら向こうで中身を書き換えてくれるんですよね。
なので渡す時にデリファレンスしてからリファレンスを作るのって変。
ハッシュリファレンスの中身をjcode.plに効率よく渡す方法ってあるんでしょうか?
0571nobodyさん
05/02/21 11:38:37ID:???「ハッシュ全体へのリファレンス」と「ハッシュの個々のエントリへのリファレンス」は
全く無関係な別物だから、仕方ないだろう。そういうものだ。
0572nobodyさん
05/02/21 11:43:32ID:???map内で配列に手を加えればいいけどね。
いい例なのがこれ。
map {jcode::convert(\$_,"euc")} @$arrayref
あ、これも同じデリファレンス→リファレンスだなw
0573nobodyさん
05/02/21 14:03:46ID:???my %hash = (a => "あいうえお" , b=> "かきくけこ");
foreach (keys %hash) {jcode::convert(\$hash{$_},"sjis")}
0575nobodyさん
05/02/21 14:43:19ID:???あ、いや、>>570がjcode::convertにハッシュリファレンスを渡すためにわざわざ
最初の段階でリファレンスにして無意味だなと思っているみたいだったんで
だったらハッシュをわざわざリファレンスにしなくていいんじゃないと思っただけ。
0576nobodyさん
05/02/21 14:44:54ID:???「jcode::convertにハッシュ要素のスカラーリファレンス」と読み替えてくれ。
0577nobodyさん
05/02/21 15:16:50ID:???この$valueの中身を書き換えずに_を-に変えて出力するにはどうすればいい?
print ....
まったくわからないorz
0578577
05/02/21 15:28:46ID:???print "content-type:text/html;charset=euc-jp;\n";
print "\n";
my $value = qq|aiu_oiy|;
print qq|${sub{$_[0] =~ s/\_/\-/g; print $_[0]}->($value)}あいうえお|;
print "<br>";
print "aiu",$value;
これやったら何故か「あいうえお」すら表示されない・・・
しかし置換後の文字列の出力はしっかりできている。
一体どういうことなんだろう。無名ルーチンに異次元につれてかれてSTDINへの出力を
したくてもSTDINがどこにあるか分からないとか?
0579577
05/02/21 15:31:51ID:???print "\n";
my $value = qq|aiu_oiy|;
print qq|@{[sub{my $a = shift; $a =~ s/\_/\-/g; $a}->($value)]}あいうえお|;
print "<br>";
print $value;
これでできたけどなんかなぁ。
まあいいけど>>578はなんでその後が表示されないんだろ?
0580nobodyさん
05/02/21 17:41:26ID:???$in{'ngword'} =~ s/\n/\'\,\'/g;
print BS <<"EOM";
# NGワード
\@ngword= ('$in{'ngword'}');
EOM
として、
ファイルハンドルBSに
@ngword = ('馬鹿','死ね,'あほ');
と書きたいのですが、
・"鹿"と"'"の間
・"ね"と","の間
にメモ張で見ると文字化けしているような
文字("■"を小さくしたようなもの)、Perl編
集用で使っているエディタだと改行が入っ
てしまいます。
なぜなのかわかりません。。。
0581nobodyさん
05/02/21 19:51:45ID:???, は、リスト評価。 . は、文字列を結合してからスカラー評価。
, と . では、演算子の優先順位が違うので、計算式が入る場合は注意。
>>577
print join( '-', split( '_', $value ) );
とか
print "$1-$2-$3" if $value =~/([^_]+)_([^_]+)_([^_]+)/;
とか
0583nobodyさん
05/02/21 20:08:42ID:???my $value = 'oaoa_aaaa_test';
(my $tmp = $value) =~ tr/_/-/;
print "$value => $tmp\n";
sub _toh { (my $str = shift) =~ tr/_/-/; $str }
print "$value => ${\_toh($value)}\n";
print join '-', split '_', $value;
print "$value => ${\ (sub { (my $str = shift) =~ tr/_/-/; $str })->($value) }\n";
local $" = '';
print "$value => @{[ map { tr/_/-/; $_ } split //, $value ]}\n";
0585nobodyさん
05/02/21 20:12:54ID:???http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0586nobodyさん
05/02/21 20:37:31ID:???@_ は関数内で暗黙のlocalだけど、@_の各要素である$_[0],$_[1],...等は、
呼出し元の引数の別名だから、上書きすると、呼び出し元で引き数として渡した
対応する変数の中身が書き変るよ。
好きなのどうぞ
print qq|${\sub{$_[0]->[0] =~ s/_/-/g;$_[0]->[0]}->([$value])}あいうえお|;
print qq|${\map{$_->[0] =~ s/_/-/g;$_->[0]}[$value]}あいうえお|;
print qq|${\do{(local $_=$value) =~ s/_/-/g;$_}}あいうえお|;
0587nobodyさん
05/02/21 21:46:42ID:LbE3SevLそれをデリファレンスしながら受け取りたいんですが不可能ですか?
my (%a,%b) = map{%{$_}}&hoge;
こんなことを考えてみたけど、よく考えたら全くダメだった;
0588nobodyさん
05/02/21 21:49:32ID:???Group\Apache\htdocs\test.cgi line 353.
こんなエラー内容なんだけど、誰かわかる?
^@こんな文字列検索しても出てこないんだよね。ライン付近を見ても異常が見当たらない。
0589nobodyさん
05/02/21 21:51:30ID:???0590nobodyさん
05/02/21 21:56:01ID:Mewlqio00591587
05/02/21 22:15:40ID:LbE3SevLこれで一応できました^^
0593nobodyさん
05/02/21 23:42:47ID:???ほんとはこういう必殺技があるんだけど型グロブが理解できなければ使わないほうがいい。
(*a,*b) = hoge();
0594nobodyさん
05/02/22 11:45:02ID:???いきなり
my %a;
for (1..10){
$a{a} += 2;
}
とかやっても失敗しなかったのですが、偶然ですか?
my %a = (a => 0);
とはじめにしておいたほうが当然無難でしょうけど、なんか面倒なんですよね。
面倒でもやっておかないと失敗することはあるんでしょうか?
0595nobodyさん
05/02/22 12:06:49ID:xOztdvV5よし行く象を最後にすべきだろう
0596nobodyさん
05/02/22 12:07:19ID:???0597nobodyさん
05/02/22 13:16:01ID:???未定義値を論理評価すると偽として解釈される。
未定義値を数値評価すると0として解釈される。
未定義値を文字列評価するとヌル文字列として解釈される。
未定義値の配列やハッシュは空要素として解釈される。
配列やハッシュの存在しない要素を参照すると値は未定義値である。
my指定した変数は、明示的に初期化しなければ未定義値で初期化されることが保証されている。
これを理解していれば>>594の場合で明示的に初期化する必要はない。
0598nobodyさん
05/02/22 14:13:34ID:cioenldLmy %hash = ( a => 1 , b => {c => 1} );
&test({ b => {%{$hash{b}}} });
sub test{
my %hash = %{$_[0]->{b}};
$hash{c}++;
print $hash{c},"<br>";
}
print $hash{b}->{c};
これリファレンスの仕組みを理解するのに書いたんですが、
グローバルな$hash{b}にはハッシュリファレンスが入ってます。
それをルーチンに渡す時にそのまま渡すとルーチンないの作業によっては
グローバルな変数の中身に影響がでますよね。
そのため今までは
&test({
b=>{%{$hash{b}}}
});
としていました。しかしb=>\%{$hash{b}}でやっても何故かルーチンないでの作業が
グローバル側に影響を及ぼすことはありませんでした。
どうしてなのでしょうか?
jcodeなどに代表されるように通常は\これで作ったリファレンスを渡すと渡し側のものを
直接いじるのと同じ行為になると思ってたのですが・・・
ハッシュの場合は違うのか、それともデリファレンスしたものだから違うのかな?
0599nobodyさん
05/02/22 15:56:51ID:???my %hash = %{$_[0]->{b}};
で新しく作った%hashにコピーされてるから、
$hash{c}++;
はコピーされた方が変わるだけ。
元のプログラム全体については何をしたいのか意図がよくわからんので、
エスパー回答者にお任せします。
0600598
05/02/22 17:37:34ID:cioenldLそういえばそうですね;
ではやはり\を使って渡すのは危ないということですね。
元のプログラムはたんなるリファレンスのテストです。
0601nobodyさん
05/02/22 17:44:16ID:???おかしなところがあったら教えてください
メイン
#!/usr/bin/perl
@port = (80,1080,3128,8000,8080,8888); # チェックするポート番号
PrinthtmlHeader(); #htmlのヘッダーと<BODY>まで出力する関数
foreach(@port){
$result=IsOpenPort($_);
print $result;
}
PrinthtmlFooter(); #htmlフッタ出力
exit;
0602nobodyさん
05/02/22 17:45:28ID:iWUZ4gT8sub IsOpenPort
{
my ($port) = @_;
my ($inad,$scad);
eval{
$SIG{'ALRM'} = "hAlarm"; # ハンドラ設定
alarm(5); # timeout5秒に
use Socket;
socket(SOCK,PF_INET,SOCK_STREAM,0) || die("Socket Error\n");
$inad = inet_aton($ENV{'REMOTE_ADDR'}) || die("Iaddr Error\n");
$scad = pack_sockaddr_in($port, $inad);
connect(SOCK, $scad) || die("Connect Error\n");
select(SOCK);
$|=1;
select(STDOUT);
die("OUT!!!\n");
close(SOCK);
alarm(0);
};
if ($@ =~ /OUT/){ return 1; }
else{ return 0; }
}
#---------アラームシグナルハンドラ
sub hAlarm
{
die("Alarm...\n");
}
0603601
05/02/22 17:48:44ID:???usen-219x123x129x154.ap-us.usen.ad.jp:3128
この串でアクセスしてみると
001000
と出力されれば正常なのですが
100000と出力されます
proxy.or3.marketscore.com:8000
この串でも100000と出力されます
0604nobodyさん
05/02/22 18:16:06ID:???まず結果を1と0に丸めるのをやめて、だめな時はどこで
ひっかかってるかをきちんと調べるところからはじめる
べきだな。あとシステムコール類がエラーしたときは
ちゃんと$!を表示すること。
具体的にどこでどういう状況になってるかを特定してから
出直してください。
0605nobodyさん
05/02/22 19:28:41ID:???# 呼び出し元をわざと中間変数を使って分解してみよう!
my %hash_c = ( c => 1 );
my %hash = ( a => 1, b => \%hash_c );
my %hash_b = %{$hash{b}}; # %hash_b = %hash_c; (1)
my %hash_arg = ( b => \%hash_b );
&test( \%hash_arg );
# つぎにsub test()を中間変数を使って分解してみよう!
sub test{
my $arg = $_[0]; # $arg = \%hash_arg;
my %hash = %{ $arg->{b} }; # %hash = %{ $hash_arg{b} }; --> %hash = %hash_b; (2)
$hash{c}++;
print $hash{c},"<br>";
}
# サブルーチンに引数を渡す前(1)も、渡した後(2)もコピーになってるでしょ。
# 呼出し元の%hashのリファレンスは、なにも渡ってないってことね。
0606nobodyさん
05/02/22 23:11:35ID:???/\b$hoge\b/
とやると、
$hoge = a の時だと
a~no や hu~a 等を含む文も引っかかってしまい、
$hoge = trouvero~ の場合
逆にどの文も引っかかってくれなかったりしてしまいます。
\bの仕様上、仕方ないのかもしれませんが、何か巧い方法はないでしょうか?
0607nobodyさん
05/02/22 23:19:59ID:???0608nobodyさん
05/02/22 23:40:27ID:???ほい。
/^$hoge[^a-zA-Z\d~]|[^a-zA-Z\d~]$hoge[^a-zA-Z\d~]|[^a-zA-Z\d~]$hoge$|^$hoge$/
ただ、このやりかたはバックトラックが発生するからこっちがいいかもしれん
/^$hoge[^a-zA-Z\d~]/ || /[^a-zA-Z\d~]$hoge[^a-zA-Z\d~]/ || /[^a-zA-Z\d~]$hoge$/ || /^$hoge$/
0609nobodyさん
05/02/22 23:47:16ID:???ポルトガル語に使う文字を定義して、?<!と?!を使うとか。
my $portuguese = "[a-z~]";
print "sim" if ($str =~ /(?<!$portuguese)$hoge(?!$portuguese)/i);
0610nobodyさん
05/02/22 23:54:15ID:???でよさげ。
0611nobodyさん
05/02/23 00:48:31ID:???ありがとうございました。
なんとか形にすることができました。
初めてperlに触れてみましたが、正規表現とかややこしいですね。
精進します。
0612nobodyさん
05/02/23 10:07:36ID:???できないのでしょうか?
print map "$_[0] + $_[1] = ",
@a
@b
こういうときにやりたいのですがl
0613nobodyさん
05/02/23 10:37:22ID:???@{[sub{my $str = shift; $str =~ s/\r\n|\r|\n/<br>/g; $str }->($form{test})]}
|;
こういうことがしたいのですがエラーになりました。
原因は|です。qq[]などでやれば問題ないのですが、そうはしたくありません。
大元を変えると他にも影響がでそうなので;
qq||のなかの正規表現でor演算子的に|を使うにはどうすればいいでしょうか?
0614nobodyさん
05/02/23 10:39:45ID:???二つでいいならハッシュにしたり。
それ以上の複数なら
for(my $count = 0; $count < ?? ; $count++){
$a[$count], $b[$count], $c[$count];
}
とか?
mapは無理だけど、自分でそんな関数は作れる。
sub (&\@\@){
my $code = shift;
my $a = shift; #ん?大丈夫かこれ??
my $b = shift;
@a = @$a;
@b = @$b;
for(なんたらかんたら;略;略){ #使用の詳細が不明なので略
略;
}
}
みたいなイメージで。
0615nobodyさん
05/02/23 10:44:07ID:???>>613
>大元を変えると他にも影響がでそうなので;
いみふ(ry
perlは処理の優先的にまず、区切り文字を探します。
0617nobodyさん
05/02/23 13:04:52ID:???$sth = $dbh->prepare(q|select * from test_table where hoge=1|);
$sth->execute;
こういうSQL文を発行して
%hash = %{$sth->fetchrow_hashref};
これでそのレコードの全コラムを取得しようと思ったのです。
しかしwhereで引っかかるのがないときに、
%hash = %{$sth->fetchrow_hashref};
これがエラーの原因になります。
DBIはmysqlから「Empty set」を返された時にはfetchrow_hashrefに何も入れないのでしょうか?
それとEmpty setが返されたのかを知るすべはありますか?
0618nobodyさん
05/02/23 13:49:08ID:???ほれ!
print qq|
@{[sub{my $str = shift; eval qq[\$str =~ s/\\r\\n\|\\r\|\\n/<br>/g]; $str }->($form{test})]}
|;
0619nobodyさん
05/02/23 13:53:36ID:???ほれ!
@hoge = sub{map{$_[0]->(map{shift@$_}@_[1..$#_])}0..$#{(sort{@$b<=>@$a}@_[1..$#_])[0]}}->( sub{$_[0]+$_[1]+$_[2]}, [@x], [@y], [@z] );
0622nobodyさん
05/02/23 14:01:11ID:???よくつかう処理はサブルーチンを用意すること。
変数展開の技巧や無名サブルーチンやリスト関数の技巧などは、理解できない内は使わない。
素直に書いた方が簡単な場合もある。
ただ、知ってて使う分には止めない。
0624nobodyさん
05/02/23 14:56:16ID:???sub amap(&@){
my $code = shift;
my @array_ref_list = @_;
@array_ref_list = sort{@$b <=> @$a} @array_ref_list;
my $max_num = @{$array_ref_list[0]};
my @result_list;
for(my $i=0; $i<$max_num; $i++){
my @arg_list;
foreach my $a_ref(@array_ref_list){
push @arg_list, $a_ref->[$i];
}
my $result = $code->( @arg_list );
push @result_list, $result;
}
return @result_list;
}
@x = map{$_*1}1..10;
@y = map{$_*10}1..9;
@z = map{$_*100}1..5;
@hoge1 = amap{ $_[0]+$_[1]+$_[2] } \@x, \@y, \@z;
@hoge2 = amap{ 2*($_[0]-$_[1]) } \@z, \@y;
@hoge3 = amap{ $_[1].$_[0].$_[1] } ['a'..'z'], [reverse 'A'..'Z'];
0625617
05/02/23 15:04:23ID:???excuteの返りを変数に代入して、その帰りが0ならって感じでした。
0626nobodyさん
05/02/23 15:58:49ID:???マジレスするとこうやね。
print qq|
@{[sub{my $str = shift; $str =~ s/\r\n\|\r\|\n/<br>/g; $str }->($form{test})]}
|;
ダブルクォート内のブロック処理は、ブロック内がコンパイルされる前に終端文字のエスケープだけ解除されるから
ブロック内の処理に終端文字が出てくるときは、'\' で普通にエスケープすればよい。
だからこんなこともできる。
print qq|
@{[sub{my $str = shift; $str =~ s/\r\n\|\r\|\n/<br>/g; qq\|<!--$str-->\| }->($form{test})]}
|;
もちろん読みにくいから終端文字を変えるなり、ヒアドキュメントを使うなりするのがいい。
0627nobodyさん
05/02/23 16:00:36ID:???何とかしてメール送りたいんですが・・・
0628nobodyさん
05/02/23 16:09:38ID:???Perl なら Net::SMTP モジュールを入れることで sendmail が無くてもメール送れる。
モジュールが使えない場合でも、
自分で SMTP 喋るようなスクリプトを Socket 使って書けば、メール送れる。
ただしサーバの出のポートが閉じてる場合は何やっても無駄だがな。
0630nobodyさん
05/02/23 18:32:31ID:8RQQ1GXEその辺りの知識が足りません。
それで、とりあえず誰かが作ったエスケープが既にしっかりできてるCGIを見て
勉強しようと思います。
ちゃんとエスケープができてるものって探しようもないので、そこらへんを理解してる方で、
これなら勉強にもってこいってcgIを教えてくださいm(_ _)m
0631nobodyさん
05/02/23 18:39:39ID:???http://www.google.co.jp/search?hl=ja&inlang=ja&q=perl+%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
0633未承諾広告※ ◆TWARamEjuA
05/02/23 20:27:19ID:???eval {
my @ret_value;
:
:
return @ret_value;
};
こういう書き方はよくするけれども、、、
0634nobodyさん
05/02/23 21:10:15ID:???これなんですけど、&をつける場合とつけない場合の
違いが分かりません。でも、結局&をつけた場合とつけない場合
をprintで調べたら同じ値なのにどうして、&をつけるタイプの人と
つけないタイプの人がいるのか分かりません。
何か&に特別な意味はあるんでしょうか?
0635nobodyさん
05/02/23 21:29:59ID:???print map{ "$a[$_]+$b[$_]=" } (0..$#a);
>>634
内部的に
sub AF_INET(){ 2 };
こんな感じで定義されていると思ってちゃぶ台。
だから、
print AF_INET();
print &AF_INET;
でもOK。
0636nobodyさん
05/02/23 22:02:14ID:???どうも、返答ありがとうございました。
AF_INETって定数じゃなくてサブルーチンだったんですか。
なるほど。よく分かりました。
0637630
05/02/24 10:32:12ID:Q/hMlpe6???
どういう意味ですか?
私はHTMLレベルのエスケープなんて聞いてませんよ。
それともフォームメールに必要なエスケープがHTMLレベルだとでも思ってるのでしょうか。
0638nobodyさん
05/02/24 10:59:43ID:???や特殊な書式で書いてました。
しかしそれだと私しか理解できず、他人に使わせるのにいちいち書式のマニュアルを作成しないと
いけませんので、こんど全てをメジャーなものに変えようと思います。
一番いいのはexcelのcsv形式かなと思うのですが、どうですか?
ほとんどexcelを触ったことないので、いわゆるHTMLのthにあたるものができるのか
わからないのでまだ微妙ですが。
アドバイスお願いします。
0640nobodyさん
05/02/24 11:04:06ID:???Tomcat の設定ファイルみたいな感じで
0641nobodyさん
05/02/24 11:05:15ID:???「スレ違いだから自分でググって調べなさい」という皮肉だね、たぶん。
Perlのコーディングに直接にはなんの関係もない話をレスしないでねって暗に言っていると察っするが吉。
0642630
05/02/24 11:40:08ID:Q/hMlpe6さすがにここまで見当違いなレスをされるとあきれるね。
>>639
用がないならレスはしないでいいよ。暇だからって八つ当たりはやめとけ。
>>641
そうなんですかね。多分>>631は問題が何か理解できなかっただけでしょ。
HTMLレベルで考えてるとしか思えないね。
0643638
05/02/24 11:43:40ID:???何故かShift_JISのファイルをそのままパースできてるみたいですが、
これってEUCでもいいんですよね?
一応csvファイル事態はShift_JISですが、読み込んだときにEUCに変換して扱いたいんです。
パースして$csv->fieldsでとる前に変換はしておいたほうが回数も少なくて済みますし。
書き込み時には又、Shift_JISにしますけど。
0644631
05/02/24 11:45:55ID:???\ __ /
_ (m) _ピコーン
|ミ|
('A`) 体技:スルー!
ノヽノヽ
くく
0645638
05/02/24 11:50:40ID:???my $csv = new Text::CSV_XS({ binary => 1 });
open FH,"test.csv";
my @array;
while (<FH>){
jcode::convert(\$_,"euc");
$csv->parse($_);
push @array,$csv->fields;
}
close FH;
こういう$_これをjcodeに渡して変換してもらうのってありですか?
一応動くのですが、行儀悪い行為になるんでしょうか?
なんか<FH>を直接書き換えているみたいで怖いんですが;
0647nobodyさん
05/02/24 12:29:11ID:???正直「エスケープ」というのがいまいちよくわからない。
open(PIPE," | sendmail $address") するときに $address の中に shell のメタ文字が
という対 shell サニタイズの話なのか?
俺がメールフォーム作るなら、そういう問題を考えなくて良いように Net::SMTP を使う。
もちろん、宛先アドレスが valid かどうかというのは検証するし、
Subject とかのマルチバイト文字は MIME エンコードするけど、
それって「エスケープ」の話じゃないよな。
0648nobodyさん
05/02/24 12:33:23ID:???関東と北陸、近畿に春一番
...2005/02/22(火) 21:07 [Windows] 無題
あいうえお
かきくけこ
...2005/02/21(月) 23:15 [Perl] 勉強
ああああ
ええええ
上のようなテキストから、
指定した文字列が含まれる(行頭が...の)タイトル行と、
その本文(内容)を抽出して出力するスクリプトを作りました。
動作しているのですが、
このようなwhile (<>) {の中にさらにwhile (<>) のある使い方が
書籍などを見ても見つからず分からないのですが、誤った使い方ですか?
もし間違いなら、どのような処理にすれば良いのか教えて下さい。
0649648
05/02/24 12:33:59ID:LxzKNGW5while(<>){
if(/^\.\.\..*\[$sample\]/){ # もし行頭に...がある場合
$title=$_;
print "$title"; # タイトル行の出力
while(<>){
if(!/^\..*/){ # もし行頭に.が無い場合
$body=$_;
print "$body"; # 本文の出力
}
if(/^\..*/){ # もし行頭に.がある場合
last;
}
}
}
}
0650630
05/02/24 13:15:43ID:Q/hMlpe6open MAIL,"| /usr/sbin/sendmail -t";
print MAIL 'To: '.$form{to}."\n";
print MAIL 'From: '.$form{from}."\n";
print MAIL 'Subject: '.$form{subject}."\n\n";
print MAIL $form{body};
close MAIL;
こういうときに@form{qw/to from body/}に含まれてる危険な文字をエスケープするって
意味ですが、そもそも始めはフォームメールにXSS対策的なエスケープが必要だとは
思っていませんでした。
メールのヘッダである@form{qw/from to/}の値には改行を許してはいけない程度でしか
考えていませんでした。
その後、人にフォームメールを作るならエスケープのために相当な知識が必要だといわれました。
なのでそうなんだぁと思って、今回まずはまともなフォームメールを教えてもらって、
それを見ながらどういう文字に気をつければいいかを勉強しようかなと。
ネット上でsendmail エスケープで見てもイマイチ関係のありそうなのが出てこないんですよね。
sendmail系で出てくるのはメールアドレスの正規表現やソレヨウノモジュール。
ついでにsubject用のエンコード方法あたりがほとんどですね。
>open(PIPE," | sendmail $address") するときに $address の中に shell のメタ文字が
>という対 shell サニタイズの話なのか?
そうだと思います。そんな感じで言われました。ただUNIX系の話ですか?と聞いてから
返事がないのでよくわかりません。
0651630
05/02/24 13:18:55ID:Q/hMlpe6CGIでエスケープすべき文字についてお尋ねします。
sendmailでメールを送るときに本文やToをユーザが入力した内容に
する場合はどういう文字をエスケープすればいいでしょうか?
743 :nobodyさん :05/02/10 16:59:49 ID:???
>>742 おぼえること大杉
744 :742:05/02/10 18:59:35 ID:???
>>743 Toにクエリを埋め込む時もメールのヘッダーが終わった後の本文でも 同じエスケープではないですよね?
とりあえず現状ではToの方は\だけエスケープしてます。 本文のほうは何もしてないままです。
UNIXのコマンド文になるようなのを気をつけなければならないのでしょうか?
745 :nobodyさん :05/02/10 22:07:44 ID:???
>>744
もしお前が釣りなら、俺を感動させたことを誇っていい。お前には才能がある。
もし本気でメール出すCGIを作るつもりなら、かなり道は険しいぞ。
746 :nobodyさん :05/02/10 23:14:42 ID:???
>>744
つ[ ttp://www.ipa.go.jp/security/awareness/vendor/programming/ ]
とりあえずここでもどうぞ これ読んだ上でsendmailに特化した話
■ このスレッドは過去ログ倉庫に格納されています