Perl 初心者コーナー Part23
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/05/16 11:18ID:zDRBc/j4【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0011nobodyさん
03/05/16 13:58ID:???Perlについての質問箱 5箱目
ttp://pc2.2ch.net/test/read.cgi/tech/1053053082/
CGIではないPerlの話なら、ム板のスレがいいと思われ。
0012nobodyさん
03/05/16 14:50ID:???cgi書いたことねえ。
0014nobodyさん
03/05/16 16:21ID:???ム板の方では、cgiはWebProgに逝け、と誘導されてる訳で、
その割に、こっちの方では特にcgi向けのスレであることを謳ってない。
というか、むしろperl全般に見えるしcgiに特化した話を排斥する
傾向さえ見られる。
スレのスタンスがよくわかんない、という話。
0015nobodyさん
03/05/16 16:25ID:???基本的にはCGIでのPerl話題。
WebProg板だからな。
CGIに特化した話を排斥しているように見えるのは、その話題がほぼ必ず
「コーディングの話題じゃない」からだ。
つまり、「CGIとしてPerlを使う時のコーディングの話題」のスレってことだ。
確かにスレタイや>>1を見ただけではわかりにくいかもな。
0016nobodyさん
03/05/16 16:39ID:???ム板のPerlスレは、いつもるびきちやらにwebprog行けって
言われて、前の(前の)スレは、あいつに荒らされでぽしゃった。
だから、CGIじゃないPerlの話題もこっちが主流だった。
こっちじゃ、CGIのスレがあるから、Perl初心者コーナーは、
CGI以外のPerlについて話す場所にしようとみんなでしてた。
前の前のスレの>>1を見れば分かる。
でも、るびきちの荒らしがなくなったので、まあ、CGIでも
CGI以外でもPerlのコーディングに関するものなら、いいんじゃ
ないか。高度なのは、ム板、比較的簡単なのは、こっちで
どうかな。
0017nobodyさん
03/05/16 17:40ID:Jkp+t2ia'sql_arrange' => "顧客絞込み条件の入力",
'select' => "該当顧客の閲覧",
'writemail' => "メールの記入"
);
foreach $value (keys %mode2name){
$HtmlTmp .= qq|$mode2name → |;
}
print $HtmlTmp;
とやると、
「該当顧客の閲覧 → メールの記入 → 顧客絞込み条件の入力 → 」
と表示されます。
これを、%mode2name = で設定した順番、つまり、
「顧客絞込み条件の入力 → 該当顧客の閲覧 → メールの記入」
と表示させるには、
foreachの部分はどう書けばいいのでしょうか?
0019nobodyさん
03/05/16 17:56ID:???foreach $value ('sql_arrange','select','writemail'){
$HtmlTmp .= qq|$mode2name{$value} → |;
}
0020nobodyさん
03/05/16 18:20ID:???ハッシュに入っているキーの量が少ない(メールフォーム程度)なら、
キーに01,02等の通し番号を(キーの頭に)付けておいて、
foreach $key (sort keys %hash)
する手がある。表示もcgiでやるならsprintfして出力するだけだから簡単。
場当たり的なのが欠点。
perl cookbookにはTie::IxHashモジュールを使えとある。
こっちの方がたぶん正道のような気もするが、使ったことないので要調査ということで。
002117
03/05/16 19:01ID:???頭いい!?と思ったが、
ちょっとそれは気持ち悪い。。。
>>20
とりあえず、
>キーに01,02等の通し番号を(キーの頭に)付けておいて
でやってみます
0022nobodyさん
03/05/16 23:42ID:???'sql_arrange' => ["01","顧客絞込み条件の入力"],
'select' => ["02","該当顧客の閲覧"],
'writemail' => ["03","メールの記入"]
);
で、1項目目でソートしたキーを入れるに入れて
foreach ( @hoge ) {
$ref = $mode2name{$_};
$.... .= "$ref->[1]";
}
見たいな感じでいけないかな。実際に動かしてないからちびっと不安
0023nobodyさん
03/05/16 23:43ID:???0024nobodyさん
03/05/17 00:51ID:VynWxd2Gデータの構成は一緒なんですが。
@date = @date[sort {$tmp1[$b] <=> $tmp1[$a] || $tmp2[$b] <=> $tmp2[$a] || $tmp3[$b] <=> $tmp3[$a] || $tmp4[$b] <=> $tmp4[$a]} 0 .. $#tmp1];
@date2 = @date2[sort {$tmp1[$b] <=> $tmp1[$a] || $tmp2[$b] <=> $tmp2[$a] || $tmp3[$b] <=> $tmp3[$a] || $tmp4[$b] <=> $tmp4[$a]} 0 .. $#tmp1];
これでは別々になってしまうし・・・
0026nobodyさん
03/05/17 07:15ID:wMi5ghdiほにゃらら if ほげほげ
ってかきかたはできるみたいですが、
これにelseの意味も加えた1行の書き方ってないですか?
0027nobodyさん
03/05/17 07:20ID:???初心者が見て勉強になるソースってどれでしょうか?
0029nobodyさん
03/05/17 08:08ID:+QQFZ4NNhttp://accessplus.jp/staff/in.cgi?id=10645
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=neat
http://www.emzshop.com/goodstyle/
http://members.tripod.co.jp/neatstyle/index.html.html
0030nobodyさん
03/05/17 10:38ID:0rspM7nmhttp://accessplus.jp/staff/in.cgi?id=11141
プニュ ( ゚∀゚)σ)´Д`)
0031nobodyさん
03/05/17 10:55ID:bv1ocBAi0032nobodyさん
03/05/17 14:49ID:???こんなののほかに何かいいのありますかね。
open(FILE1, "test1.txt") or die "$!\n";
@file1 = <FILE1>;
close FILE1;
open(FILE2, "test2.txt") or die "$!\n";
while(<FILE2>) {
print $_ unless grep($_, @file1);
}
close FILE2;
よろしうお願い島。
0033nobodyさん
03/05/17 14:57ID:???開くなら開く。読み込むなら読み込む。
0034nobodyさん
03/05/17 15:03ID:???0035nobodyさん
03/05/17 15:10ID:???つうことは、(1)開くなら開く:
open(FILE1, "test1.txt") or die "$!\n";
@file1 = <FILE1>;
close FILE1;
open(FILE2, "test2.txt") or die "$!\n";
@file2 = <FILE2>;
close FILE2;
for(@file1) {
print $_ unless grep($_, @file2);
}
とか、(2)読み込むなら読み込む:
open(FILE1, "test1.txt") or die "$!\n";
open(FILE2, "test2.txt") or die "$!\n";
while(<FILE1>) {
$this = $_;
while(<FILE2>) {
print unless $_ eq $this;
}
}
close FILE1, FILE2;
とか?(2)は、ちょっとばかばかしいしぃ。
0038nobodyさん
03/05/17 15:40ID:???自分でもクソ質問って分かってるけど、なぜか思うように動かないのです。
$pattern[0] = "あああ.30";
($test_1, $test_2) = split("\.", $pattern[0]);
print "$test_1\n";
なぜか代入されない。不思議。
0039nobodyさん
03/05/17 15:45ID:???($test_1, $test_2) = split("\.", $pattern[0]);
↓
($test_1, $test_2) = split (/\./, $pattern[0]);
不思議。
0041nobodyさん
03/05/17 16:16ID:???そういうもんだろ。
不思議。
004238
03/05/17 16:21ID:???($decode_name, $decode_value) = split("=",$decode_pair);
上の二つは正常に作動してるから、
($test_1, $test_2) = split("\.", $pattern[0]);
これも正常に作動すると思ったんだけど…。
しなっかったのよ。
不思議。
0043nobodyさん
03/05/17 16:32ID:???>上の二つは正常に作動してるから、
正常って何だよ。異常だろ。
http://flex.ee.uec.ac.jp/texi/perl/perl_56.html
0044nobodyさん
03/05/17 16:39ID:???0045nobodyさん
03/05/17 16:41ID:???条件は忘れた。
0046nobodyさん
03/05/17 16:42ID:???||=や<<=などの代入演算子について知りたいのでつが、"代入演算子"でぐぐっても=や.=、+=くらいの一般的(といっていいのか疑問でつが)な代入演算子を解説しているサイトしかヒットしません。
代入演算子について詳しく解説してあるサイトをご存知な方はURLを貼り付けてください。
おながいしまつ。
0048nobodyさん
03/05/17 16:51ID:???難しく考えなくていいんでないの?
$a ||= &b;
は
$a = $a || $b;
ってだけでしょ。
仮に、$a=0,$b=1 だったら、
右辺の結果、真になるので、$a=1となるだけ。
0049nobodyさん
03/05/17 16:52ID:???↓
$a ||= $b;
005138
03/05/17 16:56ID:???perlは妙な落とし穴が多いですね…。
実はperl独特の落とし穴(?)に何回もはまってます。
ありがとうございました。
005246
03/05/17 17:43ID:???助かりますた。
0053nobodyさん
03/05/17 17:45ID:???splitの1つ目の引数に渡せるものは、「正規表現」か「文字列」。
文字列が渡されれば、それを正規表現と解釈する。だから、これらはすべて同じ動作。
split /\./
split m/\./
split qr/\./
split "\\."
split '\\.'
split qq/\\./
split q/\\./
005538
03/05/17 18:06ID:???q[\\.]って超不思議なんだけど。
ですが、俺に中では「気にしない」と言う方向で落ちつきました。
ありがとです。
0056nobodyさん
03/05/17 18:23ID:???よく引数でtext=%82%A0%82%A2%82%A4%82%A6%82%A8っていう%に続く2桁の16進数でデータが渡りますよね。
デコードするには
$value =~ s/ %( [a-fA-F0-9][a-fA-F0-9] ) / pack ( "C" , hex ($1) ) / eg ;
ですよね。
あえて日本語を%に続く2桁の16進数にエンコードするにはどうするにはどうすればいいのですか?
データを送って自動でエンコードされたのを取り出すのはなしってことでお願いします。
0057nobodyさん
03/05/17 18:35ID:???$encode = join('',map{ s/(\W)/'%' . unpack('H2', $1)/eg; } split(//,$data));
コレでどうやろ?
0058nobodyさん
03/05/17 19:07ID:???Perlでそれを作ってもいいかもね
あいうえお
%82%A0%82%A2%82%A4%82%A6%82%A8
あいうえお
---
$a = 'あいうえお';
print("$a\n");
$a = urlencode($a);
print("$a\n");
$a = urldecode($a);
print("$a\n");
sub urlencode{
my $str = $_[0];
$str =~ s/([^\.\*\-_a-zA-Z0-9 ])/sprintf("%%%02lX",unpack("C",$1))/eg;
$str =~ tr/ /+/;
return $str;
}
sub urldecode{
my $str = $_[0];
$str =~ tr/+/ /;
$str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
return $str;
}
005956
03/05/17 19:38ID:???ダメです。
”あいうえお”が”1111111111”になってしまいます。
>>58さん。
これでうまくいきました。
ありがとうございました。
0060nobodyさん
03/05/17 20:22ID:???書き込めませんでした。皆さん、以下のスクリプト実行してみて。
@perl=qw(PERL Perl perl PERL Perl perl);
for(0 .. $#perl) {
@tmp=@perl;
print join('、', splice(@tmp, $_)), "\n";
}
@mansei=split(//, 'perl');
for(1 .. $#mansei) {
@tmp=@mansei;
print splice(@tmp, $_), "\n";
}
for($i=$#mansei; $i>0; $i--) {
@tmp=@mansei;
print splice(@tmp, $i), "\n";
}
for ($i=$#perl; $i>=0; $i--) {
@tmp=@perl;
print join('、', reverse(splice(@tmp, $i))), "\n";
}
もっとうまく書けるかな?
0061nobodyさん
03/05/17 20:37ID:???面白かったのに。
0062nobodyさん
03/05/17 21:14ID:???\\ 正直、スマンカッタ!! //
+ + \\ 正直、スマンカッタ!!/+
. ___ . ___ . ___ +
/. ――┤ /. ――┤ . /. ――┤+
./(. = ,= | ./(. = ,= | ./(. = ,= |
+ . |||\┏┓∩|||\ ┏┓∩|||\┏┓/ +
(( (つ ノ (つ 丿 (つ つ ))
ヽ ( ノ ( ヽ ノ ) ) )
(_)し し(_) (__)__)
0063nobodyさん
03/05/17 21:47ID:???sub p{print join(', ',@_),"\n"}
p(shift@t,@t)while@t;
print substr($p[-1], -abs),"\n"for 3,2,1,2,3;
p(@t=(@t,$t))while$t=pop@p;
0064nobodyさん
03/05/17 22:04ID:0j4/huIM漠然とした質問ですみません。
0067nobodyさん
03/05/17 22:17ID:ma11SCqXhttp://accessplus.jp/staff/in.cgi?id=10645
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=neat
http://www.emzshop.com/goodstyle/
0068nobodyさん
03/05/17 22:37ID:UhIqbGm50070nobodyさん
03/05/17 22:43ID:???0071nobodyさん
03/05/17 22:44ID:???$ユニークな番号 = int(rand(900000))+100000;
007271
03/05/17 22:46ID:???と仮定してみる
ナニをもってユニークとするのか聞きたいところだ
0073nobodyさん
03/05/17 22:56ID:???0074nobodyさん
03/05/17 23:04ID:0j4/huIM_はエンコードされないですよね?
0076bloom
03/05/17 23:08ID:w1ZjXwV80077nobodyさん
03/05/17 23:17ID:???そら、発生は一回じゃなくて、最高999999回発生させるんでしょ。
そのそれぞれが、過去に発生させた数字と重複していないことが
保証されている生成方法
って、全検するしかない気もするな
0079nobodyさん
03/05/17 23:51ID:???0080nobodyさん
03/05/17 23:54ID:???0081nobodyさん
03/05/17 23:54ID:???0082nobodyさん
03/05/18 00:06ID:aBq13e5fまず、環境はウィンドウズ98です。
ファイルの読み書き追記モード(open(OUT, "+<file.txt");)で,
読み込みと書き込みを同時に行おうと思ってますが、
truncateが使用不可能なため、
seek(OUT,0,0);
truncate(OUT,0);
print OUT $a;
の手法が使えません。
truncateの変わりになる方法を教えてください。
かなり調べたんですが、わかりませんでした。
0083nobodyさん
03/05/18 00:08ID:???0084nobodyさん
03/05/18 00:10ID:aBq13e5f思ってます。
終点のtell(OUT)以下を削除する方法です。
0085nobodyさん
03/05/18 00:10ID:???@seed = (0 .. 99);
my %seed;
sub init{#初期化
for(0 .. $#seed){
$seed{$_} = $_;
}
}
sub select{#取り出し
my $num = $seed{int(rand(scalar(keys(%seed))))};
delete $seed{$num};
return($num);
}
&init;
$uniq_num = &select; #コレを繰り返しとな・・・
008685
03/05/18 00:12ID:???my %seed;
sub init{#初期化
for(0 .. $#seed){
$seed{$_} = $seed[$_];
}
}
0087nobodyさん
03/05/18 00:13ID:???0091nobodyさん
03/05/18 00:22ID:???http://www.rfs.jp/sitebuilder/perl/05/03.html#open
0094nobodyさん
03/05/18 00:29ID:???自作関数で、引数が不正の場合に、
Perlの文法チェックでエラーを出力させたいのですが、
方法がわかりません・・・
どうすれば文法チェック時に引数のチェックができ、エラーを出せますか?
0095nobodyさん
03/05/18 00:37ID:???@dat0 = @dat1 = ();
foreach(0 .. 999999){ $dat0[$_] = $_; }
foreach(0 .. 999999){ $dat1[$_] = splice(@dat0,rand($#dat0),1); }
ではだめ?
009885
03/05/18 01:05ID:???@seed = (0 .. 10);
sub select{#取り出し
my $key = int(rand(scalar(@seed)));
my $num = $seed[$key];
splice(@seed,$key,1);
return($num);
}
$data = &select;
0099nobodyさん
03/05/18 01:09ID:???なぜ、そんな巨大な配列を作るんだ?
コストがかかってしかたないと思うが・・・
普通にfor文でぶん回せば良いと思うのだが・・・
0100nobodyさん
03/05/18 01:28ID:???0101nobodyさん
03/05/18 01:43ID:wPiZL/S/http://accessplus.jp/staff/in.cgi?id=10645
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=neat
http://www.emzshop.com/goodstyle/
0102nobodyさん
03/05/18 01:53ID:???my @salts = ( "A".."Z", "a".."z", "0".."9", ".", "/" );
my $salt = $salts[int(rand(64))] . $salts[int(rand(64))];
$crypt = crypt($str, $salt);
こういうルーチンだと、暗号化文字列内に「_」は絶対含まれ
ないですよね?
0103nobodyさん
03/05/18 01:55ID:Qi8mxUK410kbのファイルをopenしてprintしてcloseするのは
どっちが処理に時間がかかるのでしょうか?
0104nobodyさん
03/05/18 01:59ID:???0105nobodyさん
03/05/18 03:23ID:???どんなルーチンかは関係なくcryptの戻り値に「_」が含まれることはない
そもそも、そのルーチンってsaltをランダムにしてるだけじゃないの
0109nobodyさん
03/05/18 07:34ID:K+Hh/k3Wすみません、質問です。
csvファイルの一番上から順に1レコード読み込んで、$idと$keycodeが等しければ
それぞれ変数に代入する、という検索の部分なのですが、$idが奇数、又は偶数だ
と(csvファイルのレコード数が奇数か偶数かによる)検索失敗しまいます。
尚、$data = <IN>;の部分は、手元の本だと$data = $_;になっています。これだと
全く代入されません。
csvファイルに問題は無いと思います。お願いします。
$match = 0;
open IN,"log.csv";
while((<IN>)and($match == 0)){
$data = <IN>;
chop $data;
($keycode) = split(/\,/,$data);
if($keycode == $id){
($keycode,$flg,$mailadd,$name,$title,$comment) = split(/\,/,$data);
$match = 1;
}
}
close IN;
■ このスレッドは過去ログ倉庫に格納されています