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

Perlコーディング初心者質問スレ Part 42

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/05/25(水) 06:36:28ID:PVpWgcdf
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0652nobodyさん2005/07/02(土) 13:53:31ID:???
なんかPHPっぽいねw>CGI.pm
06536222005/07/02(土) 14:20:11ID:???
>>624
ありがとうございます。どうも、リファレンスで混乱してたようです^^;
「.=」して分割を考えるとかでも十分なのかな。。

モジュールは勉強したいとは思うけれど、種類の多さ機能の多さに・・・
そもそも、なんかもっと根本的な部分で知識と理解が足りてなさすぎる。。
0654nobodyさん2005/07/02(土) 23:30:34ID:???
>>653
そうそう、そんな感じ。
複数データはタブとか改行で区切るだけでも十分。
どうせ汚染チェックは必要なんだから、タブや改行はそこで取り除けばいいだけだし。

モジュールはセキュリティに気を配って書かれているのは良いけど無駄が多いからなぁ。
0655nobodyさん2005/07/03(日) 01:29:15ID:???
データの区切りと言えば、前、レコードの区切りは改行、フィールドの
区切りはタブでデータを記録してた時、フィールド内をさらに区切りたくて、
そのときタブも改行も使えないから何を使えばよいか迷って、結局^fだか^gを
使ったんだけど、こういうときにどういう制御文字を使う(または使う順序)の
約束事みたいなのあるかなと思って調べてわからなかったんだけど、
なにかあります?
0656nobodyさん2005/07/03(日) 01:33:17ID:???
データに含まれない文字
0657nobodyさん2005/07/03(日) 01:59:23ID:???
\x00-\x07\x0E-\x1A\x1C-\x1F\x7F\xFF あたりとか。
0658nobodyさん2005/07/03(日) 02:49:19ID:???
自分なりに調べてみても分からなかったので質問です。
ファイルオープンのとき、読み取りモードで開こうとしてファイルがなかった場合に、新しく生成させるために
&file_open(*FILEHANDLE,path)を定義してやってるんですが、

&file_open(FILE,$filepath);
flock(FILE,1);

