くだすれPerl(超初心者用)2
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/03/03(月) 05:07:32ID:???もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
0654nobodyさん
2008/09/11(木) 09:24:19ID:???0655nobodyさん
2008/09/11(木) 09:32:03ID:???#!C:/Perl/bin/perl.exe
print "<html><head><title>テストperl</title></head><body>";
print "Hello world\n";
print "</body></html>";
をtest.plと保存して、
http://hoge/test.pl
をアクセスしてみろ。
0656nobodyさん
2008/09/11(木) 10:01:19ID:???0657nobodyさん
2008/09/11(木) 10:20:26ID:???0658nobodyさん
2008/09/11(木) 10:55:26ID:???用途に向いたデータ構造に変更しましょう。
> @hairetu1=[30,80,50,90]
もし本当にこうだとすると、以下と等価であり、
少々不自然で扱いづらいでしょう。
@hairetu1 = ( [30,80,50,90] );
# @hairetu1 は $hairetu1[0] に無名配列リファレンスを持つ、
# 1要素のみの配列になっている点に注意。
以下は一例です。
@hairetu = (
[qw( 30 3 a 3305 さん )],
[qw( 80 8 b 2206 はち )],
[qw( 50 5 c 1128 ご )],
[qw( 90 9 d 1128 きゅう )],
);
あとは値を比較した結果を使って @hairetu の要素を入れ換える操作を行えばおっけー。
その辺の操作は調べると見つかるのでがんばって。
0660nobodyさん
2008/09/11(木) 11:05:32ID:???0661nobodyさん
2008/09/11(木) 11:07:57ID:n+/h4em7いつまでクソ言語にしがみついてんだよテメエらwwwww
いま時代はRuby,php,pythonだろwwww
乗り遅れ乙wwwww
うぇっwwうぇwww時代に乗れなくてくやしいのうwwくやしいのうwwwwww
0662nobodyさん
2008/09/11(木) 11:13:08ID:???my @hairetu1=(30,80,50,90);
my @hairetu2=(3,8,5,9);
my @hairetu3=qw/さん はち ご きゅう/;
my @hairetu4=qw/a b c d/;
my @hairetu5=(3305,2206,1600,1128);
my @array;
for (0..4) {
push @array, join(',', $hairetu1[$_], $hairetu2[$_], $hairetu3[$_], $hairetu4[$_], $hairetu5[$_]);
}
@array = sort { $b cmp $a } @array; # <=> かもしれないけどなんとなく cmp
print join("\n", @array); # この順にしたいんですよね
Excel みたいな「行と列」を思い浮かべながら @hairetu1, 略, @hairetu5 で
再現しようとするからどつぼなんだと思う。
0663nobodyさん
2008/09/11(木) 12:05:15ID:???my @hairetu2 = (3,8,5,9);
my @hairetu3 = ('さん','はち','ご','きゅう');
my @hairetu4 = qw(a b c d);
my @hairetu5 = (3305,2206,1600,1128);
my @narabi = sort{$hairetu1[$b] <=> $hairetu1[$a]} (0..$#hairetu1);
foreach(\@hairetu1, \@hairetu2, \@hairetu3, \@hairetu4, \@hairetu5){
@{$_} = @{$_}[@narabi];
}
--
my @hairetu = ([30,3,'さん','a',3305], [80,8,'はち','b',2206],[50,5,'ご','c',1600], [90,9,'きゅう','d',1128]);
@hairetu = sort{$b->[0] <=> $a->[0]} @hairetu;
普通はこっち。
0664nobodyさん
2008/09/11(木) 12:05:27ID:???思いつくのか理解出来ん。データ構造が腐ってるってのを置いとくにしても、、、
my @ind = sort { $hairetu1[$b] <=> $hairetu1[$a] } 0 .. 3 ;
@hairetu1 = map{ $hairetu1[$_] } @ind ;
@hairetu2 = map{ $hairetu2[$_] } @ind ;
# 略
@hairetu5 = map{ $hairetu5[$_] } @ind ;
ちなみに自分でデータ構造から考えるなら二次元配列かhashにするに決ってる、こんなもん。
0666649
2008/09/11(木) 14:32:27ID:MBV8c4KU今から皆さんが教えてくれたのを全部試してやってみます。
つか自分超絶初心者です。。。
いいプログラム作れる様がんばります。
0667nobodyさん
2008/09/11(木) 14:59:42ID:???0668662
2008/09/11(木) 15:35:31ID:???俺ですね。
他の配列のソート順でgdgdしてたので、質問者さんがわかりそうな道具で
「こういう感覚ですかね?」と書こうとした(ものがアレすぎたのでお怒りになった)んですけど
寝とけばよかったです。0 .. 4 とか書いてるし。
くだすれなのに「腐ってる」「こんなもん」なんてことになってるのも、その怒りの余波だと思うので
質問者さん、すみません。
0669nobodyさん
2008/09/11(木) 18:40:06ID:h0fBdZdnコードを読んでいると$hoge[2]とかいうのはわかるんですが、
$hoge[1][0][0]=3;
$hoge[1][0][1]=5;
$hoge[1][0][2]=7;
とかいうのが出てきたんですが、これは何を意味しているんでしょうか?
0672nobodyさん
2008/09/11(木) 18:51:22ID:???0673669
2008/09/11(木) 19:14:29ID:h0fBdZdnところで、
$hoge[1][0][0]=3;
$hoge[1][0][1]=5;
$hoge[1][0][2]=7;
の場合、
@hoge=( [ [*,*,*], [*,*,*], [*,*,*] ], [ [3,5,7], [*,*,*], [*,*,*] ], …)という感じでしょうか?
だとしたら、この3,5,7だけを
@list=(3,5,7)の様にひとつの配列にするにはどうすれば良いでしょうか。
何度もすいません。
0674nobodyさん
2008/09/11(木) 19:16:46ID:???0675669
2008/09/12(金) 00:22:15ID:Oy+yCkpGありがとうございました。
0676nobodyさん
2008/09/22(月) 04:48:26ID:aVlitntf@a = ([5,8,0,50], [4,6,1,30], [3,7,1,200], [5,8,1,50], [3,8,0,150], [2,9,0,110])
grepを使って、上の配列から3つ目が1のものだけを抜き出して、
@b = ([4,6,1,30], [3,7,1,200], [5,8,1,50])
としたいのですが、どのように記述すればいいのでしょうか。
0677nobodyさん
2008/09/22(月) 07:34:12ID:???0678nobodyさん
2008/09/23(火) 04:34:43ID:???print "@$_\n";
}
↑結果を表示するには
このコードでいい?
0679nobodyさん
2008/09/23(火) 05:20:37ID:???0680nobodyさん
2008/09/24(水) 10:17:33ID:???それがだいじ
0681nobodyさん
2008/09/24(水) 15:42:32ID:???> このコードが窮極?
って質問すればいいんじゃないかな
0682nobodyさん
2008/09/24(水) 16:12:52ID:???って答えが返ってくるんじゃないかな
0683676
2008/09/25(木) 01:55:10ID:rnTIMd1pありがとうございました。
返事が遅れてすいません。
なぜかホスト規制くらって2〜3日アクセスできませんでした。orz
0684nobodyさん
2008/10/03(金) 16:52:32ID:Rl6ONEmX↓の様な記述ですが、
my $flag = (!$a) ? random(3) : random(11));
↑これは、
$aの値が無ければ3未満のランダムの数を$flagに代入、
$aの値が存在すれば11未満のランダムの数をで$flagに代入
ですよね。
ただ、↓の様なのがあって、どうしても意味がわかりません。
my $flag = (!$a) ? !($b >= random(100)) : (($c <= $a) ? random(3) : random(11));
↑これはどのように解すれば良いのでしょうか。
0685nobodyさん
2008/10/03(金) 17:22:11ID:???random てのが何を示すか分らんが…。
! ( $b >= random(100) ) は確実に0、1しか返さんから変に思えるが、
まあ、アリではあるので。
ポイントは、
1. 条件式「!($b >= random(100)) 」を式としてではなく値として利用。
2. 三項演算子の二段がさね。
my $res = COND ? TRUE_EXPR_1
: ( COND ? TRUE_EXPR_2
: FALSE_EXPR_2 ) # FALSE_EXPR_1
;
my $flag
= ! $a # CONDITION
? !($b >= random(100)) # TRUE_EXPRESSION
: # FALSE_EXPRESSION ( だかその中にさらに三項演算子)
(
($c <= $a) # CONDITION
? random(3) # TRUE_EXPRESSION
: random(11) # FALSE_EXPRESSION
)
;
分けると
my $pre_flag = ($c <= $a) ? random(3) : random(11) ;
myy $flag = ! $a ? !($b >= random(100)) : $pre_flag ;
0686Perlについて教えてください。
2008/10/03(金) 18:04:37ID:PunwVHG2コードがISO、西ヨーロッパなどとなってしまうのです。
そこで、headerの部分にcharset=を含めようとしてるのですが、
何度やっても、500エラーになってしまいます。
sub header {
print "Content-type: text/html\n\n";
print "<!--//HEAD//-->\n";
print "<html><head>\n";
print "<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">\n"
print "<title>CGI Control Panel</title>\n";
print "<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">\n"
↑
を追加して日本語になるように、お願い致します。
0687nobodyさん
2008/10/03(金) 18:06:50ID:???あと、Content-type: text/html; charset=云々
というのもあるよ。
0689684
2008/10/04(土) 09:25:08ID:S1uyMhw/なるほど、わかりました。
すいません。randomはrandの間違いでした。
my $flag = (!$a) ? !($b >= rand(100)) : (($c <= $a) ? rand(3) : rand(11));
つまり↑と↓は同じという理解で良い訳ですね。
my $flag;
if (!$a) {
$flag = !($b >= rand(100));
} elsif ($c <= $a) {
$flag = $rand(3);
} else {
$flag = $rand(11);
}
ありがとうございました。
0690nobodyさん
2008/10/04(土) 10:53:07ID:uZuIKJns↑これおすすめ!
"register_globals = on"
を推奨していることについて気をつければ・・・ですが
0691nobodyさん
2008/10/04(土) 18:05:45ID:???0693nobodyさん
2008/10/04(土) 18:16:28ID:???0694nobodyさん
2008/10/04(土) 19:36:37ID:???2
3 aaa
4
5 ******
上のようなテキスト(数字は行番号)で、任意の文字列(aaa)にマッ
チしたら、囲まれた範囲(2行目〜4行目)を別ファイルにコピーする
コードはどう書けばいいでしょうか?
自分でも調べますが、perlは全く知らないので教えてくれる人がい
ると助かります。
0695nobodyさん
2008/10/04(土) 19:50:09ID:???2: ところでaaa
3: aaa
4: aaa
5: これだと
6: aaa
7: どこからどこまでaaaが
8: aaa
9: aaa囲まれた
10: 範囲なんだ
0696nobodyさん
2008/10/04(土) 20:01:11ID:???簡単なのは「******」から次の「******」までをバッファリングして、
バッファの中に「aaa」があったらファイル開いて書き込む、とかかね。
0698nobodyさん
2008/10/04(土) 21:35:30ID:???perl -0777ne 'print grep /^aaa$/m, /^\*{6}\n(.*?)(?=^\*{6}\n)/gms ' hoge.txt >fuga.txt
正規表現一回だと結構めんど
perl -0777ne 'print /^\*{6}\n((?:(?!^\*{6}\n).)*?^aaa\n(?:(?!^\*{6}\n).)*?)(?=^\*{6}\n)/gms ' hoge.txt >fuga.txt
0700694
2008/10/05(日) 14:05:30ID:???次は一歩すすんで、↓のようなテキストの場合、2-4行目と9-11行
目を別ファイルに保存したいのです。
1 *start*
2
3 aaa
4
5 *end*
6
7
8 *start*
9
10 aaa
11
12 *end*
ファイルをオープンしてwhile文で繰り返し処理をしたら行けるの
かな、と思ったのだけど、よく考えたらwhileは1行ずつしか読み
込まないからこの方法だと駄目なのですね。
分かる人がいたらお願いします。
0701nobodyさん
2008/10/05(日) 14:13:01ID:???>かな、と思ったのだけど、よく考えたらwhileは1行ずつしか読み
>込まないからこの方法だと駄目なのですね。
なにがダメなんだ?
0702nobodyさん
2008/10/05(日) 14:19:41ID:???自分で何処まで書けたのか提示しないのも良くない。
この質問に答えた後に、「では…の様にするのはどうしたら良いでしょう?」
って来るのが目に見えてて答える気にはならん罠。
0703nobodyさん
2008/10/05(日) 14:21:12ID:???0704nobodyさん
2008/10/05(日) 14:56:18ID:???クッキーを発行しているページへ下記の様にしましたけどエラーです
どなたか手直しお願いします
やりたいことは新しいクッキーを100個くらい集めたいです
use HTTP::Request;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => 'http://hoge.jp');
while(1){
my $response = $ua->request($request);
print $response->header('Set-Cookie'),"\n";
sleep 1;
0706nobodyさん
2008/10/05(日) 15:07:27ID:???実在してたのかorz
この前、実在のアドレスは2chで晒すなと指摘を受けたので
気をつけたのに
>>705さんは私と多分どこかで遭遇してるね
いつも応援ありがとう
よろしく^^
0707nobodyさん
2008/10/05(日) 15:09:29ID:???あなたには非が無い。
0709nobodyさん
2008/10/05(日) 16:08:06ID:???0710nobodyさん
2008/10/05(日) 16:51:17ID:???全角スペースが含まれていて、}が閉じてないとか?
エラー内容が伏せられてるから、あてずっぽうで。
URLはhttp://example.com辺りを使えば被らない事がrfc2606保障されてる。
0711700
2008/10/05(日) 17:06:32ID:???Cは知っているのでその知識で強引に実現した感じ。
=========
#!/usr/bin/perl
$i = 1;
open IN, "hoge.txt";
while (<IN>) {
if (/.*start.*/) {
$flag = on;
$string = "";
} elsif (/.*end.*/) {
open OUT, ">file$i";
print OUT $string;
$i += 1;
$flag = off;
close OUT;
} else {
if ($flag eq on) {
$string .= $_;
}
}
}
close IN;
=========
perlの人からは腐ったコードに見えると思うので改良点が有ったら
教えてください。Cの人から見ても腐ってる、というのはこの際勘
弁。
0712700
2008/10/05(日) 17:38:53ID:???========
#!/usr/bin/perl
$i = 1;
open IN, "hoge.txt";
while (<IN>) {
if (/.*start.*/) {
$flag = on;
$string = "";
} elsif (/.*end.*/) {
$_ = $string;
if (!/.*aaa.*/gms) {
next;
}
open OUT, ">file$i";
print OUT $string;
$i += 1;
$flag = off;
close OUT;
} else {
if ($flag eq on) {
$string .= $_;
}
}
}
close IN;
=======
0713nobodyさん
2008/10/05(日) 19:23:20ID:???正規表現の.*はいらない。gmsもいらない
あと、状態遷移のアルゴリズムはシグナル判定(start,end文の検出)を
状態判定(flagの検出)の内側に持ってきた方がよいと思われ。
0715700
2008/10/05(日) 21:09:06ID:???「こんなのperlを最大限に使えば半分以下のコードで済む」といっ
た間違いで無ければ、さしあたってはそれでいいです。とりあえず
動くものを書いて、根本的なロジックがおかしくなければ後は修正
するだけなので。
そういった間違いではないようなので、後はこれをブラッシュアッ
プしていきます。どうもありがとうございました。
0716nobodyさん
2008/10/05(日) 21:42:03ID:???「C脳の自分」(表現が悪くて申し訳ない。悪意はないです)が不安で訊いてしまうのかな?
ループ制御できてフラグ使えてパターンマッチ使えてるんだし
指摘されてる bare word とかそんなもんじゃないすか。
> 「こんなのperlを最大限に使えば半分以下のコードで済む」
'on' or 'off' のフラグ変数でなく範囲演算子 .. でフリップフロップ(>>46の使い方)させたら便利とか
フラグ変数使うにしても文字列比較より 1 か 0 のほうが楽とかコマゴマしたのはあるけど、
動きゃいいんです。
0717nobodyさん
2008/10/05(日) 22:01:19ID:???0718nobodyさん
2008/10/05(日) 22:11:49ID:???シェバン行とuse strict; use warnings で11行。
そんなもん追求するには10年早い。
0719nobodyさん
2008/10/05(日) 23:59:23ID:???>>704です
ご指摘ありがとうございました
お陰さまで動くようになりました^^;
空行の全角スペースを削除して
最後の行に}を付け足しただけで
エラー無くなりました
ありがとうございました^^
0720nobodyさん
2008/10/06(月) 01:08:02ID:???0722nobodyさん
2008/10/06(月) 03:55:49ID:???テキスト保存できるようになったのですが
ファイル名をTES-YYYYMMDDHHMMSS.txtにする方法わかりません
どなたか教えてください
お願いします
0723nobodyさん
2008/10/06(月) 04:31:33ID:???それともファイルのタイムスタンプをファイル名にするってこと?
0724nobodyさん
2008/10/06(月) 04:41:45ID:???レスありがとうございます
>>720です
ダウンロードが完了した時刻をファイル名にしたいと思います
tes-08-10-06-04-41-50.txt
上記のようなファイル名が目標です
お時間のあるときにでも教えて頂けたら幸いです
0725nobodyさん
2008/10/06(月) 05:06:00ID:???$filename = DateTime->now(time_zone => "+0900")->strftime("tes-%y-%m-%d-%H-%M-%S.txt");
0726nobodyさん
2008/10/06(月) 06:00:00ID:???>>720です
教えて頂いたコードでテストしてみたところ
Can't locate DateTime.pm in @INC (INC contains: C:/Perl/lib .) at tes.pl line 6.
BEGIN failed--compilation aborted at tes.pl line 6.
とエラーになります
当方の環境でしょうか?
WindowsXp ActivePerl-5.8.8.822です
今日はオヤスミしますので、また明日にでも調べてみます
お疲れのところ本当にありがとうございました
0727nobodyさん
2008/10/06(月) 06:41:21ID:???use File::Slurp;
my $text = read_file('hoge.txt');
my @part = ($text =~ m|^\*start\*$((?:(?!^\*start\*$).)*?aaa.*?)^\*end\*$|gms);
for (my $i = 0; $i < @part; $i++) {
write_file('file' . ($i + 1), $part[$i]);
}
0728nobodyさん
2008/10/06(月) 06:46:14ID:???0729nobodyさん
2008/10/06(月) 07:29:33ID:???先人の残してくれたものを参考にさせて頂き
なんとか目標のものができました
みなさん本当にありがとうございました^^
use HTTP::Request;
use LWP::UserAgent;
use File::Find;
use File::Basename;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => 'ttp://www.ググル.co.jp/');
$i = 1;
while($n < 3){
$n++;
my $response = $ua->request($request);
print $response->header('Set-Cookie'),"\n";
sleep 1;
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
@a = split($i);
$i = sprintf("TES-%s%04d年%02d月%02d日%02d時%02d分%02d秒%s", $a[0], $year+1900, $mon+1, $mday, $hour, $min, $sec, $a[1]);
open(DATAFILE, ">> $i.txt") or die("Error:$!");
print DATAFILE $response->header('Set-Cookie'),"\n";}
0730nobodyさん
2008/10/06(月) 07:58:00ID:???まあいいかw
0731nobodyさん
2008/10/06(月) 08:02:00ID:???use POSIX qw(strftime) ;
print strftime "%y年%m月%d日%H時%M分%S秒\n", localtime ;
0732nobodyさん
2008/10/06(月) 08:02:45ID:???0734nobodyさん
2008/10/07(火) 18:53:36ID:???use warnings;
use LWP::UserAgent;
use Time::Piece;
use IO::File;
my $fname = localtime->strftime("%Y年%m月%d日%H時%M分%S秒.txt");
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET=>'http://www.google.co.jp/');
my $res = $ua->request($req);
if ($res->is_success) {
my $io = IO::File->new("$fname", ">");
$io->print($res->content);
$io->close;
}
0735nobodyさん
2008/10/08(水) 23:43:58ID:???レス遅くなり申し訳ないです
サンプル作ってくれたんだ^^
ありがとう
環境の違いなのか4行目のuse Time::Piece;の部分がキャントロケートなんとかってエラーが出るんです
use Time::Piece;が当方のパソコンにインストールされていないってことなんでしょうか?
せっかく>>734さんが作ってくれたのに使えなくってすいません
ありがとうございました
0736nobodyさん
2008/10/09(木) 00:43:23ID:???0737nobodyさん
2008/10/12(日) 14:00:31ID:???配列の勉強中で下のようなのを書いたんですが、実行するとエラーになります。
どこが悪いのか分からないので教えていただけないでしょうか?
#!/user/bin/perl
$. = ",";
$\ = "\n";
@data = (3,6,7);
print @data;
%data[1] = 'six';
print @data;
%data[5] = 9;
print @data;
@data = (1,2);
print @data;
0738nobodyさん
2008/10/12(日) 14:09:49ID:???0739nobodyさん
2008/10/12(日) 14:35:35ID:???あ、基本的なところが;;
直して実行してみましたが、まだエラーになります(ノд`)
他に変なところは無いでしょうか?
0740nobodyさん
2008/10/12(日) 14:47:38ID:???%data[5] => $data[5]
0741nobodyさん
2008/10/12(日) 15:16:41ID:???0742nobodyさん
2008/10/12(日) 15:25:44ID:???ありがとうございます;;;
0743nobodyさん
2008/10/12(日) 21:56:41ID:???なんで配列の要素にアクセスするのに、
%じゃなくて$なんだよと。
0744nobodyさん
2008/10/12(日) 22:56:30ID:???0746nobodyさん
2008/10/14(火) 12:12:13ID:???0747nobodyさん
2008/10/14(火) 12:28:13ID:???0748nobodyさん
2008/10/14(火) 14:49:26ID:W0wcfnrq今HP乗せてるブロバイダでperl4が対応しなくなるので、ソーすを変更しろと
いう通知が来ました。無料公開のCGIを拾ってきて掲示板や質問を埋めて
もらってメールを受けるのを使った程度の記憶しかありませんw
4から5に変更するにはどうしたらいいのでしょうか?
0749nobodyさん
2008/10/14(火) 15:25:39ID:???0750nobodyさん
2008/10/14(火) 15:47:00ID:???0751nobodyさん
2008/10/14(火) 15:47:24ID:CJyY9JPp0752nobodyさん
2008/10/14(火) 18:34:16ID:???ssh起動してターミナルでGo。
0753nobodyさん
2008/10/14(火) 19:19:11ID:CJyY9JPpありがとう!
0754nobodyさん
2008/10/18(土) 08:37:31ID:TpRddp7o追加中に
Apache source not found, enter path name or q to quit
といわれてしまいます。
Apacheのソースコードなどが必要ということでしょうか?
Apacheのバージョンが2.2.6なのですが、ソースコードが見当たらないです。
すいませんがご存知の方教えてほしいです。
■ このスレッドは過去ログ倉庫に格納されています