トップページ⇒php
1001コメント308KB

【Perl】初心者コーナー Part15

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん02/08/08 23:19ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0855nobodyさん02/09/12 18:18ID:???
>>854
<BR> を改行に変換したかったんじゃないのか?
0856nobodyさん02/09/12 18:22ID:V0oL4dfD
なんかファイル処理でDBM使わされることになったんですが、ファイルロックがイマイチ分かりません。

sub Filerock {

my $now = time();
my $lockfile = "lock";
my $locking = "lock.now";
for($_=5; $_>=0; $_--){
if(rename($lockfile, $locking)){
utime($now, $now, $locking);
$SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "intProc"; # 割り込みで中断するときの処理を定義
&Dbmopen;
return;
}
sleep 1 if $_;
}

&Header("フォームエラー");
print "<h2>ロックちう</h2>\n<hr>\n";
&Footer;
exit;
}


こんなんで良いんでしょうか。
もっと効率の良いコードがあればアドヴァイス願います。
0857nobodyさん02/09/12 18:25ID:???
ダミーファイルでも開いてflockしとけ
0858nobodyさん02/09/12 18:31ID:NNUPZyEk
http://yahooo.s2.x-beat.com/
0859nobodyさん02/09/12 18:32ID:???
>>851
$NUM.jpg
と
$FileAddress$NUM.jpg
違うよ
0860nobodyさん02/09/12 18:49ID:???
>>859
それで?
0861初心者厨房02/09/12 19:24ID:jvK2X5HW
Perlの勉強を始めたばかりの初心者です。ちゃんと書いたつもりなんですがうごきません。
どうしてなんでしょうか。教えてください。お願いします。
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print 10+5 # 足し算
print " / "; # 区切り
print 10-5; # 引き算
print " / "; # 区切り
print 10*5; # 掛け算
print " / "; # 区切り
print 10/5; # 割り算
print " / "; # 区切り
print 10%5; # 剰余算

_END_
0862nobodyさん02/09/12 19:26ID:???
print 10+5 # 足し算
0863nobodyさん02/09/12 19:27ID:???
print 10+5 # 足し算
↓
print 10+5; # 足し算

