くだすれPerl(超初心者用)3
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/03/31(火) 22:20:27ID:???もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/
関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0353nobodyさん
2009/10/11(日) 00:10:19ID:X0n6wGB10354nobodyさん
2009/10/11(日) 01:18:56ID:???while($hoge){
…
} else {
…
}
的な使い方を想定してるなら出来ない
というかどういう状況でこんな処理が必要になるのか想像もつかない
0355nobodyさん
2009/10/11(日) 01:21:55ID:???my %map = ( @cols => @list );
ってな感じでハッシュに一行代入するやり方があったはずなんですが、
やり方を忘れてしまいまして、本当にくだ質ですが、お答え頂けると幸いです。
0356nobodyさん
2009/10/11(日) 01:28:52ID:???こんな感じ?
0358nobodyさん
2009/10/11(日) 01:35:58ID:???my %hash = ($cols[0], $list[0]);
$hash{$cols[1]} = $list[1];
多分このどっちかのことだろ?
0359355
2009/10/11(日) 01:39:42ID:???スライス使うだけですた。
二行にはなりますが、以下で出来ますた。
my %map = ();
@map{@cols} = @list;
0360nobodyさん
2009/10/11(日) 05:54:06ID:X0n6wGB10361nobodyさん
2009/10/11(日) 10:25:57ID:???0362nobodyさん
2009/10/11(日) 11:41:59ID:???肯定の戻り読みを使うとか
my $ignore_bytes = 6
my $search_word = 'foo';
my $str = 'foo--foo--';
$str =~ /(?<=^.{$ignore_bytes}).*$search_word/;
0363nobodyさん
2009/10/12(月) 03:34:02ID:???可読性を考えるなら >>356 を使ったほうがいいと思いますよ。
% で宣言してるのに @ で使うとか、間違いの元だと思うんで。
「動けばいいの!」 って言うんならそれでいいですが・・・
0364nobodyさん
2009/10/12(月) 07:37:11ID:???356でも>>359でも間違える余地なんて無い。
>>359のスライス間違える奴は356でも間違える。
それだったら丁寧にfor使え(for修飾子では無く)
0365nobodyさん
2009/10/12(月) 07:54:23ID:???底辺に配慮してたらキリが無いわな
0366nobodyさん
2009/10/12(月) 10:32:01ID:???0367355
2009/10/12(月) 17:22:45ID:???@とか%はキーワードとして、見ないもんですよ。
どちらかというと[]なのか、{}なのかで型が決まってきますです。
そもそも、生の配列やハッシュを使うとデータ構造に制限しか生みませんです。
0368nobodyさん
2009/10/12(月) 22:45:13ID:???0369nobodyさん
2009/10/12(月) 23:36:14ID:???0370nobodyさん
2009/10/13(火) 00:26:07ID:???0371nobodyさん
2009/10/13(火) 10:43:38ID:???0372nobodyさん
2009/10/13(火) 13:35:24ID:???オブジェクトにして扱えってこと?
Perlだったら、List::MoreUtilsのzip/meshで十分だと思うけどなぁ。
そこまで拘りたい場面なら、がっつりRuby使うかな。
0373nobodyさん
2009/10/13(火) 17:20:52ID:???データはレファレンスで表現するのを基本にするってことでしょ
0374nobodyさん
2009/10/13(火) 17:38:12ID:???中途半端にやるからソースがごちゃごちゃになるのに・・・
0375nobodyさん
2009/10/13(火) 20:16:59ID:???0376nobodyさん
2009/10/13(火) 21:45:13ID:???0377nobodyさん
2009/10/13(火) 23:05:10ID:???配列に生配列は格納できない。
こっちのがよっぽど制限。
0379nobodyさん
2009/10/13(火) 23:39:19ID:???0380nobodyさん
2009/10/13(火) 23:41:11ID:???脳内定義の「生の配列」が何を指し示すのか解らんが、
普通のARRAYの事ならば自分がスライス(>>359)で思いっ切り
使ってる。ハッシュにしても。要するに>>363への反論になってない。
何か別物を指すならそれを説明しなきゃ、伝わる訳無い。
「生ハッシュ」ってのも何だそれ?
普通のHASHの事ならforで回せるぞ?望み通りの結果にはならんが。
perl -Mstrict -Mwarnings -le 'my %h = 1..10 ; for ( %h ){ print $_ }'
ついでに、
>>363はこの程度の初期化で「可読性」って単語を持ち出す
のは止めといた方が良い(しかも可読性を損いがちなmapに対して)。
こっちが赤面する。
0381355
2009/10/13(火) 23:54:32ID:???実際のコードではこうなってますけどね。
@{ $entity_map }{ @$col_list } = @$result_list;
生の配列/ハッシュってのは、『インタプリタが変数展開するもの』ですね。
my @arr1 = (1, 2, 3);
my @arr2 = (4, 5, 6);
my @array = ( @arr1, @arr2 );
的な間違いを仕様で定めて阻止する方が有意義な制限だとは思いませんか?
0382355
2009/10/14(水) 00:07:22ID:???> 普通のHASHの事ならforで回せるぞ?望み通りの結果にはならんが。
> perl -Mstrict -Mwarnings -le 'my %h = 1..10 ; for ( %h ){ print $_ }'
ハッシュ自体を回すのでなく、
for my %map ( @list ) {}
これが出来ないという意味ですね。
0383372
2009/10/14(水) 00:43:00ID:???なんだこれ。
> 的な間違いを仕様で定めて阻止する方が有意義な制限だとは思いませんか?
フラットにするのはPerlの仕様なんだから、Larryにでも提言しろよ。
アホらし。
0386nobodyさん
2009/10/14(水) 00:59:59ID:???ここは超初心者用なんだぜ?
たとえば
not 生 $test = { 'a' => 1, 'b' => 2};
生 %test = ( 'a' => 1, 'b' => 2);
みたいな書き方でお願いします。
0388nobodyさん
2009/10/14(水) 01:06:04ID:???0389nobodyさん
2009/10/14(水) 01:25:13ID:???0390nobodyさん
2009/10/14(水) 01:25:29ID:???0391nobodyさん
2009/10/14(水) 01:59:07ID:???じゃなきゃ 超初心者用スレ に住んでません orz
0392380
2009/10/14(水) 02:09:57ID:???355 perl
「生配列」 => 配列、単次元の配列、etc...
「配列」 => 多次元配列、Array of Hashes、etc...
「生ハッシュ」 => ハッシュ、etc...
「ハッシュ」 => 多次元ハッシュ、Hash of Arrays、etc...
# 355氏の意図とは違うかも知れんが。
少なくとも以下のURLで使われてる言葉の範囲内で説明してくれたら助かる。
ttp://www.kt.rim.or.jp/~kbk/perl5.005/perldsc.html
% perldoc perldsc
そしたら、似た用語を持ち出されて混乱する事も少なくなるでしょうから。
>>381>>382に関しては、、、「超初心者」じゃなさそうだから書く。
アホかと。
後出しもたいがいにしろ。
手前のくだらん妄想に付き合わせんじゃねえよ、ボケ。
0393nobodyさん
2009/10/14(水) 07:58:14ID:???0394nobodyさん
2009/10/14(水) 09:18:29ID:???0395nobodyさん
2009/10/14(水) 10:32:56ID:???ただそれだけなんですか?
テストプログラム作りたいだけなのに、
仰々しく組みたくないから、今のスタイル
でいいや
0396nobodyさん
2009/10/14(水) 14:16:17ID:???こういう勉強を嫌う怠惰な姿勢が、
保守性の悪いコードを生むんだろうね
0397nobodyさん
2009/10/14(水) 18:46:52ID:???0398nobodyさん
2009/10/14(水) 20:27:19ID:???そのデータをさらにラップする必要が出てきたら、
結局リファレンスにするんだから最初からやっとけっつぅ話だ。
0399nobodyさん
2009/10/14(水) 20:56:13ID:???>保守性の悪いコードを生むんだろうね
これが妄想だって言ってんだけど…。
当ってるのかも知れんがね。
自分の心の中で思ってりゃ良い事でしょ?
0400nobodyさん
2009/10/14(水) 20:59:03ID:???これのデータ構造とかを考えた上で保守性万全だと思うなら病院に行け。
適材適所でリファレンスは使えば良いだけだ。
0401nobodyさん
2009/10/15(木) 20:28:53ID:???他人が利用する可能性が少しでもあればリファレンスかな。
正直、規模によるとしか言えんし、普段から使っておいても損でもない。
日曜プログラマや趣味グラマには不要かw
0402nobodyさん
2009/10/15(木) 21:15:52ID:???0404nobodyさん
2009/10/16(金) 22:50:03ID:???0405nobodyさん
2009/10/21(水) 01:54:57ID:???データは TSV で1行あたりタブ3つで、データが4つになるわけですが、
TSV を書くときにタブを2つしか書かずにプログラムを走らせて
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = split(/\t/, $line);
の様に split すると、$tmpFAX は undef になってしまうため、
$tmpFAX に対して正規表現つかったり、.= などで文字列を連結させたりすると
Use of uninitialized value というエラーが Apache ログに溜まっていきます。
これを防ぎたいのですが、データ数が足りないまま split したときに undef では無く '' を入れることは出来ないのでしょうか?
今は
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = ('', '', '', '');
($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = split(/\t/, $line);
とやっています。
0406nobodyさん
2009/10/21(水) 02:01:01ID:???0407nobodyさん
2009/10/21(水) 05:05:56ID:???残念!だったな。
俺は、4代前から、東京生まれの東京育ちの、正真正銘の日本人だ。
お前こそ、朝鮮で生まれて、朝鮮で育った、正真正銘のチョンだろうが。
0408nobodyさん
2009/10/21(水) 07:18:11ID:???こんなんでどうでしょうか?
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = ( split(/\t/, $line), (q{})x4 );
0409nobodyさん
2009/10/21(水) 14:00:25ID:???とりあえず、この方法を使わせていただきます m(_ _)m
0410nobodyさん
2009/10/21(水) 14:01:45ID:???(split(/\t/, $line), @nullarray);
もアリかな?
試してないけどw
0411dvKqigko
2009/10/23(金) 01:22:05ID:???0412nobodyさん
2009/10/23(金) 01:31:01ID:???もう遅いかもしれんけどこんな感じでどうよ
my ($tmpZIP, $tmpADDRESS, $tmpTEL, $tmpFAX) = map{defined $_ ? $_ : ''} (split(/\t/, $line))[0..4];
0413rDiWXwyPC
2009/10/23(金) 22:37:05ID:???0414nobodyさん
2009/10/25(日) 12:37:08ID:???ディスパッチャーとは何なんでしょうか?
0417nobodyさん
2009/10/25(日) 14:06:46ID:???0418nobodyさん
2009/10/25(日) 16:54:48ID:???'a' => 'AAction',
'b' => 'BAction',
};
BEGIN {
require $setting->{ $hoge };
$setting->{ $hoge }->new();
}
※$hogeにはあらかじめ規定した、処理の分岐条件が格納されている。
主な部分はこれだけで実現できる。
new以外で処理を行いたいのであれば、サブルーチン名も設定に格納すれば吉。
フレームワークを作りたいのであれば、設定をYAML等に逃がせばよいかと。
0419nobodyさん
2009/10/26(月) 02:45:50ID:4VfuwmZ6マッチさせる対象を
テスト1:10点 テスト2:20点 テスト3:25点 テスト4:20点
にした時テスト3の点数を取り出したいんだ。
テストXの値は不定の文字列なので、
m/\D+\d+\D+\d+\D+(\d+)/;
こう書いたのだけれど$1にはテスト3の点数に加えて4の点数もくっ付いてきちゃうんだ。
何かいい書き方ありませんか?
0420nobodyさん
2009/10/26(月) 02:47:28ID:4VfuwmZ60421nobodyさん
2009/10/26(月) 03:18:05ID:???m/\D+\d+\D+\d+\D+(\d+)/; で問題なく動きました。
0422nobodyさん
2009/10/26(月) 23:59:44ID:???それホントに動いてる?
"テスト2" の 2 を取ってきてない?
そのうちどうせ他の点も必要になるだろ?
関数化すれば便利だと思うよ
sub parseTestData($){
my($str, @pairs, %ret);
$str = $_[0];
$delimitor1 = '\s| ';
$delimitor2 = ':|:';
@pairs = split /\s| /, $str;
foreach my $pair(@pairs){
my($key, $value) = split /:|:/, $pair;
$ret{$key} = $value;
}
return \%ret;
}
my $result = parseTestData("テスト1:10点 テスト2:20点 テスト3:25点 テスト4:20点");
print $result->{"テスト3"}, "\n"; #=> 25点
# 数値だけ取り出したい場合
$result->{"テスト3"} =~ /(\d+)/;
print $1, "\n"; #=> 25
0423nobodyさん
2009/10/27(火) 05:25:43ID:???$delimitor1, $delimitor2 が浮いてるな
0424nobodyさん
2009/10/27(火) 06:07:08ID:???sub parseTestData2($){
return {split(/:|:|\s/,$_[0])};
}
機能はほぼ一緒のはずだ
0426nobodyさん
2009/11/02(月) 17:05:20ID:???どういったものなのでしょうか?
0427nobodyさん
2009/11/03(火) 05:14:37ID:???質問についてはトランザクションについて調べれば後は分かるだろ
0429nobodyさん
2009/11/08(日) 11:29:12ID:OaYz9VK0↑
recv関数は受信失敗したとき未定義ち返すはずなのに
ループ抜けないのはなぜ?
0430nobodyさん
2009/11/08(日) 11:56:56ID:???ていうか本当に未定義値返ってる? 単発で実行したらどうなる?
0431nobodyさん
2009/11/08(日) 14:38:16ID:???0432nobodyさん
2009/11/08(日) 19:36:21ID:???どうも腑に落ちないがこれで事故解決と
while(recv(S,$r,4089,0) && $r){
0433nobodyさん
2009/11/09(月) 16:34:15ID:???0434nobodyさん
2009/11/09(月) 22:11:31ID:???但し、ans<=100
を満たすansを昇順に並べるというプログラムはどう組めばいいのでしょうか
0435nobodyさん
2009/11/09(月) 22:28:03ID:???昇順の並べ方がわからんのか?
perl自体がわからんのか?
0436nobodyさん
2009/11/09(月) 23:09:55ID:???正しい質問の仕方は
異なる一つ以上の素数の和で成り立ち100以下という条件を満たす整数の求め方なんかお前らに分からんだろ?
悔しかったら明日までに解いてみろよ屑ども。
う〜ん唐突だな
0437436
2009/11/09(月) 23:14:53ID:???http://pc11.2ch.net/test/read.cgi/php/1158647441/l50
0439nobodyさん
2009/11/10(火) 11:02:51ID:???0440nobodyさん
2009/11/10(火) 23:44:02ID:???組合せで強引に解いてみた。
1、4、6以外は解があるみたい。
use List::Util qw(sum);
my @primes = grep { (1 x $_) !~ /^(11+)\1+$/ } (2..100);
my %ans;
for my $r ( 1..3 ) {
my @result = combination($r, @primes);
for my $combi (@result) {
my $sum = sum @$combi;
push @{ $ans{$sum} }, $combi if $sum <= 100;
}
}
for my $sum ( sort {$a <=> $b} keys %ans ) {
my @breakdown = map join('+', @$_), @{ $ans{$sum} };
print "$sum (". join(q{, }, @breakdown) . ")\n";
}
0441nobodyさん
2009/11/10(火) 23:44:48ID:???sub combination {
my ($r, @data) = @_;
my $n = @data;
my @result;
combinatorial( $n, $r, 0, [], \@data, \@result );
return @result;
}
sub combinatorial {
my ($n, $r, $pos, $combi, $data, $result) = @_;
if ( $r == 0 ) {
push @$result, [ @$combi ];
return;
}
for my $i ( $pos..$n-$r ) {
push @$combi, $data->[$i];
combinatorial( $n, $r-1, ++$pos, $combi, $data, $result );
pop @$combi;
}
}
0442nobodyさん
2009/11/11(水) 02:32:45ID:???俺も書いてみた。
素数を探すアルゴリズムを書くのがめんどくさかったので
ウェブからコピペしたのは内緒だ。
(上の人のはよくわかんなかったし)
#!/usr/bin/perl
use strict;
use warnings;
use List::Util q/sum/;
my @primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97);
@primes = reverse @primes;
my $ncomb = 2**(scalar @primes);
my %outhash = map{$_,0}1..100;
## you don't have to run until $ncomb
## a thousand is enough to get the answer of 1, 4, 6
for (0..1000){
my $bin = sprintf "%025b", $_;
my @comb = split("",$bin);
my @list = map{$comb[$_]*$primes[$_]}0..24;
if (sum @list <=100){$outhash{sum @list}=1};
}
for(sort {$a<=>$b}keys %outhash){print $_,"\n" unless $outhash{$_};}
0443nobodyさん
2009/11/11(水) 12:07:52ID:???総当りで調べているので、完全な証明にもなっていると思う。
汎用性を持たせて、1つ以上の素数の和だけでなく、2つ、3つ以上とかにもできるようにした。
use List::Util qw(sum first);
# 調べる最大数値(100で質問者の題意)
my $max_num = 100;
# 和にするのに必要な素数の数(1で質問者の題意)
my $num_of_primes = 1;
my @primes = grep { (1 x $_) !~ /^(11+)\1+$/ } (2..$max_num);
my %ans;
for my $num ( $primes[0] .. $max_num ) {
my $max_index = first { $primes[$_] >= $num } 0..$#primes;
if ( not defined $max_index ) { $max_index = $#primes }
my @combi = find_combi( $num, @primes[0..$max_index] );
push @{ $ans{$num} }, @combi if @combi;
}
for my $sum ( sort {$a <=> $b} keys %ans ) {
print "$sum (". join('+', @{ $ans{$sum} }) . ")\n";
}
my @num_excluded = grep { not exists $ans{$_} } 1..$max_num;
print "\n$num_of_primesつ以上の素数の和で表\せない数値\n";
print join q{, }, @num_excluded;
0444nobodyさん
2009/11/11(水) 12:09:50ID:???sub find_combi {
my ($num, @primes) = @_;
for my $r ( $num_of_primes .. @primes ) {
my @combi_list = combination($r, @primes);
for my $combi (@combi_list) {
return @$combi if $num == sum @$combi;
}
}
return;
}
sub combination と sub combinatorial の中身は、>>441と同じ。
0445nobodyさん
2009/11/12(木) 08:40:06ID:???MXレコードを引いて、宛先のメールサーバーに直接メールを送るモジュールはないでしょうか?
レンタルサーバーで使いたいので、pure perlでお願いします。
0446nobodyさん
2009/11/13(金) 12:13:36ID:???0448nobodyさん
2009/11/21(土) 23:38:15ID:twpezRr5プラグイン設定で追加しようとしても灰色になって選択できません。
0450nobodyさん
2009/11/23(月) 22:45:22ID:g+VEp3/W「exit」を入れています。
sub a { }
exit;
sub b { }
これをライブラリとして使用する場合、別のcgiから呼び出すと、
途中で終了してしまいます。
どのように動作を区切っておけばよいのでしょうか?
0451nobodyさん
2009/11/24(火) 01:28:07ID:???まったく何を言ってるのか分かりませんが、
exit;
の行を消せば良いんじゃないでしょうか
サブルーチンを使うとき、途中で終了する目的はなんでしょうか?
そもそも、exit以降にサブルーチン定義しかなかったら、
exitが有っても無くても動作は変わらないような気がするのですが。
0453nobodyさん
2009/11/24(火) 10:33:29ID:???初心者で済みません、基本が分かってないのだと思います。
サブルーチン一つに変えて質問します。
例えば上から下に流れていって、
コード1・・・・
& a;
コード2・・・・
sub a{ }
コード2の部分で終わりたい場合に、
exit;がなかったら最後まで実行するのではと思うのですが?
■ このスレッドは過去ログ倉庫に格納されています