Perl コーディング初心者質問コーナー Part36
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/07/14 13:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0202nobodyさん
04/07/27 12:41ID:???そうでないならsortは文字列比較がデフォルトなので、<=>を
使った比較を明示しないとおかしくなるよ。
0203nobodyさん
04/07/27 12:48ID:5NNnTCFI最大値取るだけで、意味不明なことやりすぎ。
↓で十分だろ
while(<IN>){
if (m/^(\d+),/) {
$max = $1 if $max < $1;
}
close (IN);
0204nobodyさん
04/07/27 13:20ID:YbDKdELb0206nobodyさん
04/07/27 14:10ID:???@hoge2=( "1", "2", "4", "5" );
foreach(0..@hoge1 -1){
if($hoge1[$_] ne $hoge1[1+$_] ){
push(@hoge3,$hoge1[$_]);
}
}
foreach(0..@hoge2 -1){
foreach$wk(0..@hoge3 -1){
if($hoge3[$wk] eq $_){
push(@hoge4,$_);
}
}
}
結果
@hoge4の中身
"1"
"4"
"5"
質問させて頂きます。
@hoge1、@hoge2の要素を比較して同一だった要素を
@hoge4のように1つだけ取り出す為に上記のようにしてみましたが
効率が悪いような気がします。
もっとスマートに出来る方法はないでしょうか?
0207206
04/07/27 14:21ID:???0208nobodyさん
04/07/27 14:27ID:???foreach (@hoge1) { $h{$_} = 1; }
@hoge4 = grep {$h{$_}} @hoge2;
一例としてはこんなとこか?
0209黒死犬 ◆EgxBlf8nvc
04/07/27 14:30ID:???my $m = 0;
my $n = 0;
while($m <= $#hoge2 and $n <= $#hoge3) {
if($hoge2[$m] < $hoge3[$n]) {
push(@hoge4, $hoge2[$m++]);
} else {
$hoge2[$m] == $hoge3[$n] and $m++;
push(@hoge4, $hoge3[$n++]);
}
}
テストしてないので動作に保証出来ません(単にマージしただけだけど)
Perlだと、組み込みのハッシュ使った方が早いかも
0210nobodyさん
04/07/27 16:02ID:???後はこんなんとか、
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print sort keys %{{map{($_ => 1)}@hoge1,@hoge2}};
0212206
04/07/27 17:35ID:???grepを使って何とか出来ないかと思っていたのですが
hashを利用しての真偽判定でしたか。
大変参考になりました。どうもありがとうございました。
0213nobodyさん
04/07/27 17:41ID:???@hoge3みたいに重複した要素を取り除いた結果が欲しかったら
@hoge1 = grep(!$h{$_}++, @hoge1);
0214nobodyさん
04/07/27 17:47ID:???0215nobodyさん
04/07/27 17:53ID:???いるとしたらどんなツールを使っていますか
0216nobodyさん
04/07/27 17:59ID:???あ、そか、勘違い。
すません、じゃこれ
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
0217nobodyさん
04/07/27 18:03ID:???重複した要素を取り除くなら、これ
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{!exists ${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
0219nobodyさん
04/07/27 19:35ID:OzHvZIRFhttp://tech.millto.net/~pngnews/kndh/PngSpec1.2/PNG-CRCAppendix.html
リンク先のアルゴリズムを単純にPerlに書き換えてみたんですが
全然CRC32にならなくお手上げになってしまいました。
原因はどこにあるのでしょうか?
ご教授の程宜しくです。
一応ソース貼っておきます。
テストなんでいきなり文字列渡してsplitして、最後は整形して返してますが。
print &getCRC('string');
sub getCRC {
my ($c, $n) = 0xffffffff;
unless (defined @crcTable) {
for (0..256) {
$crcTable[$_] = $n = $_;
$crcTable[$n] = $crcTable[$n] & 1 ? 0xedb88320 ^ ( $crcTable[$n] >> 1 ): $crcTable[$n] >> 1 for 0..7;
}
}
$c = $crcTable[ ($c ^ $_) & 0xff ] ^ ($c >> 8) for split //, shift;
return sprintf "%08x", $c ^ 0xffffffff;
}
0220219
04/07/27 19:39ID:???0221nobodyさん
04/07/27 19:59ID:???# やはり Pure Perl 実装に需要があるのかな…。
以前同じものを作ってたヤツ。動くかどうかは知らん。:p
my @crc = (0..255);
for my $c (@crc) {
$c = $c & 1 ? 0xedb88320 ^ ($c >> 1) : $c >> 1 for 0..7;
}
sub crc {
my $str = pop;
my $len = length $str;
my $pos = 0;
my $crc = 0xffffffff;
# CPU を食うが恐らく省メモリ
$crc = $crc[ ($crc ^ ord(substr $str, $pos++, 1)) & 0xff ] ^ ($crc >> 8)
while $len--;
# メモリを食うが恐らく高速
# $crc = $crc[ ($crc ^ $_) & 0xff ] ^ ($crc >> 8)
# for unpack 'C*', $str;
pack 'N', ~$crc;
}
0222nobodyさん
04/07/27 21:00ID:cIaHUHzzすみません、最大値を取る参考にしようとしていますが、
コードがシンプルすぎて、私のような初心者には
どういう動作をしているのか、わからないので
少し解説していただけないでしょうか?
m/^(\d+),/ この部分がどういう動作をしているのかがまず、わからないのですが。
それからどういう仕組みで$1が出てきて、中に
何が入ってくるのでしょうか?
それから$maxに$1という変数の値を入れた後に
if で$max < $1という条件比較をしてますが、真
だったときの実行内容が省略されていてわかりません。何が省略されているのでしょうか?
0223nobodyさん
04/07/27 21:10ID:AqRc0k7e以前、ここのスレッドで教えて頂いた内容を参考に
open(LOGFILE,">>log.csv");
print LOGFILE "\"あああ\nいいい\"";
close LOGFILE;
と記述し、Excelで開いた場合にもセル内で
改行が行われるようになりました。
ですが、改行して保存されるようにはなったのですが、
-----------
あああ・
いいい
-----------
のように、改行の部分に「・」と言った
不要な文字が表示されてしまいます。
これを、表示させないようにするにはどのようにすれば良いのでしょうか?
0224nobodyさん
04/07/27 21:14ID:???> m/^(\d+),/
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
> if で$max < $1
http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm#6-7
0226200
04/07/27 21:48ID:cIaHUHzz$genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';# 会場データファイル名
$act = "edit";
###### 会場データの読み込み ######
&lock;
open KAIBA,"$kaibadata" or die &error("会場ファイルが開けません");
@kaiba = <KAIBA>;
my $n;
$n = 0;
foreach $kaiba(@kaiba) {
chomp $kaiba;
($kai_id,$kai_name,$kai_tan,$kai_syoku,$kai_busyo,$kai_tel,$kai_fax) = split(/<>/,$kaiba);
if ($kai_name eq $kaibamei){$act = ""; print "同一の会場名が存在します。<br>";
print "既存会場名・・・$kai_name<br>\n";
print "入力した会場名・・・$kaibamei<br>\n";
print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
&unlock;
}
$kai_tel =~ tr/0-9//cd;
if ($kai_tel eq $kaibatelno){$act = ""; print "同一電話番号の会場がすでに存在します。<br>\n";
print "既存会場電話番号・・・$kai_tel<br>\n";
print "入力電話番号・・・$kaibatel<br>\n";
print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
&unlock;
}
}
}
長いのでいったん切ります。
0227200
04/07/27 21:50ID:cIaHUHzz### 追加会場ID生成
while(<KAIBA>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
$new_kai_id = (((sort keys %record))[-1]);
$new_kai_id++;
close (KAIBA);
ここで、$new_kai_idの中身が1になってます。
0228200
04/07/27 21:51ID:cIaHUHzz###### ロックファイル処理 ######
sub lock {
local($flag) = 0;
foreach (1 .. 5) {
# ロックファイルが存在すれば1秒待つ
if (-e $lockfile){ sleep(1);}
# ロックファイルが存在しなければ生成する
else {
open (LOCK,">$lockfile");
close (LOCK);
# ロックに成功したらフラグを立てループを抜ける
$flag = 1;
last;
}
}
}
### --- ロックファイル処理 END --- ###
###### ロックの解除 ######
sub unlock {
if (-e $lockfile) {unlink($lockfile);}
}
### --- ロックの解除 END --- ###
0230200
04/07/27 21:52ID:cIaHUHzz100001<>○○ホール <>鈴木<>青 <>777<>0552-99-0000 <>0552-99-0000
100002<>○○公園 <>佐藤 <>黄 <>777<>044-999-0000 <>044-999-9999
100003<>○○○第2別館 <>田中 <>白 <>777<>03-9999-0000 <>03-9999-9999
1<>○○駅前広場<>テスト<>テスト<>777<><>
1<>test<>test<>test<>default_bumon<>111<>111
1<>テスト<>テスト<>テスト<>596<>1<>2
このような感じです。
0232219
04/07/27 21:55ID:???どーもです。
返り値を
unpack 'H*', $crc;
でバッチリでした;-)
ありがとです。
>>229
どーもです。
幸せを探してきます。
0233200
04/07/27 22:03ID:???読み方でおもろそうだったので。
別に日本語が不自由なわけじゃないですよ。
0234nobodyさん
04/07/27 22:04ID:???%recordの中身みたか? 多分からっぽだと思うのだが。
KAIBAファイルハンドルはopen直後の
@kaiba = <KAIBA>;
で全部読み出されてしまっているハズ。
あとこの問題とは関係ないがそのロックは全くなってない
ので勉強して書き直すこと。
0235nobodyさん
04/07/27 22:06ID:???0236200
04/07/27 22:20ID:cIaHUHzzありがとうございます。
@kaiba = <KAIBA> で
<KAIBA>の中身が@kaibaにコピーされると思って
おりました。取りだされていたのですね。
ロックの方はなんとか勉強しなおそうと思います。
0238200
04/07/27 23:01ID:cIaHUHzz応答が返ってこなくなるんですね。
もう一度開きなおすしかないのでしょうか。
0239nobodyさん
04/07/27 23:10ID:???実際に組むのはそれからだ。
無限ループ起こすような奴は一から出直せ。
0241nobodyさん
04/07/27 23:48ID:5NNnTCFI$genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';
とりあえず、cgiとdataは違うディレクトリに置いとけよ
ロックはお前みたいな初心者は素直にflock使っとけ。
XPならflock使えるし
0242nobodyさん
04/07/28 06:05ID:GXYYbYLCCGIだけ詳しい友達に作ってもらったのだけど
この度HPリニューアルしたら、CGIだけがうまくいきません。
(アクセス権等は変更しました)
何かいじったわけではないし、その部分はそのままにしておいてはずなのに
(そこだけはそのままおいておいて新しいページとリンクしただけですが)
nobody@××.ne.jpという中身のない注文書がきます。
今ではHP注文もきて、傾いている店も繁盛してきたのに
どうしたらいいか・・・親の視線がいたいです
助けてください
0244nobodyさん
04/07/28 06:17ID:???ここで聞くのは筋違い。
じゃなければ金出してプロに頼め。
0247nobodyさん
04/07/28 18:30ID:+xurfTPEそのCGIにアクセスがあったときに、
そのフォルダ内のHTMLファイルを返すにはどうしたらいいのでしょうか?
ググろうにも・・・どうキーワードを打ち込んでいいのか分からないのでここへ来ました。
# 今はprintでJavaScriptを含むHTMLを出力して、
# そのJavaScriptで目的のHTMLファイルを読み込ませているのですが、
# どうも・・・
0251nobodyさん
04/07/28 18:47ID:???ここ書込んだときに「しばらくおまちください」みたいなページ出たよな?
それが答えの1つだ。
あとは。。。ロケーションヘッダでぐぐれ
0253nobodyさん
04/07/28 19:23ID:H19oR7ELそこでcronを使って実現しようとしているのですがうまくいきません。
■動かしたいファイル:xxx.cgi
(4行目で require 'abcd.pl'; を記述してます)
■実行した手順
telnetでログイン
↓
crontab -e
↓
0-59/10 * * * * /home/www/●●●/public_html/xxx.cgi
↓
:x で終了
すると、line 4. (実行しているファイルの4行目)がエラーだと
いう記述のメールは届いてしまいます。
メールの原文は下記の通りです。
Can't locate ./abcd.pl
in @INC (@INC contains: /usr/local/lib/perl5/site_perl/5.005/i386-freebsd
/usr/local/lib/perl5/site_perl/5.005 . /usr/libdata/perl/5.00503/mach
/usr/libdata/perl/5.00503)
at /home/www/●●●/public_html/xxx.cgi line 4.
上記の通りなのですが、
うまく実行させるにあたりご教授願えればと思います。
0254247
04/07/28 20:05ID:???>>248
ごめんなさい。
>>249-250
それでググってみます。
>>251
しばらくお待ちくださいから飛ぶのはmetaタグのやつですよね。
JavaScriptでもmetaタグでも、どっちにしてもページを介さなければならないのが
ちょっと・・・
「ロケーションヘッダ」でもググってみます。
0256nobodyさん
04/07/28 20:10ID:???0259nobodyさん
04/07/29 07:52ID:Y1hnbGEZWhileの前でもう一度ファイルを開いたら
なんとか動きました。これでお客さんになんとか見せれそうです。
ありがとうございました
0260nobodyさん
04/07/29 09:03ID:???通販サイトの注文CGIをPERLで作っていて疑問。オブジェクト指向で書き上げたいんだけど、
とりあえずEcomという名前のモジュールを作って、それのコンストラクタで単価、商品名等の基本部分を
設定。Ecomのコンストラクタが返すオブジェクトの初期プロパティに商品名とかのハッシュリファレンスを持たせる。
で、疑問なのはこのオブジェクトは当然モジュールEcomのメソッドを全て使用できるわけだけど
一体この場合のメソッドって一体何?
クラスにおけるメソッドの役割みたいなものがはっきりしない(理解できない)
っていうかどういう意味合いで使えばいいのかというか;ちょっと例を出してみる。
1.コンストラクタが返すオブジェクトの強化、改造のため
2.コンストラクタが返すオブジェクトのプロパティを参照して何らかの処理をして、呼び出し元に値を返す。
3.?思いつかない
未完成であるオブジェクトを完成させるのがクラスのメソッドなのか?みたいにも思うけど、
イマイチ。どう捉えれば一番すんなりいくのかな?
0261nobodyさん
04/07/29 09:44ID:???プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)
0262nobodyさん
04/07/29 14:11ID:???http://www5a.biglobe.ne.jp/~n_rieko/perl/10.htm
0263nobodyさん
04/07/29 14:34ID:???http://perl.infoware.ne.jp/documents/perlboot.ja.html
http://perldoc.jp/docs/perl/5.8.0/perltoot.pod
http://perldoc.jp/docs/perl/5.8.0/perltooc.pod
http://www.melma.com/mag/85/m00014785/a00000001.html
あと駱駝と黒豹と Effective Perl 。
0265nobodyさん
04/07/29 17:55ID:???Perl の配布パッケージに含まれている公式な説明書。> perldoc
和訳は駱駝本がそうであるとも言えるし、perldoc.jp のように有志の
手による部分訳もある。
0266522
04/07/29 19:47ID:???0268nobodyさん
04/07/29 19:57ID:???>>266
>>6を1行ずつ声に出して三唱。
_| ̄|○
0271nobodyさん
04/07/29 21:31ID:???0272nobodyさん
04/07/30 12:42ID:As0li0gB[0]から順に数字が入っている事が前提でかまいませんので。
0274nobodyさん
04/07/30 15:59ID:???Thx.ありがとう。
0275nobodyさん
04/07/31 00:34ID:k0R22EX12個以上配列の中に要素としてある数字を、
配列として読み込ませるにはどうすればいいですか?
具体的に言うと、
@array = (0,2,3,2,0,4,1);
こういう配列から
@req = (0,2);
こんな配列が作りたいんですけど・・・
0276nobodyさん
04/07/31 01:02ID:???$hash{$_}++;
}
for (keys %hash){
$hash{$_} > 1 and push(@req, $_);
}
0277275
04/07/31 01:08ID:k0R22EX1Thxです!
0278nobodyさん
04/07/31 01:10ID:???0279nobodyさん
04/07/31 03:22ID:???push(@req,$_) if $hash{$_} > 1;
の方がいいと思った。
0280nobodyさん
04/07/31 04:52ID:???foreach (@array) {
push @req, $_ if ++$hash{$_} == 2;
}
とループひとつで済ませるかな。
0281nobodyさん
04/07/31 08:53ID:???==2だと「要素が二個だったら」になるぞ。
0282nobodyさん
04/07/31 09:47ID:???@arrayに2回以上出現する要素を@reqにひとつずつ
入れるのだから、==でいいはず。>=2だと
@array=(2,2,2)のときに@req=(2,2)になっちゃう。
0283nobodyさん
04/07/31 11:26ID:JonE4G7Jperlを勉強しようと思いますが、
主にcpanを使ったwebプログラミングを作っていきたいと思いますが、
何をどこからやれればよいか途方に暮れています。_| ̄|○
参考になるサイトや本を探しても全然勉強にならない。
※ある程度知っている人向けが多い・・・_| ̄|○
猿でもわかるcpanやcpanを使ってのperlやcgiについて
参考になるサイトや書籍をご紹介いただければ幸いです。
お礼はアフィリエイトリンクを踏んで本を買います。
そしたら、利益供与(?)いたします。
0284nobodyさん
04/07/31 14:49ID:RsJc0bwQPerlやppm等のコマンドを打つと、
'perl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と表示されます。
何度か再インストールしても、Perlフォルダを消してみても同じでした。
どなたか解決策教えていただけませんか?
0285nobodyさん
04/07/31 14:53ID:???0286nobodyさん
04/07/31 15:04ID:???pathって打ってみて、表示されたリスト内にperl.exeのフォルダがなければパスが通ってない。
設定はシステム→詳細設定→環境変数から。pathを選んで好きな位置にフォルダを追加する。
(他のフォルダとは ; で区切る)
0287nobodyさん
04/07/31 15:25ID:???cpan、cpan言ってないでまずはperl自体を勉強汁。そうすれば、cpanのことも自ずと分かってくる。
ちなみに、webにあるperl講座とかは殆どが始めてやる香具師用だ。
それがちゃんと探してから言った言葉なら、冗談抜きで理解力無いんだと思うぞ。
perlの事がそこそこ分かってきて、cpanのライブラリも利用しようということになったら下のサイトが大いに役に立つだろう。
http://www.cpan.jp/
0288nobodyさん
04/07/31 15:28ID:RsJc0bwQpathと打つと、
PATH=C:\WINDOWS\system32;"%path%;C:\Perl\bin;C:\Perl\bin\;C:\WINDOWS;C:\WINDOWS\
system32\WBEM;
と表示されます。
perl.exeはC:\Perl\binに入っていたので、大丈夫だと思うのですが…。
0289nobodyさん
04/07/31 16:16ID:???0290nobodyさん
04/07/31 18:24ID:???おもいっきりおかしいとこあるじゃん!
0291nobodyさん
04/07/31 19:50ID:???何をどうやったらそんなものが紛れ込むんだろう
0292nobodyさん
04/07/31 22:49ID:JonE4G7Jdクス。勉強汁よ・・・
0293nobodyさん
04/08/01 02:50ID:???忘れてたんですが、ちょっと思い出して作ってみたんですが、どうでしょう。
Subjectは適当に付けて、Question&Answerはほどよくコピペするといいと思います。
http://xxxyz.zive.net/~the2/mod-perl/thefaq/faq.cgi
0295nobodyさん
04/08/01 07:05ID:???画像のURLがあった場合、その画像を拾ってきてサーバに保存する機能を付けたのですが、
画像のあるサーバが落ちている場合などは
connectがエラーを返すまでに時間がかかってしまいます。
connectがタイムアウトする時間を設定することはできないのでしょうか?
Windows上のサーバでCGIを動かすのでalarmが使えずに困っています。
0296nobodyさん
04/08/01 08:00ID:???0297295
04/08/01 08:47ID:???どういう画像が貼られるかわからないのでなんとも・・・
アプロダも似たようなものだと思うんですがどうなんでしょうね
0298nobodyさん
04/08/01 08:53ID:???0299295
04/08/01 09:43ID:???0300nobodyさん
04/08/01 11:30ID:???普通は timeout 設定できるやろ
君がどういうライブラリ/クラス/関数使ってるかわからんのでやりかたはなんとも言えんが
■ このスレッドは過去ログ倉庫に格納されています