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

【Perl】初心者コーナー Part13

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

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

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

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【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あたりを見よう。
0893 ◆JAPH9PWA 02/07/16 08:49ID:???
>>891
HTTPを使う限り、それを消す方法は無いよ。
単に無視するだけなら可能だけどね。
その場合は最初の空行までを読み飛ばせば良い。

>>892
パーミッションがあれば、相対でも絶対でもいけると思うけど。
0894nobodyさん02/07/16 08:49ID:???
相対パスのときカレントより上のディレクトリは指定できない設定なんでしょ。
089585202/07/16 09:20ID:mWVjtM4S
未だに同じ問題で悩んでいる852です。

送信ボタンに、onMouseUPで新規ウィンドウを開き、そこにデータを受け取った後の結果を表示させるようにCGIにリンクさせてるんですが、
そのjavascriptをいれてると、データが送信されてないみたいです。

試しに投票フォームと同じウィンドウ上で結果を表示させると、うまくいきました。

submitボタンにビヘイビアを仕込むとダメなんでしょうか?
0896ぽよぽようんこ(本物)02/07/16 13:47ID:???
悩んでる内容も内容なら、説明も下手、キミには向いてないそれだけのこと。
0897chmod02/07/16 14:34ID:2idpGCxq
chmod 0755, $filename;
でファイルがブラウザから見られるのに

$de="0755";
chmod $de, $filename;
でにするとファイルが見られなくなります。

chmod($de, $filename);
もダメです。
どなたか変数で指定する方法を教えて下さい。
0898chmod02/07/16 14:36ID:2idpGCxq
>>897
あれ文字化け?してるけど、
コロンでなくカンマです。
0899ぽよぽようんこ(本物)02/07/16 14:43ID:???
そんな基本的なこと参考書に書いてあるだろ。キミも向いてないね。
0900chmod02/07/16 14:46ID:2idpGCxq
$de="0751";
chmod($de,$filename);と755を751にしたらでできました。

しかしFTPプログラムでこのファイルを見るとなぜか
-wxr-xrwxになっています。どうしてでしょう。
0901nobodyさん02/07/16 14:52ID:???
>>900
$de = 0755;
ダブルクォーテーション不要。
リテラルについてさらっと勉強し直しましょう。
0902nobodyさん02/07/16 15:11ID:???
umaskは?
0903nobodyさん02/07/16 15:12ID:???
スカラー変数の意味がわかっていない馬鹿がいるな…
0904nobodyさん02/07/16 15:37ID:2idpGCxq
>>902
umask(0)です。
$de=0755;とかにするとその時点で正しく数字が入りません。
やはり変数を使って設定をするとパーミッションがぼろぼろになります。
Perlの仕様ということで考えます。
0905nobodyさん02/07/16 15:46ID:???
だからperldoc嫁ってのに、どんな仕様だよ

$de_octet = oct($de);

perldoc dhmod
090688502/07/16 15:52ID:???
らくだ本を参考にsrandの種を以下のようにしたら乱数がばらけてくれました。
ありがとうございました。

srand(time() ^ ($$ + ($$<<15)));
0907nobodyさん02/07/16 16:01ID:???
>>904
どうしようもないアフォですね。
0908nobodyさん02/07/16 16:07ID:???
バカハケーン!
090985202/07/16 16:53ID:???
ようやく解決できました。どうもお世話になりました!はーこんな単純なことで長時間費やすとは・・・
0910nobodyさん02/07/16 18:06ID:AR5JuM+5
新感覚のポータルコミュニティサイトが遂に出来ました!!
今までの出会い系サイトとは一味もニ味も違うサイトです。バーチャルタウンを実際に体験できます!!!
詳しくは下記UELをクリックして、確かめて!!
http://www.e-mansion.co.jp/co/ac.html
0911nobodyさん02/07/16 18:13ID:XozL7fM5
>>907 >>908

■■■バカ名言■■■

バカって言うだけの奴ほど役に立たないものはない。
助けるか、無視するかをしなさい。

