Perlコーディング初心者質問スレ Part 46
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/01/18(水) 02:17:46ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0421418
2006/02/03(金) 15:53:17ID:???条件式が単純な場合は unless の方が「〜でない」という意図がハッキリ伝わる
ような気がするので unless を使うようにしている。
変かな?
0422nobodyさん
2006/02/03(金) 16:10:15ID:???0423nobodyさん
2006/02/03(金) 19:06:09ID:???if ( not hoge ) { kuso; }
しか使わない漏れが来ましたよ。
0426nobodyさん
2006/02/04(土) 14:26:20ID:???せっかくあるんだし、そういう条件付ならいいかも。
ただ、ほとんどの場合は if + !式 の組み合わせの方が
タイプが少なくて済むんだよね。
until は while と同じだからいいんだけど。
0427nobodyさん
2006/02/04(土) 14:29:47ID:???if ( hoge ) { unko; } else { kuso; }
でいいんじゃないのか?
0428nobodyさん
2006/02/04(土) 15:04:46ID:???この二つのパターンしか使ってないよ
っていう意味じゃないの?
0429nobodyさん
2006/02/04(土) 23:39:17ID:???BBB
CCC
DDD
EEE
↓
├AAA
│ └BBB
│ ├CCC
│ └DDD
└EEE
階層は無限。
どういうコーディングすればよいのかちょっと分からないのでお助けを...
0430nobodyさん
2006/02/05(日) 00:37:52ID:???質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0431nobodyさん
2006/02/05(日) 01:13:47ID:???たぶんインデントされたものを罫線付きで表示したい
って意味だと思うの
0432nobodyさん
2006/02/05(日) 01:15:08ID:???階層数を記憶しておいて、それに見合った「│ 」やら「└」を出力すればおk
0433nobodyさん
2006/02/05(日) 01:37:06ID:???0434429
2006/02/05(日) 02:17:56ID:???やりたいことは、エスパー魔美タンの言う通りです。>>431 >>433
行毎に文字列が書かれている
インデント無しなら1階層目、インデント1つなら2階層目、インデント2つなら3階層目・・・∞
「│」「├」「└」を使用して全て繋がっている木構造を出力する
かなりの難問です。スミマセン。
0435nobodyさん
2006/02/05(日) 02:18:04ID:???うーん、汚い。
my @result;
my $maxdepth = 0;
while(<DATA>){
/( *)(.*)/s;
my $depth = length $1;
push @result, [(" ")x($depth+1), $2];
$maxdepth = $depth if $maxdepth < $depth;
}
for my $d ( 0 .. $maxdepth ){ # $d=注目階層
my @class = grep { 2+$d == scalar @{$result[$_]} } 0..$#result;
$result[$_][$d] = "┃" for $class[0] .. $class[-1];
$result[$_][$d] = "┣" for @class;
$result[ $class[-1] ][$d] = "┗";
}
print join '',@$_ for @result;
__DATA__
AAA
BBB
CCC
DDD
EEE
0436429
2006/02/05(日) 02:36:19ID:???デキタ!と思ったら反例が見つかったのでご報告。スミマセン
AAA
BBB
CCC
DDD
EEE
FFF
GGG
0437nobodyさん
2006/02/05(日) 03:05:55ID:???AB
ABC
ABD
ABE
ABEF
G
ループしながらスタックでこんなの作ってやれば
親が末っ子かどうかで" "か"┃"を塗り分けて
自分が末っ子かどうかで"┗"か"┣"を塗り分けられそうだ
後はパス
0438nobodyさん
2006/02/05(日) 03:38:38ID:???んで再起で呼ぶときに行頭のスペースの数を渡してやって、それに一致しなければ抜けるようにすればいい
と思う
明日中に解決してなければ、まぁ微妙に面白そうだしやってみようかなとか思う
0439nobodyさん
2006/02/05(日) 07:20:36ID:V48VHYZU1.$wordの文字列から6バイト目以降か7バイト目以降を削除したい
2.5バイト目が半角英数字なら6バイト目以降を削除(つまり1〜5バイト目残し)
3.5バイト目が日本語コードなら7バイト目以降を削除(つまり1〜6バイト目残し)
どうやれば一番効率がいいですか?
0440nobodyさん
2006/02/05(日) 08:54:14ID:???0441nobodyさん
2006/02/05(日) 09:45:39ID:???my $level = -1;
my @stack;
my $base = (my $p = [['*root*', []]]);
while(<DATA>){
m/^( *)(.*)$/;
my $count = length($1);
if ($count > $level){
$count > ($level+1) and die "Illegal data.";
push(@stack, $p);
$p = @{$p}->[-1]->[1];
} elsif ($count < $level){
foreach(1..($level-$count)){
$p = pop(@stack);
}
}
$level = $count;
push(@{$p}, [$2, []]);
}
array_dump($base->[0]->[1], '');
0442441
2006/02/05(日) 09:48:46ID:???{
my ($p, $marker) = @_;
my $mark = ['├', '│'];
foreach(0..$#{$p}){
$_ == $#{$p} and $mark = ['└', ' '];
print $marker, $mark->[0], $p->[$_]->[0], "\n";
@{$p->[$_]->[1]} and array_dump($p->[$_]->[1], $marker. $mark->[1]);
}
}
__END__
AAA
BBB
CCC
DDD
EEE
FFF
GGG
0443nobodyさん
2006/02/05(日) 10:33:20ID:V48VHYZU$word =~ s/^....[0-9]/^...../g; …?
0445nobodyさん
2006/02/05(日) 11:27:05ID:V48VHYZUだめぽなんです
0446nobodyさん
2006/02/05(日) 11:35:15ID:V48VHYZUあれ書きかけで送信してしまった
いちおう自分でどうにか書いたんですが\x81が
おかしくなるんですよね
$words = substr($word,0,6);
if ($words =~ m/^....[\x20-\x7f\xa0-\xdf]/)
{
$words = substr($words,0,5);
}else {
$words;
}
0447nobodyさん
2006/02/05(日) 11:40:22ID:???0448nobodyさん
2006/02/05(日) 11:45:31ID:V48VHYZU”どこを”ですか?
0449nobodyさん
2006/02/05(日) 11:47:52ID:???0451nobodyさん
2006/02/05(日) 12:17:55ID:???0453nobodyさん
2006/02/05(日) 12:48:54ID:???0454nobodyさん
2006/02/05(日) 12:51:06ID:???正規表現を使うことすら頭に出てこないお子様なんだろうがな
おっと触っちまった、以下スルーよろ
0455nobodyさん
2006/02/05(日) 13:12:20ID:EWGu37QNその程度の知識でいきがってるようじゃw
0456nobodyさん
2006/02/05(日) 13:25:38ID:???0457nobodyさん
2006/02/05(日) 13:29:19ID:???0458nobodyさん
2006/02/05(日) 13:34:12ID:???0459429
2006/02/05(日) 22:55:31ID:???華麗なコーディングありがとうございました。
完璧です。多重配列を使いこなせる人はスゴイ。
自分もいろいろと考えてみた結果
・自分の状態("└"か"├")
・自分の全ての親の状態("│"か" ")
が分かれば木構造が作れるのに気付いたので
1. 逐次走査して全項目の状態("└"か"├")を調べて記録する
2. もう一度逐次走査して親の情報を作りながら木構造を作っていく
とすることで目的の処理ができました。(再帰と多重配列は使わず)
お世話になりましたー。
0460nobodyさん
2006/02/06(月) 11:55:45ID:kZ4iy7FBhtmlのtextareaの内容を入力として、外部の実行ファイル(例えばsort等)に投げて、
htmlとして出力を得るような方法はありますか?
perlコーディングと関係ないかもしれませんがよろしくお願いします。
0461nobodyさん
2006/02/06(月) 12:16:51ID:???>>1
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
■こんなCGI作ってください■ Part.2
http://pc8.2ch.net/test/read.cgi/php/1133361560/
0462nobodyさん
2006/02/06(月) 18:28:41ID:???そのコードを見てみたかったな。
考えてみたけど、こんなのしか考えつかなかった。
my @data;
my $max = -1;
while(<DATA>){
m/^( *)(.*)$/;
my $level = length($1);
push(@data, [$level, $2, '']);
($level > $max) and $max = $level;
}
foreach my $level (0..$max){
my $found = 0;
foreach(reverse(0..$#data)){
if ($data[$_]->[0] < $level){
$found = 0;
} elsif ($data[$_]->[0] == $level){
$data[$_]->[2] .= ($found ? '├' : '└');
$found = 1;
} else {
$data[$_]->[2] .= ($found ? '│' : ' ');
}
}
}
foreach(0..$#data){
print @{$data[$_]}[2, 1], "\n";
}
0463429
2006/02/06(月) 23:52:11ID:???#勉強がてらに多重配列を使ってみました
while (<DATA>) {
m/^( *)(.*)$/;
$now = length $1;
push @data, [$now, $2, 0]; # [階層の深さ, 項目名, "├"なら0、"└"なら1]
$tmp[$now] = $.-1; # 階層毎に一番最後に出現した行の「行番号-1」を記録
$max = $now if $now > $before;
if ($now < $before) {
$data[$tmp[$_]][2] = 1 for $now+1..$max;
$max = $now;
}
$before = $now;
}
$data[$_][2] = 1 for @tmp;
$before = 0;
@tree = ('│', ' ', '├', '└');
for (0..$#data) {
$now = $data[$_][0];
if ($now > $before) { push @parent, $data[$_-1][2]; }
elsif ($now < $before) { pop @parent for 1..$before-$now; }
print $tree[$_] for @parent;
print $tree[$data[$_][2]+2], $data[$_][1], "\n";
$before = $now;
}
0464nobodyさん
2006/02/07(火) 01:09:36ID:???なるほど。
> if ($now < $before) {
> $data[$tmp[$_]][2] = 1 for $now+1..$max;
> $max = $now;
> }
この処理で、一回のループで行けるわけですね。
ありがとう。
0465nobodyさん
2006/02/07(火) 06:10:53ID:wug3jbil1: 自分はこういう事がしたい。→ 計算機
2: それでこんな風にやってみたが・・・ → やってみましたけど…
3: こんなエラーが出て上手く行かなかった。
→ 2**64 = 1.84467440737096e+019
実数ではなくてこんななっちゃいましたorz
アドバイスお願いします
0466nobodyさん
2006/02/07(火) 06:19:53ID:???0467nobodyさん
2006/02/07(火) 06:28:08ID:wug3jbilこんな時間にありがとうございます
多倍長整数なんて初めて聞きました
bigintをどうすればおkなんでしょうか?
0468nobodyさん
2006/02/07(火) 06:28:57ID:???0469nobodyさん
2006/02/07(火) 06:32:44ID:wug3jbil#!/usr/bin/perl
use bigint
↑たったこれだけっすか?
0470nobodyさん
2006/02/07(火) 06:35:16ID:???";" を忘れずに
0471nobodyさん
2006/02/07(火) 06:38:16ID:???$ perl -e "use bigint;print 2**64;"
18446744073709551616
0472nobodyさん
2006/02/07(火) 06:39:39ID:wug3jbilん〜エラーになるんですよね…
Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
Can't locate bigint.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .)
at C:\httpd\www\tes.cgi line 3.
BEGIN failed--compilation aborted at C:\httpd\www\tes.cgi line 3.
0473nobodyさん
2006/02/07(火) 06:41:39ID:???____ 、ミ川川川彡
/:::::::::::::::::::::::::""'''-ミ 彡
//, -‐―、:::::::::::::::::::::三 ギ そ 三
___ 巛/ \::::::::::::::::三. ャ れ 三
_-=三三三ミミ、.//! l、:::::::::::::三 グ は 三
==三= ̄ 《|ll|ニヽ l∠三,,`\\::三 で 三
/ |||"''》 ''"└┴‐` `ヽ三 言 ひ 三
! | / 三 っ ょ 三
|‐-、:::、∠三"` | ヽ= U 三. て っ 三
|"''》 ''"└┴` | ゝ―- 三 る と 三
| / ヽ "" ,. 三 の し 三
| ヽ= 、 U lヽ、___,,,...-‐''" 三 か て 三
. | ゝ―-'′ | |::::::::::::_,,,...-‐'"三 !? 三
ヽ "" ,. | | ̄ ̄ ̄ 彡 ミ
ヽ、___,,,...-‐''" ,,..-'''~ 彡川川川ミ
厂| 厂‐'''~ 〇
| ̄\| /
0475nobodyさん
2006/02/07(火) 06:52:10ID:???0476nobodyさん
2006/02/07(火) 06:55:34ID:wug3jbilもダメぽ・・
5.6…だたよママン
0477nobodyさん
2006/02/07(火) 13:36:58ID:???print "content-type: text/plain; charset=Shift_JIS\n\n";
Shift_JIS のところは編集してるファイルの文字コードにあわしてね
0479nobodyさん
2006/02/07(火) 14:04:11ID:???いい加減にしろよ
0480nobodyさん
2006/02/07(火) 14:26:12ID:???それかコンソールで確認するか…
0481nobodyさん
2006/02/07(火) 14:33:11ID:???require "./jisaku.pl";
などファイルをインクルードする文を実行する命令を付け足すと、画面が真っ白になってどうにもなりません。
require命令を消して実行すると上手くいきますが、
どうしてもファイルを分割してコーディングしたいです。
どうにかなりませんか。
0482nobodyさん
2006/02/07(火) 14:36:58ID:???0483481
2006/02/07(火) 14:50:54ID:???してません。
私は、新しく作るサブルーチンは全てメインファイルに記述し、
動作確認ができてから分割するという習慣をとっていますし、
jisaku.plから呼び出し元の関数を呼んでいたりはしません。
で、気づいたんですが、kentwebさんのlight.cgiを見てみると
require命令にシングルクォートを使っているので、もしかしたらダブルクォートを使ったのが
いけなかったんじゃないか・・・と思います。
でももうコーディングする時間がないので誰か誰かあああぁぁぁぁぁん。
0484nobodyさん
2006/02/07(火) 15:04:53ID:???0486nobodyさん
2006/02/07(火) 15:35:38ID:???ツリーって下から考えたら楽じゃね?
my @data = reverse <DATA>;
my (@tree, @rule, $depth);
foreach (@data) {
/^( *)(.+)/;
$#rule = $depth = length($1);
$rule[$_] = !!$rule[$_] for 0 .. $depth-1;
$rule[$depth] = 2 + !$rule[$depth];
unshift @tree, join '', (' ','│','├','└')[@rule], $2, "\n";
}
print @tree;
0487nobodyさん
2006/02/07(火) 15:50:34ID:???bigint プラグマが用意されたのは 5.8.0 から。
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perl58delta.pod#New_Modules_and_Pragmata
Math::Bigint の使い方はドキュメントを。
http://search.cpan.org/~tels/Math-BigInt-1.77/lib/Math/BigInt.pm
>>481
君のスクリプトの二行目に
use CGI::Carp qw(fatalsToBrowser);
を挿入し、出てきたエラーメッセージを読んで解決なさいな。
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI/Carp.pod
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perldiag.pod
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_require_EXPR
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#Scalar_value_constructors
0488nobodyさん
2006/02/07(火) 16:22:17ID:???0489nobodyさん
2006/02/07(火) 16:24:47ID:???0490nobodyさん
2006/02/07(火) 20:42:51ID:???って書いてあるんだけど、そんなことしなくてもちゃんと動くし最後のhtml出力でシフトJISに指定やれば
問題なく表示されますよね。
なんかやるメリットってあるんでしょうか?
0493nobodyさん
2006/02/07(火) 20:57:09ID:???0494nobodyさん
2006/02/07(火) 21:03:41ID:???起き得る不都合とその回避方法を把握しているなら、別にどの
文字コードでスクリプトを書こうが問題無い。
ただ、今の perl は UTF-8 を前提に動いているし、UTF-8 なら
Shift_JIS を直接扱う時のように ASCII とのバッティングが起こら
ないし、EUC-JP は日本ローカルな文字コードであるのに対し
UTF-8 は世界的に使われている文字コードなので、まだ UTF-8
の認知度が低かった数年前ならともかく、現時点でこれら3つの
中から選ぶなら UTF-8 が「無難な選択」になる。
0495nobodyさん
2006/02/07(火) 21:15:58ID:???テキスト処理で速度が必要な場合は、その文字コード用に
コード書いた方が断然よい。前にJISのテキスト処理をutf8で
やったら、変換に時間かかりすぎて使い物にならなかった。
0496nobodyさん
2006/02/07(火) 22:07:16ID:???> コード書いた方が断然よい。
> 前にJISのテキスト処理をutf8で
> やったら、変換に時間かかりすぎて使い物にならなかった。
頭大丈夫?
0497nobodyさん
2006/02/07(火) 23:33:23ID:???#名前
<tr>
<td class=r align=right width=110>名前 <font color=red>※</font></td>
<td class=r width=440>
<input type=text name=name size=30 style='ime-mode:active' value="$cnam"></td>
</tr>
# 項目1
print "<input type=radio name=hoge value=\"A\" checked>A \n";
print "<input type=radio name=hoge value=\"B\">B \n";
リターンメールで
$mbody .= "名 前 = $in{'name'}\n";
はメールの本文にちゃんと出るのに
$mbody .= "項目1 = $in{'hoge'}\n";
は表示されません。。
考えられるミスがわかる方ご指摘お願いいたしまするー
0498nobodyさん
2006/02/07(火) 23:44:44ID:???0499nobodyさん
2006/02/07(火) 23:49:25ID:???0500nobodyさん
2006/02/07(火) 23:57:58ID:???> 考えられるミスがわかる方ご指摘お願いいたしまするー
考えられる可能性は1つしかない
> $mbody .= "名 前 = $in{'name'}\n";
とエディタで書いた後でソースを保存したが
> $mbody .= "項目1 = $in{'hoge'}\n";
と書いた後でまだ保存してない。
0501nobodyさん
2006/02/08(水) 00:21:10ID:???0502nobodyさん
2006/02/08(水) 01:09:27ID:???$in{'hoge'}にABとでも入ってほしいのかの。
フォームのデコード処理が甘いと空になっちゃうかもね。
0503497
2006/02/08(水) 01:15:50ID:???http://s1.muryo-de.etowns.net/~testjoy/order.txt
これの # 配達方法 が メールで返ってきたときに空白なんですよ。。
なぜかしら?
0504nobodyさん
2006/02/08(水) 01:48:32ID:???init.cgi が見れないと分からん。
以後は下のスレにでも移動してくれ。
自分の作ったCGIスクリプトをデバッグするスレ
http://pc8.2ch.net/test/read.cgi/php/1011174442/
0505nobodyさん
2006/02/08(水) 01:57:25ID:???モジュールわんさかのスクリプトを書く人の
2種類しかいない Perl 界隈。
0506nobodyさん
2006/02/08(水) 02:03:33ID:???0507nobodyさん
2006/02/08(水) 02:19:56ID:???0508nobodyさん
2006/02/08(水) 02:51:38ID:???0509nobodyさん
2006/02/08(水) 03:17:07ID:???0511nobodyさん
2006/02/08(水) 04:34:41ID:???コピペしてでも自分のソースに必要最小限だけしか入れたくない
じゃないのかな
0512nobodyさん
2006/02/08(水) 22:25:24ID:VDqpPhRjそれを年、月、日、時、分、秒 で返したいんですがどのようにするといいですか?
0513nobodyさん
2006/02/08(水) 22:28:04ID:???秒っていつからの秒だよ
とりあえず
■こんなCGI作ってください■ Part.2
http://pc8.2ch.net/test/read.cgi/php/1133361560/
0516nobodyさん
2006/02/09(木) 02:07:08ID:???0517nobodyさん
2006/02/09(木) 04:00:41ID:???任意ってのは好きな時間を入力できるって意味で、何時の時間を基準とするかが示されていない
1970が基準とするならgmtimeでもlocaltimeでも好きなのを使え
1970以前なら・・・俺にゃわからんので他の人おながい
0518nobodyさん
2006/02/09(木) 04:04:11ID:I2pVJ8U2ソースから消すのはもちろん簡単ですが、サイト上からそれを削除できるようにしたいのです
●●.datというファイルから特定の行を削除orそれ以外を保存するというのはどういった方法がいいのでしょうか?
先輩方のご指南よろしくお願いいたします
0519nobodyさん
2006/02/09(木) 04:04:46ID:???起算する日時分の秒数を足してlocaltime()なんかで変換。
■ このスレッドは過去ログ倉庫に格納されています