エラーメッセージぐらい読め
0864nobodyさん02/09/12 19:31ID:???
>>863
氏ね!
0865nobodyさん02/09/12 19:33ID:???
>>864 ハァッ!!!!!!!!!!!!!!!!!!!!!?
0866nobodyさん02/09/12 19:34ID:???
>>863
揚げ足取りは氏ね!
0867nobodyさん02/09/12 19:38ID:???
>>865
氏ね!
0868nobodyさん02/09/12 19:38ID:???
>>866
何が揚げ足取りなんだ?
0869nobodyさん02/09/12 19:39ID:???
( ● ` ∇ ´ ● )ガオー
0870初心者厨房02/09/12 19:54ID:ODncwTzE
ありがとうございます。わかりました。ところでエラーメッセージのどこをみればわかるのですか?
0871nobodyさん02/09/12 20:01ID:???
>>870
もう(#・∀・)カエレ!
http://pc.2ch.net/test/read.cgi/php/1028646335/
↑みてこい
#!/usr/local/bin/perl -w
か
perl -wc hoge.pl

print 10/5;
print " / ";
↑きもい書き方やめれ
$f=10/5;print "$f /";
0872名無しさん@Meadow02/09/12 20:07ID:???
>>864-870
荒らしさん、こんにちは
あなたの存在がエラーです
0873初心者厨房02/09/12 20:08ID:ODncwTzE
ほんとに始めたばっかでなにがなんだかわかんねーんだからしょうがねーだろ。
0874nobodyさん02/09/12 20:11ID:???
< ● ` ∀ ´ ● > < >>873 一緒に祖国に帰るニダ
0875nobodyさん02/09/12 20:15ID:???
1 :ぼぶ ◆EMrmvKLI :02/09/10 19:18 ID:G4zqfa38
これはいろんなとこにコピペしてください。
みんなで台風を起こしましょう。
東京駅を中心に右回りです。
9月22日夜9時にみんなでいっせいに「フゥー」と吹くのです。
注意
周りに障害物のないところでやりましょう(なるべく高いところ)
「フゥー」以外に扇風機やうちわを使ってもかまいません。
       !東京を壊しましょう!
0876初心者厨房02/09/12 20:15ID:ODncwTzE
帰ります・・・>>874
0877nobodyさん02/09/12 21:03ID:???
#!/usr/local/bin/perl
print "Content-type: text/html\n\n;


$atai='値';
print '「$atai」(シングルクォート文字列では展開されない)/';
print "「$atai」(ダブルクォート文字列では展開される)";

_END_
何がまちがってんの?
0878nobodyさん02/09/12 21:11ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0879nobodyさん02/09/12 21:20ID:???
で、>>861 = >>877 なんでしょ?(プ
0880 ◆4XfSMGTg 02/09/12 21:21ID:???
糞な質問ばっかりだな
0881nobodyさん02/09/12 21:22ID:???
まぁね。みりゃわかるっしょ>>879
0882nobodyさん02/09/12 21:54ID:???
てゆーか最近カマッテ君が住みつきだしたのはなんで?こんなとこに。
上級者ぶってツッコミ入れてるのも知ったかぶりだからとんちんかんだし
とりあえず初心者嘲笑いたいなら的確に回答してやってからにするのが筋ってもんじゃないの
0883nobodyさん02/09/12 22:47ID:???
何でもかんでも答えるのは如何なものかと。
0884nobodyさん02/09/12 23:03ID:???
◆4XfSMGTgの発言禁止依頼しました
0885nobodyさん02/09/12 23:03ID:???
答えないでいるならいいが、質問馬鹿にするだけしといて
そいつ自身答えられないパターン多すぎなのも見ててうざ
0886nobodyさん02/09/12 23:28ID:???
下手に答えて自分がバカにされるのが嫌なんだろ、きっと。
0887nobodyさん02/09/12 23:29ID:???
>>882=885 煽られた初心者
0888nobodyさん02/09/12 23:39ID:???
>>887
いや今まで無視してたよ リアクションしてあげないのが一番だから。
ここに来て立て続けで軽く荒れてきたから
ちょうどいいかと思ってつっこんでみただけ。
0889nobodyさん02/09/12 23:54ID:???
で、結局釣られたのは>888というオチか
089088802/09/13 00:03ID:???
はいはいごめんよ 俺が悪かった。許してね。>>889

−−−−−−−−−−−−−−−−−−−−−−−−−−−

以下、普通のスレに戻って下さいませ。
0891nobodyさん02/09/13 00:08ID:???
場を乱すだけ乱しといて何を今更…
0892nobodyさん02/09/13 00:16ID:???
>>891
これ以上乱れないように882で釘さした形だと思うが。887とかが俺を煽ってきただけだし
申し訳ないがもうレスらないんでよろ
0893nobodyさん02/09/13 00:16ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
~~~~~~~~~~~~~~~~~~~~~~~~~~
0894nobodyさん02/09/13 03:15ID:R5wD3hCH
mbx形式のメールをmh形式にばらす
スクリプトを書こうと思ってます。

mbxは複数のメールが1つのファイルになっていて
ピリオドだけが書かれた行がメールの区切りになっ
てます。そのmbxファイルを1つ1つのメールに
ばらして連番で出力したいのです。

#書いたプログラム-mbx.pl
open(OUT,">$n");

while(<STDIN>){
unless(/^\.$/){
print OUT;
}
else{
++$n;
}
#ここまで

で、実際にperl mbx.pl < hoge.mbx
とすると1に全て出力されてしまいます。
なにがいけないんでしょう?
0895nobodyさん02/09/13 03:17ID:???
>>894
追記
最初に$n = 1;で初期化してます。
0896nobodyさん02/09/13 03:17ID:???
>894
改行文字忘れてるよ
0897nobodyさん02/09/13 03:25ID:???
>>896
ごめん意味わからない。どこにつけ忘れてるの?
0898nobodyさん02/09/13 03:29ID:???
>897
unless(/^\.\n$/){
かな?
0899nobodyさん02/09/13 03:42ID:???
>>898
指摘サンクス。
あとはどうすれば連番で出力できるのか
教えてくらはい。
0900nobodyさん02/09/13 03:43ID:???
>894
てか unless( $_ eq ".\n" ) でいいんじゃ...
0901nobodyさん02/09/13 03:56ID:???
メール本文に.\nがあったらまずいかな
と思ったんだけど。。。
0902nobodyさん02/09/13 04:04ID:???
>>899
open(OUT,">$n");
をwhileの中に入れてないからでわ?
0903nobodyさん02/09/13 04:05ID:???
何がしたいのかイマイチわからないけど
こういう事か?

$n = 0;
while(<STDIN>){
next if($_ eq ".\n");
++$n;
open(OUT,">$n".'.mh');
print OUT;
close(OUT);
}

>>901
区切りに使われてるものが本文中に無変換で置かれてることは
ないだろう。もしあったらシステムが破綻する。
0904nobodyさん02/09/13 04:05ID:???
>899
こんな感じでどう?

$n = 0;
loop: {
 $n++;
 open( OUT, ">$n" );
 while ( <> ) {
  if ( $_ eq ".\n" ) {
   close OUT;
   redo loop;
  }
  print OUT;
 }
}
0905nobodyさん02/09/13 04:15ID:???
>>904
書き込みで開いたら何も出てこないぞ…(;´Д`)
0906nobodyさん02/09/13 04:16ID:???
>905
?
090790502/09/13 04:29ID:???
ごめん、勘違い。
0908nobodyさん02/09/13 04:30ID:???
>区切りに使われてるものが本文中に無変換で置かれてることは
>ないだろう。もしあったらシステムが破綻する。
よく考えたらそうですよね。

>>903>>904
両方試したけど各行ばらばらになって出力されてしまいます。
.mbxの改行コードはlfなんですが。

なんでだろう。。
0909nobodyさん02/09/13 04:32ID:???
>908
ばらばらって?
091089402/09/13 04:35ID:???
$n = 1;
open(OUT,">$n");

while(<STDIN>){
unless(/^\.\n/){
print OUT;
}
else{
++$n;
open(OUT,">$n");
}
}

で自己解決しました。
説明が下手でちゃんと伝わらなかったみたいでスマソ。
091189402/09/13 04:37ID:???
>>909
hoge.mbxの内容が1行ずつ連番で出力されて、
7000.mhとかまでできた。
0912nobodyさん02/09/13 04:42ID:???
>911
そんなはずは......ちゃんとコピペしてくれた?
091389402/09/13 04:48ID:???
コピペしたはずなんだけど。。
>>903>>904どっち?
ちなみに両方同じ結果だった。。
0914nobodyさん02/09/13 04:51ID:???
>913
あ 904 なんだけどね......
うちではちゃんと動いたんだけどなぁ
まぁいいんだけど
091589402/09/13 05:05ID:???
>>914
はじめてのperlって本を一通り終えただけの
初心者だからredoとかloopが分からないのレス。
動かない理由がよく分からないけどサンクス!
0916nobodyさん02/09/13 15:55ID:???
$xxが"aa"でも"bb"でもないとき"cc"と表示するのを作りたいんですが

if ($xx ne "aa"|"bb"){
print "cc";
}

これじゃいつでも"cc"と表示します。何でですか?
0917nobodyさん02/09/13 15:57ID:???
if ($xx ne "aa" && $xx ne "bb"){
print "cc";
}
091890502/09/13 16:15ID:???
>>894 このくらいの説明は最初にしようよ
| > MBXファイルのフォーマットを公開して頂けないでしょうか?
|
|次の通りです。
|
|ヘッダ
|(ブランク行) --- CRLF1個だけの行
|本文
| --- 行頭に1個のピリオド(メール間の区切り文字)
|ヘッダ
|(ブランク行) --- CRLF1個だけの行
|本文
| --- 行頭に1個のピリオド(メール間の区切り文字)
|
|
| (注意)本文の行頭に「.」がある場合は、「..」というように「.」を1
| 個余分につけて保存されます。
0919nobodyさん02/09/13 16:48ID:+7b38iG7
dataディレクトリ内のディレクトリ一覧を取得しようと思って↓の
コード書いてみたんですが、いくつかディレクトリが存在するにも関わらず
「.」(ルート)と「..」(上)のディレクトリしか拾えないんですが、何かおかしな
点などありますでしょうか・・・

opendir(DIR, "data");
while($dir = readdir(DIR)){
  if(-d $dir){
    #処理・・・
  }
}
closedir(DIR);
092091902/09/13 16:51ID:+7b38iG7
すんません、分かりました

  if(-d $dir){

は

  if(-d "data/$dir"){

としないとダメですね。
0921nobodyさん02/09/13 17:50ID:???
ひとつのcgiファイルの容量はどれくらいまでOKなんでしょう?
特に気にする必要はない?
0922nobodyさん02/09/13 17:57ID:???
ワラた
0923nobodyさん02/09/13 18:17ID:???
>>921
10MBとか書いてみればどうでしょう?w
アクセスする人数にもよるけど
重たいものを書いたらすぐビジー出ますよ
0924 ◆JAPH9PWA 02/09/13 19:59ID:???
重たいものと大きいものは全く違うんじゃない?
数十行でも重い処理は書けるからね。

>>921
まず気にするほどのことは無いと思う。多分1MBくらなら問題ないでしょう。
プログラムが重いと感じたら処理の流れを見直すべし。

それと、「CGIファイル」じゃ意味が通じないんで「Perlスクリプト」や「スクリプトファイル」と表現するように。
上記の回答もそのような意図と解釈して書いてます。

0925名無しさん02/09/13 20:11ID:dJSmRC1R
新宿で居酒屋の誘いにモノスゴイ人数で付いて逝くオフ4
http://natto.2ch.net/test/read.cgi/off/1031911920/l50

キタ━━━━━━━(゚∀゚)━━━━━━━!!!!!
0926nobodyさん02/09/13 20:56ID:MTIQ7Fw0
変数の表記で変数名も変数である場合

$xx_(ここも変数)
()の変数は$yy

どう表記したらいいでしょうか?
0927nobodyさん02/09/13 21:07ID:???
${xx_}$yy
0928 ◆JAPH9PWA 02/09/13 21:22ID:???
{
my $xx_1 = "foo";
my $yy = 1;
no strict 'refs'; # シンボリックリファレンスを許可する(デフォルト)
print ${"xx_$yy"};
}
0929nobodyさん02/09/13 22:53ID:???
>>927
$xx_{$yy}
0930nobodyさん02/09/14 08:14ID:???
>>927, >>929
Can't use an undefined value as a symbol reference at test.3.pl line 8.

>>928
fooが出力されるべきところ何もでてこない

結局、どれでやってもだめレスが・・・


093193002/09/14 08:21ID:???
ゴメソ
>>928は、myを取ったら出力されました
わしの考えたのは

$var = "xx_" . $yy;
print $$var;

分かりやすくていいでしょ
0932 ◆JAPH9PWA 02/09/14 08:58ID:???
あ、そりゃmyがあればダメだよね。つい癖で…。
ごめん。
093392902/09/14 14:29ID:???
>>930
$xx{$yy}だたよ…
0934nobodyさん02/09/14 14:58ID:bLV5ATcL
AnyDBM使って多数のパラメータを扱うのですが、
データ数が多い場合はやはり幾つかのDBMに分けた方が良いのでしょうか。
それとも全部一括りにして1つのファイルにまとめた方が効率が良いのでしょうか。
ちと分からないので質問です。
0935nobodyさん02/09/15 00:34ID:???
>>934
ファイル1枚
・壊れやすそう
・壊れたら致命的そう
・サイズがでかそう
ファイル複数
・壊れにくそう
・壊れても被害は少なそう
・余計なデータは読まずに済むから軽そう
0936nobodyさん02/09/15 05:43ID:sdGpPtiV
特定の日付からgmtime?(1018470831みたいな数値)を逆算するには
どうしたらよかとでしょうか?
0937nobodyさん02/09/15 07:30ID:iaBuYHci
>>936
1900年からの経過秒数が知りたいの?
だったら、

use Time::Local;
print timelocal(0,0,0,15,8,102);

で9月15日0時0分0秒のそれが出てくる
0938nobodyさん02/09/15 11:34ID:???
短くて済む、という理由でrequireじゃなくてdoを使いたがっています。
ライブラリルーチンのインクルードは、requireを使った方が良いといわれていますが、
その理由がよくわからないので言う事を聞く気になりません。
うまい具合に違いを説明して僕を説得してください。
0939あ ◆4WVJTVm. 02/09/15 11:47ID:7pMxPAY1
whileで配列の処理をしていて、
途中である条件が一致した場合、現在処理している変数が何番目の変数なのかを知り、変数に数値を格納したいのです。
どなたかご回答よろしくお願いします
0940あ ◆4WVJTVm. 02/09/15 11:51ID:7pMxPAY1
ミス
>現在処理している変数が何番目の変数なのかを知り、 ↓
>現在処理している配列が何番目なのかを知り、
すみません
0941nobodyさん02/09/15 11:54ID:???
>>938
わたしは初心者なのですが、ライブラリをインクルードするのはdoではできな
いと思うのですが、具体例を示していただけませんでしょうか。
0942nobodyさん02/09/15 12:01ID:???
>>939
配列の番号は$array[$i]の$iです
for $i (0 .. $#array) {
if ($array[$i] == 0) {
$array[$i] = $num;
print "$i番目の配列要素の値に$numを代入しますた\n";
}
}
0943nobodyさん02/09/15 12:02ID:???
>>941
require "hoge.pl";
となっているところを
do "hoge.pl";
と置き替えるだけです。
一応平気で動作しています。
0944nobodyさん02/09/15 12:09ID:???
>>942
if ($array[$i] == 0) { って??
$array[$i] = $num; って$numはどこからでてきたの?
それにそんなことしたら配列の内容書き換えてるんじゃ?
0945 ◆JAPH9PWA 02/09/15 12:11ID:???
「聞く気になりません」って…何の理由もなしにrequireを使え、なんて事はないよ。
doは%INCをチェックしない。つまり、同じライブラリを何度も読んでしまう。
そうなると、サブルーチンの再定義など、いろいろ不都合が生じると。
0946nobodyさん02/09/15 12:13ID:???
>>943さん、回答ありがとうございます。
やってみたらできました。私も識者の回答を待っています。
どなたかお願いします。
094794402/09/15 12:17ID:???
っつわけで、
for $i (0 .. $#array) {
if($array[$i] eq $arujouken){
$hensuu = $i
last;
}
}
かな?>>939
0948nobodyさん02/09/15 12:18ID:???
>>944
>>939は、配列要素が何らかの条件に合致した場合、
その要素(>>939は変数といってるが)に何らかの
数値を格納したいって言うんでしょ
それなら、>>942で合ってるよ
>>944は>>939を別の解釈をしてるなら、それに
従って答えるべし
094994402/09/15 12:23ID:???
>>948
確かにこちらとは解釈が違うネ。。
こちらなりの回答は>>947でしたので>>939のレス待ちってことで
095094202/09/15 12:25ID:???
>>947
じゃ、同じ質問を返そう
$arujoukenって??
$array[$i] = $i; って?
>>939は数値を格納したいっていってるのよ
配列の番号を格納していなんて言ってないよ

095194402/09/15 12:27ID:???
>>950
わかりやすくしたつもりだが…<$arujouken
もちろんマッチングだとは思うので仮にこうしたまでだが。
$array[$i] = $i;
なんて書いてません。
095294202/09/15 12:28ID:???
>>949
こちらの回答がいちいち後手に回ってしまいスマソ
ここのところ質問者が質問しっぱなしが続いてるね
まさかネタじゃないだろうね
095394402/09/15 12:31ID:???
>>952
まだ質問されてから1時間も経ってないYO
住人でもなきゃすぐにレスなんてこないかと
095493802/09/15 12:36ID:???
>>945
そうなのですか。一応検索はかけていたのですが
そこまで説明しているとこは見つけられなかったもので。
説得されました。require使います。
>>946
だそうです。
レス数が950を超えています。1000を超えると書き込みができなくなります。