バカというだけというのは、助けもせず、無視もせず、
レスを余計に増やし、雰囲気を悪くする。
そういうのに限って突っ込まれれば適当にごまかしたり、逃げていく。

■■■どうせ六でもない奴だろうが■■■
0912nobodyさん02/07/16 21:41ID:???
>>911
陸でもない/碌でもない
バカって言っていいですよね?

  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■
  ■■■どうせ六でもない奴だろうが■■■

バカハケ━━━━━(゚∀゚≡゚∀゚)━━━━━━ソ!!!!
0913nobodyさん02/07/16 23:36ID:???
楽しいスレですね(微小
0914nobodyさん02/07/17 00:13ID:???
>>912
ネタに乗ったハカ
どう見ても厨房
でもあんまりおいたしていると痛い目合わすよ。
0915nobodyさん02/07/17 00:24ID:???
>>914
>>914
0916nobodyさん02/07/17 06:20ID:???
おまえら、いい馬鹿っぷりでお兄さん感激だ(w
0917nobodyさん02/07/17 07:08ID:???
タグを削除したいのですが、

$x = qq{<a href="http://www.yahoo.co.jp/">Yahoo! Japan</a>};
$x =~ s/<.+>//g;

のようにすると、最初の < と最後の > で全部消えてしまいそうな気がします。
最短マッチとかを使えばいいんでしょうか、使い方がわからないので教えてください。

(Perlメモを読んだところEUCしかできない方法らしいので
SJISでもやりたいので質問です)
0918nobodyさん02/07/17 07:41ID:???
2002/07/17 07:41:20 を、time関数形式になおしたいけどどうするの?
0919nobodyさん02/07/17 07:52ID:SEvMu7le
>>917
$x =~ s/<[^>]*>//g;

>>918
年月日時秒を分解して
(年は-1900してから)全て秒に直して足せば良いんじゃないの?
0920nobodyさん02/07/17 07:53ID:???
>915
timelocal();
0921nobodyさん02/07/17 07:53ID:???
>920 =~ s/>915/>918/;
092291902/07/17 08:08ID:???
馬鹿だ俺…
0923nobodyさん02/07/17 08:08ID:???
>>917
HTML::Parserという手もある。
0924nobodyさん02/07/17 12:49ID:???
rename("onefile","pict/$hensuu");
ってやるとunix/perlでは成功するんですが
ActivePerlじゃ成功しないんです。
rename("onefile","pict\$hensuu");
うえのようにしてもだめでした。たすけてちょんまげ
0925 ◆JAPH9PWA 02/07/17 13:41ID:???
>>924
…普通に成功してるけど?

というか、失敗したら$!を見る癖をつけよう。

rename(...) or die $!;
0926nobodyさん02/07/17 14:25ID:tZJ3+xnS
>>924
エスケープしなきゃ駄目だよ
pict\$hensuu
 ↓
pict\\$hensuu
0927nobodyさん02/07/17 14:52ID:tZJ3+xnS
と言うか、rename("onefile","pict/$hensuu");このまま
でも動く所がActiveperlさんの偉い所だったり
MACだとこうは行かないそうで
0928nobodyさん02/07/17 16:15ID:???
>>927
MACのPerlってどんなんなんですか?
OSXで動くならまぁわかるんですが。
PerlでIriaみたいなの作ったら需要ありますかね?
Macでダウソマネージャーってありましたっけ?
0929nobodyさん02/07/17 16:28ID:???
MacPerl
WWWcp

両方で検索してみれ。ただWWWcp最後にいつ使ったか
忘れたけど俺が使ったバージョンではマルチホーミングに
対応してなかった気がする。
つーか需要も何も難しくないからめずらしくも無い。
093092402/07/17 17:45ID:???
ActivePerlおかしくないですか?
perl -e 'print $^O;'とかできないんですけど、、
ほかにもいろいろ違うのかな?
0931nobodyさん02/07/17 17:48ID:???
C:\>perl -e "print $^O;"
MSWin32
C:\>

ちゃんとなるよ。
0932nobodyさん02/07/17 17:49ID:???
webプログラマーになりたいんですが、
linuxの使い方は必須で覚えないとダメですか?
0933nobodyさん02/07/17 17:50ID:???
サァ?
093492402/07/17 17:53ID:???
>>931
さんくす。
DOSではダブルクォートがうんぬんってのはこれだったのか。
0935nobodyさん02/07/17 18:02ID:0WM/CdU+
Cだとプリプロセッサだけ動かしてその出力を得ることができるんですが、
Perlでこれは可能ですか?

あるソースの保守をやっているんですが、ファイル名をパスの階層ごとに変数にしてて
もうわけがわかりません。変数展開したソースがホスィのです。

こんな感じ
open ("< /foo/bar/giko");
を、わざわざ
$FOO_dir = '/foo';
$BAR_dir = "$FOO_dir/bar";
$GIKO_file = "$BAR_dir/giko";
open ("< $GIKO_file");
としている。こんなのが何十個もある。
0936 ◆JAPH9PWA 02/07/17 23:07ID:???
>>935
残念だけど、プリプロセッサは無いよ。
その目的なら、デバッガが適当かなぁ。
perldoc perldebug
日本語ドキュメントなら、不完全だけど河馬屋のがあるよ。
http://member.nifty.ne.jp/hippo2000/perltips/perldbg.htm
0937nobodyさん02/07/17 23:14ID:0q/AG7/8
はじめまして。
超初心者的質問ですが、探しても答えが見つからなかったので質問させてください。

flockでロックしたファイルは、他のcgiからの書き込みに対しても有効ですか?
あるCGIスクリプトでflock中のファイルについて、他のCGIスクリプトからの書き込みも防ぐことができるのでしょうか。
flockは、ファイルハンドルを指定して行うので、1つのCGIスクリプトでしか効果がないのかも知れないと心配になりました。

申し訳ありませんが、どなたかご存じの方、ご回答いただければ幸いです。
0938コギャル&中高生02/07/17 23:23ID:q1y9WZog
http://go.iclub.to/ddiooc/

お役立ちリンク集
必ず役立ちます

コギャルとH出来るサイトはここ
ヌキヌキ部屋へ直行便
↓
http://kado7.ug.to/wowo/

http://kado7.ug.to/wowo/-a.htm
0939nobodyさん02/07/17 23:37ID:/oUfi8FN
新感覚のポータルコミュニティサイトが遂に出来ました!!
今までの出会い系サイトとは一味もニ味も違うサイトです。バーチャルタウンを実際に体験できます!!!
詳しくは下記UELをクリックして、確かめて!!
http://www.e-mansion.co.jp/co/ac.html
0940 ◆JAPH9PWA 02/07/17 23:41ID:???
>>937
一つのスクリプトでしか効果ないとしたら、
全く同じ二つのスクリプトがあったらどうなると思う?
1バイトだけ違って他は同じスクリプトがあるとしたら?
そんなんじゃ困るでしょ。

当然だけど、他のあらゆるスクリプト、プロセスに対して有効だよ。
ただし、flockの仕様上「書き込みを防ぐ」ことは出来ないから注意してね。
0941nobodyさん02/07/17 23:47ID:???
>>937
全部のスクリプトが正しくflockしてれば排他処理はうまくいく。
flockは紳士協定だから、flockせずにいきなり書き込むような無法者がいると破綻する。
そのファイルにアクセスするのが自作CGIのみなら大丈夫だろ。
094293702/07/17 23:48ID:NR9AAdwq
親切な回答ありがとうございました。
また、flockは書き込みを防ぐのではなく、オープンを防ぐのですよね。
こちらもご指摘ありがとうございました。
094393702/07/17 23:51ID:NR9AAdwq
上の書き込みは>>940さんへのものでした。
>>942さんもありがとうございました。
自作スクリプトだけなので、大丈夫そうです。
安心しました。

本当にありがとうございました。

・・・あ、もちろん、ファイルハンドルは毎回違っても大丈夫ですよね?
>>940さんがあらゆるプロセスに対して有効って言ってくださっているので、
そういうことですよね。

では、頑張ってつくります!
ありがとうございました!!
094493702/07/17 23:52ID:NR9AAdwq
すみません。
>>941さんでした。

本当にありがとうございました。
0945nobodyさん02/07/18 00:00ID:???
>>942
> また、flockは書き込みを防ぐのではなく、オープンを防ぐのですよね。

これは違う
0946nobodyさん02/07/18 00:21ID:???
ファイルアクセスを防ぐのかな?
0947 ◆JAPH9PWA 02/07/18 00:28ID:???
いや、何も防ぎはしないよ。

flockの仕組みってのは信号機みたいなもんなんだよ。
"赤だったらちょいと立ち止まってくれ"という合図に過ぎない。
だから、無視しようと思えば無視できるんだよ。
無論、そんなことをしていればいつか事故が起こるのは必至だけど。

…てな説明を何処かで読んだよ。
0948nobodyさん02/07/18 00:46ID:???
>946
>>387
0949nobodyさん02/07/18 03:09ID:ES5M+zj/
flockを使わない別スクリプトがあったら危険だってこと?
0950nobodyさん02/07/18 03:19ID:???
>>all

これ完璧だと思うけど、違うの?

open(OUT, "+< outfile.txt");
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT "........";
close(OUT);
0951nobodyさん02/07/18 03:24ID:???
>950
それのどこが完璧なのか聞きたい。
tu-ka,ファイルロックスレに逝って叩かれてこい。
0952nobodyさん02/07/18 09:30ID:???
>>950
openとlockの間に他プロセスからのopenが来たらどうするつもりなんだろう・・・。
0953 ◆JAPH9PWA 02/07/18 09:42ID:???
>>165
別に問題ないのでは?

>openとlockの間に他プロセスからのopenが来たらどうするつもりなんだろう・・・。

とのことだけど、ファイルを破壊しているわけじゃないので無問題でしょ。
「他プロセスからのopen」がファイルを破壊したりflockを伴わなかったりしたら
そりゃ問題だけど、そんな赤信号を無視して突っ込んでくるヤツを止めることは出来ないし。
0954バカです02/07/18 11:38ID:w/uBOa7p
 教えてください。
mySQLとPerl使っているのですが,ハッシュのことがよく分かりません。
 while(@res = $st->fetchrow_array) {
           $data{$res[0]}=1;
           }
こうすると、ハッシュdataに何も入って無いのですが、↓の様にすると
ちゃんと、ハッシュに格納されます。何故ですか?

 $i=0;
 while(@res = $st->fetchrow_array) {
           $data[$i]=$res[0];
           $i++;
           }
       foreach(@data){$data{$_}=1}
0955nobodyさん02/07/18 13:17ID:pqv4qZv6
質問です。
sub A{
$a = "aaa";
&B;
}
sub B{
print $a;
}
&A;

サブルーチンAの中にサブルーチンBがある時、
Bの始めに引数の取得をしなくてもBの中で$aって使えるんでしょうか。
というか、今やったら出来たんですけど、どうしですか?
引数は必ず受け取らないとダメなんですよね?
0956nobodyさん02/07/18 13:19ID:pqv4qZv6
訂正。
>Bの始めに引数の取得をしなくてもBの中で$aって使えるんでしょうか。

Bの呼び出しの時に引数を与えなくてもBの中で$aって使えるんでしょうか。
0957nobodyさん02/07/18 13:20ID:???
>>955
だって、$aはmyなりlocalなりしてないのでスコープがグローバル。
もっともやってはいけないコーディング法の一つです。
0958nobodyさん02/07/18 13:21ID:???
>955
Perlはデフォでグローバル変数扱いになるから使える。
0959nobodyさん02/07/18 13:25ID:pqv4qZv6
やっぱり上のは違いました。質問し直します。

sub A{
&B;
}
sub B{
@array = @_;
print $array[0];
}
$a = "aaa";
&A($a);

この時、Aで引数を取得しないで飛ばしてBで取得しちゃってもいいんでしょうか。
0960nobodyさん02/07/18 13:26ID:???
@_ってローカルでは?
0961ぽよぽようんこ(本物)02/07/18 13:27ID:???
>>957
おいっ! my と local の違いを勉強せいっ!
この場合、local でも使えるだろ!
0962nobodyさん02/07/18 13:37ID:Rz8eDFr/
>>960
グローバルな特殊変数。
0963nobodyさん02/07/18 13:40ID:???
>>962
なかなか不便だね。
とにかく、彼はもうちょっと構造化プログラミングについて勉強した方が未来のためかと。
0964nobodyさん02/07/18 13:42ID:pqv4qZv6
謎はすべて解けた!
グローバル変数は引数を与えたり取得なんかしなくても
どこでも関係なく使えるってことだ!!
0965nobodyさん02/07/18 13:42ID:???
>>957
ネタ?
グローバルが最悪というが、状況次第だろ
それにこれはローカルが要求される程
莫大な規模ではないし
>>960
ダネ
Bが@_ではなく、$aで取得すれば問題ない
0966nobodyさん02/07/18 13:43ID:???
>>964
うん。まぁ・・・・・正解か。
0967nobodyさん02/07/18 13:43ID:???
>>965
>グローバルが最悪というが、状況次第だろ
こんな小規模なプログラムかつ引数で渡せるものをわざわざグローバルにすべきではない。
0968nobodyさん02/07/18 13:44ID:???
俺いまだに、myとlocalの違いがわからねえ。
0969nobodyさん02/07/18 13:45ID:gTYoTB/P
>>964
どこでも使える=グローバル
局所でしか使えない=ローカル
0970nobodyさん02/07/18 13:45ID:???
>>965
@_がローカルだと?
0971nobodyさん02/07/18 13:46ID:???
>>961=>>965

かまってもらえなかったので自作自演で大暴れ。
0972nobodyさん02/07/18 13:46ID:gTYoTB/P
>>968
localだとそこから呼んだサブルーチンでも有効。
>>955だとlocalにしても使えるがmyだと引き渡されない。
0973nobodyさん02/07/18 13:49ID:???
なんとなく理解できたよ。
0974ぽよぽようんこ(本物)02/07/18 13:49ID:HgQ+L8cQ
>>971
ははん、オマエか、>>957のようなとんちんかんなこと書いたのは。
0975nobodyさん02/07/18 13:49ID:???
>>972
じゃあさ、

sub a
{
local($x);

&c();
}

sub b
{
&c();
}

sub c
{
print $x
}

ってした場合はどうなるの?
0976nobodyさん02/07/18 13:52ID:pqv4qZv6
bはどこで呼んでいるのだ?
0977nobodyさん02/07/18 13:53ID:???
>>976
どこかで読んだ場合よ。

localが呼び出しサブルーチンでも有効なら
場合によっては動かない組み合わせが出てくるだろうという話。
0978nobodyさん02/07/18 13:58ID:So56onuk
>>977
だから一般的にはmyを使って、サブルーチンは引数使って呼ぶのがお勧めです。
0979nobodyさん02/07/18 14:17ID:???
my $a;
$a = "aaa";

&a($a);

sub a{
&b;
}

sub b{
print $a;
}

これで、bの中の$aがちゃんと表示されちゃうんだけどなぜ。
0980nobodyさん02/07/18 14:30ID:???
$main::a だから
つーかaはやめれ
0981nobodyさん02/07/18 14:40ID:???
>>979
ネタでやっているなら、ごめんね
あまりにも、ウザイので↓みて、調べてね♀

ttp://www5a.biglobe.ne.jp/~n_rieko/perl/9.htm
0982nobodyさん02/07/18 14:59ID:???
>>981
読んだけど聞きたいことが書いてなかったです。
0983nobodyさん02/07/18 15:04ID:???
>>982
それは、読んだだけでしょ?理解したの?
理解できたら解決できるよ〜
0984nobodyさん02/07/18 15:14ID:???
今まではサブルーチンに行く時は
必ず使う変数を渡すして受け取って使うものだと思っていたのに
そんなことしなくても使えることがわかったので混乱しています。

で、myを使えば他のサブルーチンでは使えないはずなのに
使えるからさらに混乱しています。
0985nobodyさん02/07/18 15:23ID:???
説明が悪すぎです。ここの人。混乱しています。
0986nobodyさん02/07/18 15:48ID:???
>979
ラクダ本p217より
このようなプライベート変数のスコープ内から呼び出されるサブルーチンからは
テキスト上で、サブルーチンがその変数のスコープ内で定義されている場合を除き
プライベート変数を見ることができない。

サブルーチンaおよびbがmy $aのスコープ内で定義されていますので、
表示されます。要するに仕様です。

>980
myで修飾された変数はパッケージ変数とは関係ありません。嘘は駄目です。
0987nobodyさん02/07/18 15:50ID:???
>>986
そこだけだと日本語として成立しない。
0988nobodyさん02/07/18 16:05ID:???
>>955 についてはまず基本を:
- use strict を使わないで使用した(宣言しなくても使用するだけでいい)Perlの変数は全て現在のパッケージのパッケージ変数になる。
- パッケージ変数は同パッケージ内ならどこからでも呼び出せる

以上を踏まえた上で元のコード(にちょっと手を加えたやつ)を
説明すると:

sub OUTER {
## この時点で$VARIABLEはパッケージ変数として宣言される
$VARIABLE = "aaa";
INNER();
}
sub INNER {
## OUTER()と同一パッケージ内なのでこの$VARIABLEもOUTER()で
## 宣言された$VARIABLEと同じ物を指す。よって"aaa"とプリントされる。
print $VARIABLE;
}
OUTER()

===

でも以上は悪いコードの見本みたいなもん。ちゃんとuse strictとmyを
使えば混乱しない:

use strict;
our $PACKAGE_VARIABLE = "foo";
sub INNER
{
my $inner_lexical_variable = shift;
print "PACKAGE_VARIABLE => $PACKAGE_VARIABLE\n";
print "LEXICAL_VARIABLE => $inner_lexical_variable\n";
}

sub OUTER
{
my $outer_lexical_variable = shift;
INNER( $outer_lexical_variable );
}

OUTER( "aaa" );
0989nobodyさん02/07/18 16:06ID:???
>>959
これは&SUBROUTINE;という表記がちょっと特殊だから起こる。
サブルーチン内で&SUBROUTINE;という表記でさらにサブルーチンを呼ぶと、
現在の@_の値をそのままそっくりSUBROUTINE()に渡す。

sub OUTER{ &INNER }

は

sub OUTER{ INNER(@_) }

と同じ事になるわけ。だから外側で呼んだサブルーチンの引数がそのまま
内側のサブルーチンで使えるわけ。これも特殊な状況でない限り使用は
お勧めしない。
0990nobodyさん02/07/18 16:07ID:???
>>975
これは実際に代入をしてみると差がでてわかる。

use strict;
my $GLOBAL = "ORIGINAL";
sub print_global
{
print "\$GLOBAL is $GLOBAL\n";
}

sub WITH_LOCAL
{
print "OUTSIDE of BLOCK\n";
print_global();
{
local $GLOBAL = "NEW VALUE";
print "local()ized \$GLOBAL\n";
print_global();
}
print "OUTSIDE of BLOCK (again)\n";
print_global();
}
0991nobodyさん02/07/18 16:07ID:???
>>988
うん、もめてるのはそれ以降。
0992 ◆JAPH9PWA 02/07/18 16:35ID:???
新スレ立てました。

【Perl】初心者コーナー Part14
http://pc.2ch.net/test/read.cgi/php/1026977659/
レス数が950を超えています。1000を超えると書き込みができなくなります。