とすると500Internal(以下略 が出てプロセスのタイムアウトとか言われます。
ファイルロックしているファイルにアクセスしようとしてるのかと思って調べてみましたがそうでもないみたいです。
なにか心当たりがあれば教えていただけませんか?
0659nobodyさん2005/07/03(日) 02:50:33ID:???
訂正
5行目 ×&file_open(FILE,$filepath);
      ○&file_open(*FILE,$filepath);
0660nobodyさん2005/07/03(日) 03:51:27ID:???
>>658
ここ参考
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/2
06616582005/07/03(日) 04:39:10ID:???
>>660
大変失礼しました。
もちろんローカルサーバでテストを行っていますが、「プロセス中にタイムアウトしました」としか
メッセージが出なかったもので、そのまま書いてしまいました。

3行ほどのテストプログラムを組んでコマンドプロンプトで実行させてみたところ、
いつまで待っても処理が終わらず、さらに問題と思われる行の前後で文字列を出力させてみたところ、
前ではうまく出力しますが後では出力しないため、問題がこの行にあるのは明白だと思われます。
&file_openのソースは以下のとおりです。

sub file_open{
local *FILE = shift;
my $filename = shift;
if(! -e $filename){
my $fntemp = $filename;
$fntemp =~ s/^(\>|\<|\+)*//;
open(NEW,">$fntemp");
close(NEW);
}
if(!open(FILE,"$filename")){&sub_error(2);}
return;
}
0662nobodyさん2005/07/03(日) 07:52:34ID:???
>>658-661
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_use_a_filehandle_indir
06636582005/07/03(日) 14:25:42ID:???
>>662
読ませて頂きましたが、使い方は私ので合っていると思います。
ただ、ファイルオープン後にflock関数が使えないという点について何か教えていただけませんでしょうか。
0664nobodyさん2005/07/03(日) 14:52:54ID:???
>>663
>>662を読めバカ
0665nobodyさん2005/07/03(日) 15:55:28ID:???
わざわざへんてこなサブルーチン作ってバグ呼び込むようなことしなくても
sysopenでO_CREAT使えば一発なわけだが。
06666582005/07/03(日) 16:00:37ID:???
ぜんぜんわかんないです・・・。。。
ファイルハンドルを局所化して使うと、サブルーチンの外ではflockは使えないのですか?
0667nobodyさん2005/07/03(日) 16:26:41ID:???
>>666
試してみたがお前のプログラムは限定された状況でなら動くので、
問題は別のところにあると思われる。
% cat foo.pl
my $filepath = "foo";
&file_open(FILE,$filepath);
flock(FILE,1) or die "flock: $!";
sub file_open{
local *FILE = shift;
my $filename = shift;
if(! -e $filename){
my $fntemp = $filename;
$fntemp =~ s/^(\>|\<|\+)*//;
open(NEW,">$fntemp") or die "open NEW: $!";
close(NEW);
}
if(!open(FILE,"$filename")){&sub_error(2);}
return;
}
(続く)
0668nobodyさん2005/07/03(日) 16:26:56ID:???
(続き)
% strace perl foo.pl
(中略)
stat64("foo", 0x814d0c8) = -1 ENOENT (No such file or directory)
open("foo", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffff5a8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(3, 0, [0], SEEK_CUR) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
close(3) = 0
open("foo", O_RDONLY|O_LARGEFILE) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffff5a8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(3, 0, [0], SEEK_CUR) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
flock(3, LOCK_SH) = 0
close(3) = 0
exit_group(0) = ?

ファイルは開かれているしflockも正常終了している。
0669nobodyさん2005/07/03(日) 16:39:25ID:???
ただし以下のような問題があるのできちんと勉強して書き直した方がいい。

file_openに渡している'FILE'はただの文字列なので、呼び元と
file_openが別パッケージのときにおかしくなるだろう。

open(NEW,..)の戻り値を見ていない。せめてdieぐらいしとけ。

-eで調べてなければファイルを作っているが、ここがアトミック
に実行されていないのでそのうちメチャクチャになるだろう。

最後の問題のおかしくなるシナリオの例はこんな感じだ。
(プロセスA) -eでファイル調べたらなかった
(プロセスB) -eでファイル調べたらなかった
(プロセスA) ファイル作ってflockしていろいろ書き込む
(プロセスB) open(NEW ">$fntemp")いきなりやるのでAが書き込んだファイルが空っぽに
0670nobodyさん2005/07/03(日) 16:41:33ID:???
>>667-669
>>659
06716582005/07/03(日) 17:01:45ID:???
>>667-669
ありがとうございます!
視点を変えてもうすこしバグフィックスしてみますね。
最後の問題は、もう少し煮詰める必要がありそうですね。
open(NEW,"+>$fntemp");truncate・・・のほうがいいんでしょうか。

ともあれ、本件は本当にありでした。
まだ問題の解決になっていませんが、とりあえず問題がこのルーチン以外にあるということが分かったのでもう少し考えて見ます。
0672nobodyさん2005/07/04(月) 01:53:07ID:???
>>655
データファイルとして保存する際、特殊な制御文字を使うのはあまりおすすめしない。
テキストエディタでメンテナンスする時のことを考えるとね。

スペースとかカンマとかで区切っちゃっていいんじゃないの?
checkboxやselectでスペースやカンマを使用しなければ済む話なんだから。
0673nobodyさん2005/07/04(月) 10:25:04ID:???
他のシステムで読み書きする必要がなければ
Storableが楽だと思う。
0674nobodyさん2005/07/04(月) 10:44:04ID:???
>>673
Data::Dumper の Dump()なら単なるテキストファイル
0675nobodyさん2005/07/04(月) 22:46:13ID:???
script内に、ある package が取り込まれている、ってことをどう調べたらいいのかな?

# Hoge->new() があるかどうか、ってことは ↓ みたいにすればできるみたいなんだけど

use strict;
print defined Hoge; # これは error
print defined &Hoge::new ? 1 : 0; # 1
print defined Moge; # これも error
print defined &Moge::new ? 1 : 0; # 0

package Hoge;
sub new {}
0676nobodyさん2005/07/04(月) 23:59:48ID:???
>>675
print exists $main::{"Hoge::"};
0677nobodyさん2005/07/05(火) 00:25:37ID:???
うわ、できてる! すごっ
>>676 ありがとうー。

でも何で? どういう理屈?
リソースとかあったら教えてほしいわ。
0678nobodyさん2005/07/05(火) 01:00:15ID:???
>>677
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html
0679nobodyさん2005/07/05(火) 01:31:57ID:???
・・・あ、あった(笑)
ありーー
0680nobodyさん2005/07/05(火) 04:53:09ID:???
@arr = ([0, 1, 2], [3, 4, 5]); の状態で
@{ $arr[0] } とすると
$arr[0]にある無名配列の参照をデリファレンスしてリストとして見ている
という意味でしょうか?
0681nobodyさん2005/07/05(火) 05:01:50ID:???
頼むから訊く前に試してくれ
06826802005/07/05(火) 05:46:53ID:???
試した後でした。失礼しました。
0683nobodyさん2005/07/06(水) 02:17:46ID:???
はあ?
0684nobodyさん2005/07/06(水) 10:39:36ID:???
なあ、そろそろageない?
0685nobodyさん2005/07/06(水) 11:33:27ID:FWp4IWEU
質問です。よろしくお願いします。
aaaaのデータベースのレコードの情報6行分をハッシュbbbbに入れて、
その後ハッシュの配列?ccccに入れるプログラムを作りたいのですが、
期待する結果が出てくれず困っています。

test01の結果は、普通に6行分表示されるのでOKなのですが、
test02の結果は、6行目のレコードの情報が6回表示されてしまいます。
なぜ最後の6行目の情報だけが6回入ってしまうのでしょうか?よろしくお願いします。
0686プログラム2005/07/06(水) 11:34:05ID:FWp4IWEU
※@$aaaaにはデータベースのレコード6行分が間違いなく入っています。
my @cccc;
my %bbbb;
foreach(@$aaaa){
$bbbb{'1111'} = $_->{'1111'};
$bbbb{'2222'} = $_->{'2222'};
$bbbb{'3333'} = $_->{'3333'};

#%bbbbのテスト表示(test01)
my $key;
foreach $key(keys(%bbbb)){
print "キー:".$key."\n<BR>";
print "値:".$bbbb{$key}."<BR><BR>\n";
}
push(@cccc,\%bbbb);
}
#$@ccccのテスト表示(test02)
my $key;
my $value;
my $j;
for($j=0;$j<@cccc;$j++){
while(($key,$value) = each(%{$cccc[$j]})){
print "キー = ".$key."<BR>\n";
print "値 = ".$value."<BR><BR>\n";
}
}
0687nobodyさん2005/07/06(水) 12:05:28ID:???
%bbbbはループの度に上書きされてるよね。
pushしたリファレンスは全部同じ一つの%bbbbを参照してる。
中身は最後に上書きされた六行目。
0688nobodyさん2005/07/06(水) 17:26:34ID:???
拡張子からサーバーに登録済みの MIME タイプを引きたいのですが
どうすればいいのか見当もつきません。
例えば '.jpg' から 'image/jpeg' を得たいということです。
インターネットサービスマネージャのコンピュータのプロパティの
コンピュータ MIME マップをクリックして出てくるリストです。

サーバーは Windows 2000 Server SP4 上の IIS 5.0 (.NET なし) で
Active Perl 5.8.4 Build 810 のようです。
何かいい方法があればご教授ください。どうぞよろしくお願いします。
0689nobodyさん2005/07/06(水) 20:03:07ID:???
>>688
A. Win32::Registry で
HKEY_LOCAL_MACHINE\Software\CLASSES
に設定されている俺様 MIME type を読む。

B. Apache のソースを拾ってきて、
http://sunsite.tus.ac.jp/pub/apache/httpd/httpd-2.0.54-win32-src.zip
docs/conf/mime.types を使う。

C. http://www.iana.org/assignments/media-types/ から
適当にリストを自作する。

お好きな方法を。
0690nobodyさん2005/07/07(木) 16:59:03ID:???
>>689
ありがとうございます。
しかしながら、いずれも私が欲しいリストとは異なるようです。

A は非常に近いものが得られますが、OS の MIME タイプと
IIS のマスタプロパティに設定された MIME タイプは違います。
IIS ではルート (仮想サーバー) 以下のフォルダにも追加できますが、
それはないようでした。

IIS の MIME タイプは %SystemRoot%\system32\inetsrv\MetaBase.bin
に保存されることはわかったんですが、中身の形式がわからないので
直接設定を読むことはあきらめ、ListBox から抜いたものを手作業で
ファイルにして使うことにします。
滅多に変更する人はいないので、実用上の問題はないと思います。
0691nobodyさん2005/07/07(木) 17:24:02ID:???
ADSIオブジェクトのIIsMimeMapとかいうのがそれっぽいので

ttp://opensource.activestate.com/authors/tobyeverett/index.html

あたり参考にしてアクセスできないだろうか。
0692nobodyさん2005/07/07(木) 18:54:34ID:???
>>691
興味深いですが、私のスキルではすぐに理解できません。
実はかなり初心者で、COM とか ActiveX 関係はさっぱりです。

とりあえず専用プログラムで ListBox のウィンドウから取り出してもらうと
いうことで落ち着きましたので、もう少し勉強してから考えてみます。
0693nobodyさん2005/07/08(金) 15:51:55ID:8f5N4Odz
えーと、下記のようなプログラムを作ったとき、

$namae = "100";
$test = "test3.txt";

open(TEST,"<$test");

print "Content-type: text/html\n\n";

while(<TEST>) {

print;

}

test3.txtの中身

$namae

プログラムを動かしてみると、ブラウザに表示されるのは $namae っていう文字になってしまいます。
これを、 100 と表示させたいのですが、どうすればいいのでしょうか・・・
0694nobodyさん2005/07/08(金) 17:51:10ID:???
>>693
eval

と言いたいところだが、 test3.txt の中身をいたずらされると怖いので、こんな感じで。

$namae = "100";
%data = ('namae' => $namae);
$test = "test3.txt";

open(TEST,"<$test");
print "Content-type: text/html\n\n";
while(<TEST>) {
s/\$(\w+)/$data{$1}/g;
print;
}
06956932005/07/08(金) 21:16:45ID:nSk2Gtk0
>>694
ありがとうございます。さっそく帰ったら試して見ます。
text3.txt内の変数の数が増えても、同じ考え方で問題ないんですよね?
06966932005/07/08(金) 21:16:59ID:nSk2Gtk0
>>694
ありがとうございます。さっそく帰ったら試して見ます。
test3.txt内の変数の数が増えても、同じ考え方で問題ないんですよね?
0697nobodyさん2005/07/09(土) 00:00:25ID:???
>>695
そうそう、こんな感じで。
$omae = "200";
%data = ('namae' => $namae, 'omae' => $omae);
# あとは同じ
06986932005/07/09(土) 02:20:01ID:Kb/ss4Wf
>>697
ありがとうございます!
無事に動きました。
あとは、これを理解して、自分の物にします。

どうもありがとうございました。
0699nobodyさん2005/07/09(土) 02:24:20ID:???
<どうでもいいこと>左辺値のクォート要らない</どうでもいいこと>
0700nobodyさん2005/07/09(土) 08:01:17ID:???
>>699
<どうでもいこと>クォートがいらないのは"=>演算子の"左辺値が"英数字のみで構成されているとき"のみ</どうでもいいこと>
0701nobodyさん2005/07/09(土) 09:26:13ID:???
# s/(英数字のみ)/アンダーバーと$1かハイフンから始まるアンダーバーと$1/;
0702nobodyさん2005/07/09(土) 09:28:58ID:???
use encoding
0703nobodyさん2005/07/09(土) 12:41:54ID:???
まじレスすると=>の左辺値を文字列として解釈してくれるパターンこうなんだけどね。

/^-?[a-zA-Z_]+\w*$/

数字で始まったり、先頭のマイナスの直後が数字だったりすると数値として解釈される。
さらにその後がアルファベットだったりすると構文エラーになる。

ハッシュの要素参照の{}も同じだね。

構文エラーになる分には気が付くからいいけど、01=>'a'とか、0_2=>'b'とか、-03=>'c'とかするとはまるよ。
0704nobodyさん2005/07/09(土) 12:47:09ID:???
>>703
正規表現の+はいらなかったね。
07055022005/07/10(日) 09:22:13ID:???
ハッシュのキー、変数から取り込むときは、日本語でもクオートで
囲まないでもできますけど、自動でクオートしてくれてるってこと?
while(<>){
$hash{(split[0])} = (split)[1];
...
なんて。
0706nobodyさん2005/07/10(日) 10:40:24ID:???
>>502
クォートされてないから変数の値がつかわれるんだRO。
07075022005/07/10(日) 17:54:56ID:???
>>706
そうですね。よく考えてみると疑問に思うほどのことはなかったか。
0708nobodyさん2005/07/10(日) 20:48:08ID:???
ん・・・
0709nobodyさん2005/07/12(火) 03:23:02ID:???
>>699
よくこのツッコミ見かけるのだが、クォートすると何か不具合でも起こるの?
0710nobodyさん2005/07/12(火) 06:26:14ID:???
まったく問題ない。
0711nobodyさん2005/07/12(火) 06:56:22ID:???
むしろクォートして欲しい
0712nobodyさん2005/07/12(火) 07:31:37ID:???
だが拒否する
0713nobodyさん2005/07/12(火) 10:05:30ID:???
宗教論にしかならないから(Perlゆえことさら)もうやめとけ。
0714nobodyさん2005/07/12(火) 12:04:24ID:???
なんでだよ。コーディングスタイル上の重要なポイントにかんする議論だろ。
0715nobodyさん2005/07/12(火) 12:59:07ID:???
TMTOWTDI
0716nobodyさん2005/07/12(火) 13:30:25ID:???
荒らしたいだけの奴がいますな。
スルーが吉。

一人二役以上で自演して荒れてるように見せるかもしれないけど、
全部スルーするのが吉。
0717nobodyさん2005/07/14(木) 11:35:37ID:0L4aMOkE
ttp://sound.jp/orgasm_panic/download.html

↑のMobileMiniBlog Ver1.0というのを使いたいんですが、
必要最低限の設定をしてからローカルでテストしてみても、表示結果が

</TR>
</TR>
</TR>
</TR>
</TR>

というものになってしまいます。
初期設定のままでも同じです。
サンプルでは
ttp://moritomo.k2.xrea.com/cgi/diary.cgi
のようなものになるらしいんですが…。

どこをいじればいいのか教えていただけないでしょうか?
よろしくお願いいたします。

※分からないことがあったら問い合わせるようにとスクリプトの中にメールアドレスが
書いてありますが、この作者はなんかエロいので怖くて問い合わせできません…。
0718nobodyさん2005/07/14(木) 12:24:32ID:???
>>717
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
07197172005/07/14(木) 12:35:19ID:???
>>718
すいません行ってきます。
0720nobodyさん2005/07/15(金) 08:49:12ID:cv7TvBaQ
歴史上一度も質問されたことのないコーディングについての普通のレベルの質問って何かありますか?
0721nobodyさん2005/07/15(金) 10:38:50ID:???
perl勉強中のものです。
簡単なシュミレータを作ってCGIとして公開したいと思っているのですが
一時間に一回程度のペースでクライアントのアクセスのあるなしにかかわらず
perlで更新させるにはどう書けばよいでしょうか
どなたか詳しい方ご教授お願いします。
0722nobodyさん2005/07/15(金) 10:44:22ID:???
>>721
とりあえずクローンタブとか調べた方が良いと思われ
0723nobodyさん2005/07/15(金) 13:24:06ID:???
配列に収められたハッシュリファレンスの特定キーの値で重複を削除したいのですが、
どーすりゃいいですか。
0724nobodyさん2005/07/15(金) 13:45:26ID:???
>>723
詳しく!
07257232005/07/15(金) 14:25:42ID:???
$hoge={ url=>'http〜', title=>'うんたら', time=>11212161, };
みたいなのが詰まっている配列mogeがありまして、
urlの値でいくつか重複がある(のを区別できる)ようなので、
それ含む$moge[m]を削除したいのです。
(つまり $moge[n]{url} と $moge[m]{url} が同じときに $moge[m]を削除したい)
grepを使うんでしょうが、右辺をどうやればいいのかわからないのです。
0726nobodyさん2005/07/15(金) 14:50:58ID:???
>>725
@in_array = (
{url=>'http://hoge.hoge1/',title=>;'うんたら1',time=>1111111}, #<--重複
{url=>'http://hoge.hoge2/',title=>;'うんたら2',time=>1111122},
{url=>'http://hoge.hoge1/',title=>;'うんたら4',time=>1112222}, #<--重複
{url=>'http://hoge.hoge3/',title=>;'うんたら3',time=>1112332},
);

#順番が入れ代わってもいい場合かつ後入優先
$tmp_hash{$_->{url}} = $_ for @in_array;
@out_array = values %tmp_hash;

#順番が入れ代わってもいい場合かつ先入優先
$tmp_hash{$_->{url}} = $_ for reverse @in_array;
@out_array = values %tmp_hash;

#順番を入れかえない場合後入優先
$tmp_hash{$_->{url}} = [$_,$i++] for @in_array;
@out_array = map{$_->[0]} sort {$a->[1] cmp $b->[1]} values %tmp_hash;

#順番を入れかえない場合先入優先
$tmp_hash{$_->{url}} = [$_,$i++] for reverse @in_array;
@out_array = map{$_->[0]} sort {$b->[1] cmp $a->[1]} values %tmp_hash;
0727nobodyさん2005/07/15(金) 14:52:11ID:???
>>725
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_extract_just_the_uniqu

my %saw;
@moge = grep !$saw{$_->{'url'}}++, @moge;
0728nobodyさん2005/07/15(金) 15:02:43ID:???
自分>>726だけど、>>727がクールだね。
07297232005/07/15(金) 15:24:57ID:???
>>725-726
おおお、ありがとう!
つまりurlの値をキー名にしたハッシュを作って、値のリストを得るのか!
726のほうは725のをコンパクトにしたものと見ていいのかな。
++のところで何が起きているのかよくわかりませんが。
0730nobodyさん2005/07/15(金) 18:16:16ID:???
>>729
1回でも出てきたら値が1以上なので真になる。
!がついてるので2回目以降は偽。
0731nobodyさん2005/07/15(金) 22:00:00ID:???
クールっつーか、イディオムだろ。
>>7のPerlメモくらい読めよ。
0732nobodyさん2005/07/17(日) 09:29:37ID:???
次のような場合、本当は、100を表示させたいのですが10が表示されてしまいます。
testサブルーチンでmyを付け忘れているのですがエラーも警告もでません。
これを回避するためにはどうのような記述をしたらいいのでしょう?

use warnings;
use strict;

my $x = 100;

test();

print "Content-Type: text/html\n\n";
print $x;

sub test{
$x = 10;
}
0733nobodyさん2005/07/17(日) 11:00:09ID:???
>>732
レキシカルスコープの有効範囲についてよく勉強することを
薦めるが、この場合最初のmy $xの有効範囲はファイルの終わり
までになるので、testサブルーチンの中からも見えてしまう。

回避するための記述の仕方はいろいろあるんじゃないかと思う
が、オレはmainサブルーチンを作ることにしてるな。これなら
testサブルーチンでエラーになるはず。

use warnings;
use strict;

main();
exit;

sub main {
my $x = 100;

test();

print "Content-Type: text/html\n\n";
print $x;
}

sub test{
$x = 10;
}
0734nobodyさん2005/07/17(日) 11:05:17ID:???
自分は一番上に my 書くと、サブルーチン内ではクロージャみたいに扱われる、って解釈してる。

>>733
わざわざサブルーチン作らんでも。

use warnings;
use strict;
{
    my $x = 100;
    test();
    print "Content-Type: text/html\n\n";
    print $x;
}
sub test{
    $x = 10;
}

で逝ける。
0735nobodyさん2005/07/17(日) 12:07:38ID:???
>>733 >>734
なるほど、サブルーチンにしろブロックにしろ
メインルーチンをブロックに押し込めて
メインルーチンとサブルーチンのスコープを外すわけですね。

一瞬、ブロックを外れたmyは、use strictの場合
警告だしてもいいんじゃないのかなとか思ったんですが
>>733-734のような書き方をすれば
1つのソースファイル内のみで定義されているサブルーチン間で
共通の変数を使いたいときにブロックの外でmyを使えば
ourみたいに他のソースファイルに影響を与えないわけですね。
てかPerl、奥深すぎ。

わかりました、ありがとうございました。
0736nobodyさん2005/07/17(日) 13:33:31ID:???
簡単なデータベースをperlで書こうと思っているのですが
生産地、商品、価格のカテゴリーがあるとして
○生産地フォルダ→商品ファイル→価格
という方式と
○生産地ファイル→商品リスト→価格
という方式と
○生産地リスト→商品+タグ+価格でデータ取得時にタグを取るプログラムを書く方式
の3つの方法があるとしてどれくらい負荷が違うものなのですか?
私がやりたいのはもう少しだけ複雑なデータなので大差が無いならわかりやすい一番上の方式をとりたいです。
ご教授よろしくお願いします。
0737nobodyさん2005/07/17(日) 14:51:25ID:???
>>735
> ourみたいに他のソースファイルに影響を
our は影響与えちゃうよw
0738nobodyさん2005/07/17(日) 17:43:20ID:???
Warning: Use of "our みたいに" is ambiguous at >>735 line 10.
0739nobodyさん2005/07/17(日) 22:31:36ID:???
ourは他のファイルには影響しないよ。
varsと違って、チェック機構そのものはレキシカルスコープをもつから。
0740nobodyさん2005/07/18(月) 14:44:31ID:???
そういや、ハッシュのキーでさ、お作法として、
アンダースコアから始まるのはプライベート、とかあるけど、
ハイフンから始まるのは何か意味ってあるの?
0741nobodyさん2005/07/18(月) 21:50:58ID:???
>740
名前付きパラメータの場合によく見かけるな。↓なんかそうだ。
ttp://search.cpan.org/~snowhare/Class-NamedParms-1.04/lib/Class/NamedParms.pm
慣習としてどっかに書いてあるのかは知らない。
0742nobodyさん2005/07/20(水) 09:58:16ID:???
HTMLへ記述した次のリンクがうまく動作しないのです。
<a href="$script?mode=help&no=$no>ほげ</a>
$scriptはスクリプトURLが入ります。→OK
mode=helpはhelpモードへ入ります。→OK
しかし&以下、no=$noがうまく動作しません。
$noは任意の数字が入ります。そして、それを・・・
print "<form method='$method' action='$script' name=help_form>";
print "<input type=hidden name=no value='$in{'no'}'>";
この$in{'no'}'へ入れたいのですが、動かしてみるとvalue=''になってしまい
数値が入力されません。
どうすれば動作するようになるでしょうか・
#リンクの書き方??
0743nobodyさん2005/07/20(水) 10:13:24ID:???
シングルクォート
ダブルクォート
0744nobodyさん2005/07/20(水) 11:00:01ID:???
>>742
2行目をコピペして以下のように$in{'no'}に
値を入れて実行すると

$in{'no'} = 100;
print "<input type=hidden name=no value='$in{'no'}'>";

結果は

<input type=hidden name=no value='100'>

となって正常に見えるので、間違ってるのはここではないな。
$in{'no'}に値はちゃんと入ってるか?
0745nobodyさん2005/07/20(水) 11:05:58ID:???
value=''ってことは$in{'no'}が空ってことだろ
なぜ空なのかはエスパーじゃないからわからない
0746nobodyさん2005/07/20(水) 21:03:22ID:???
>>742
<a href="$script?mode=help\&no=$no">ほげ</a>
にしてみては?

下の文は no=$no が機能してないから空なんじゃないの?
07477462005/07/20(水) 21:04:09ID:???
失礼、実態参照されてしまった。
<a href="$script?mode=help\&amp;no=$no">ほげ</a>
07487422005/07/20(水) 22:26:23ID:???
>>743
シングルクオートをダブルクオートにしても、クオートなしにしても、
リンクのno=$noが入ってこない。valueが空なのです。
>>746
試してみます。
0749nobodyさん2005/07/20(水) 22:30:25ID:8r7NrGN/
CGIのBBSを作っています。
print で <img> を書くと Internal Server Errorになる気がします。
何か対処方法はありますか?
0750nobodyさん2005/07/20(水) 22:31:43ID:???
あきらめる
07517422005/07/20(水) 22:31:58ID:???
>>746
アンカータグの中の$noは、スクリプトの中から取得した数字で
そこはちゃんと数字が入っています。
だから本当は、このスクリプトを動かすと、
<a href="〜cgi?mode=help&1">クリックすべし</a>
という形になります。で、&以下の1の部分が、リンクタグをクリックした
先のフォームの中の
print "<input type=hidden name=no value='$in{'no'}'>";
ここに入る・・・予定だったのに入らない。
フォームボタンなんかだったら$FORM{'no'}とするところですが
■ このスレッドは過去ログ倉庫に格納されています