【Perl 】初心者コーナーPart7
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい
01/09/12 13:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988809842&ls=50
CGIの質問はこちら【CGIだけど、なんか質問ある?part3】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988727833&ls=50
過去ログ、その他の役立ち情報は>>2-5を見よう。
0696名無しさん@お腹いっぱい。
01/10/09 18:24ID:caK9Qd8A方法ないでしょうか?↓みたいなかんじです。
$bb="$aa";
$aa="ほげ";
print "$bb";
これだと何も出力されませんが
出力が ほげ と出るような方法は無いでしょうか?
0697名無しさん@お腹いっぱい。
01/10/09 18:32ID:???0698名無しさん@お腹いっぱい。
01/10/09 18:35ID:???print $cc;
でもいいっすね。
0699名無しさん@お腹いっぱい。
01/10/09 18:38ID:???$bb='$aa'; #あとこれをシングルクォートに
0700つーか、、
01/10/09 18:38ID:???0702名無しさん@お腹いっぱい。
01/10/09 18:44ID:???$aa="ほげ"; # ここで$aaに「ほげ」代入
print "$bb"; # $bbは空なので、、、
ってこう糞親切?に書くと怒る厨房っているよね
0704名無しさん@お腹いっぱい。
01/10/09 18:51ID:???方法1
$bb='$aa';
$aa='ほげ';
print eval $bb;
方法2
$bb='aa';
$aa='ほげ';
print ${$bb};
0706696
01/10/09 19:06ID:???思とらんかたです。しかもこなにイパーイ!
なるほど!どうもです。
1行目と2行目が逆なのはこの手法を説明する
為だったんで…。これと全く同じというわけじゃないんです。
わかりにずらかったですね。スマソです。
0707名無しさん@お腹いっぱい。
01/10/09 19:07ID:???「文字列の中の変数名」をあとから展開するってどうやってます?
おれはこんなの。
$template = 'hello $name!';
$name = 'ほげ';
print eval '"'.$template.'"';
いちおうこれで動くけど、なんか無駄な気が。。。
0708JAPU@勉強中
01/10/09 19:11ID:???$hoe = "sakura";
$str =~ s/(\$\w+)/$1/eeg;
print "$str\n";
ってのもアリかも。
0709696
01/10/09 19:11ID:???みたいにそのアドレスにはいってるアドレスを参照する
ってのを知りたかったのです。
なんかいつも質問してるな…。ありがとうですです。
0710名無しさん@お腹いっぱい。
01/10/09 19:15ID:???みたいな感じか。
あえてやるなら。
0712名無しさん@お腹いっぱい。
01/10/09 20:01ID:???$aa= $zz;
$zz='hoge';
print eval $bb;
こういうのはできないんですねぇ。
0713名無しさん@お腹いっぱい。
01/10/09 20:04ID:???$aa= '$zz';
$zz='hoge';
print eval $bb;
こうか。どっちにしろできない。
0714名無しさん@お腹いっぱい。
01/10/09 20:08ID:???無理に置換するよりも、最初のままの方がいいんではないか思う。
あと、
eval(qq($template))
って書くと少しカッコイイ(w
0715名無しさん@お腹いっぱい。
01/10/09 21:50ID:???関数のリファレンスについての質問です。
配列やハッシュならよく使っているのですが、関数のリファレンスは
どういうときに便利なのかがいまいち理解できません。
先生、ご指導お願いします。
0716名無しさん@お腹いっぱい。
01/10/09 22:19ID:ac7tHUi6プロバイダの個人HPなので、システム変更の自由はきかないんです。
その上、gzipも使えないので。
やはりCPANのArchive::zipを使えと言う事になるのでしょうか?
0717>715
01/10/09 22:25ID:???&Fnc(\%data, $file);
sub Fnc {
my ($ref_data, $file) = @_;
my $name = $ref_data->{NAME};
my $title = $ref_data->{TITLE};
open(DATA, $file);
.....
}
---例えばクラスを作るとき
sub new {
my $class = shift;
my $self = {};
bless($self, $class);
$self->_initialize();
return $self;
}
sub _initialize {
my $self = shift;
$self->{NAME} = 'hoge';
.....
}
0718711じゃないけど
01/10/09 22:28ID:???置き換えても動作せんよ?漏れがいけないんかな?
0719名無しさん@お腹いっぱい。
01/10/09 22:39ID:rO0MbdjQローカル環境でgzipの展開にCompress::Zlibを使ってます。
ただしUNIXサーバに入れるにはCコンパイラが必要みたいです。
(うちはWindows + ActivePerl + PPMなのでコンパイル不要だった)
0720714
01/10/09 23:38ID:1lvwgexcあれれ?
$needle='This is sample text.';
$template='$needle';
print $template,"\n",eval(qq($template)),"\n";で、
$needle
This is sample text.って出ませんか?
0721714,720
01/10/09 23:39ID:???しかもageちゃったシクーリ
0722名無しさん@お腹いっぱい。
01/10/10 00:19ID:FXDqXQ2wどうすればいいですか?
掲示板はネットで見つかったのですがリンクの制限が見つからなくて困ってます。
0723名無しさん@お腹いっぱい。
01/10/10 00:29ID:???それだとばっちし動作します。けど>>707の最後の一行と
eval(qq($template))を置き換えても動作しないです。
「文字列の中の変数名」をあとから展開
てのはその方法だとできないって事なのかな?
ちなみにeval(qq($template))のqqてのは何なのでしょうか?
0724名無しさん@お腹いっぱい。
01/10/10 00:39ID:???最初にHTTP_REFERERとって特定のURL以外ならlocationで飛ばせばいいんでない?
0725722
01/10/10 00:39ID:FXDqXQ2w0726707
01/10/10 00:54ID:1woNivdAおれも自分で試してみたよん。
eval(qq($template)) では707はうまくいかないっす。
eval(qq("$template")) ならオーケーでした。
結局、このやりかたは評価が2回必要になる(?)ので、
正規表現展開の手間をいれても>>710の人のやりかたが速いです。
Benchmark検証済み。
0727名無しさん@お腹いっぱい。
01/10/10 00:56ID:???my変数が見えない、strict refsでは動かない等の問題があることだけ注意。
0728720
01/10/10 01:08ID:fymnbEUM(´-`).。oO(なんでこんなヘボいミスしたんだろう……)
というわけで、
eval("qq($template)")
が正解です。失礼しました。
qqについては
ttp://flex.ee.uec.ac.jp/texi/perl/perl_136.html
このへん参照するといいと思う。
0729716
01/10/10 08:19ID:OwjZu2K6レスどうもです。そうですか、ドキュメントを未だちゃんと読んでいなかった
のですが、Compress::Zlibはコンパイルが必要ですか。プロバのHPなので
それも出来なくてちと悲しいです。
0730名無しさん@お腹いっぱい。
01/10/10 11:46ID:???コンパイルもやろうと思えば出来ますよ。
0731名無しさん@お腹いっぱい。
01/10/10 14:09ID:29gVd4os送信したいんですが、どのように受け渡せばいいのでしょう?
$ua->cookie_jar($cookies);
みたいに格納できるメソッドがあるのですか?
0732名無しさん@お腹いっぱい。
01/10/10 14:48ID:???CGIで読みこんだりとかできるの?それでパスクラックできねえかな。
0733名無しさん@お腹いっぱい。
01/10/10 14:56ID:???0734名無しさん@お腹いっぱい。
01/10/10 14:58ID:???0735名無しさん@お腹いっぱい。
01/10/10 16:22ID:2.AeAxdcPOST用のデータはRequestのほうに入れとく。
my $req = HTTP::Request->new(POST => $url);
$req->content('name=hoge&text=hoge');
もしデータ内に日本語などがある場合は
use HTTP::Request::Common;
$req = HTTP::Request::Common::POST($url, [name='ほげ',text='ふが']);
を使うと、自動的にエスケープしてくれて楽。
0736名無しさん@お腹いっぱい。
01/10/10 16:25ID:???0737名無しさん@お腹いっぱい。
01/10/10 16:28ID:???0738名無しさん@お腹いっぱい。
01/10/10 16:46ID:???ありがとうございます。
調べてみたら
$hd = HTTP::Headers->new;
foreach $key ( keys %FORM ){
$hd->push_header( $key -> $FORM{$key} );
}
$req = HTTP::Request->new( 'POST', $url, $hd );
でもいけそうな感じだったので試してみます。
というかPOSTで渡す内容が不特定なので
[name=>'ほげ', text=>'ふげ']
だと無理ですかね。
0739731
01/10/10 18:23ID:???うう、 $hd->push_header ではうまくいきませんでした。
>>735 さんの方法で上手くできるんでしょうが、不特定多数の
要素を送る必要があるのでこの方法は使えないし…。
すいません、不特定多数の要素を POSTとして送る方法を
教えていただけないでしょうか。
0740名無しさん@お腹いっぱい。
01/10/10 19:04ID:???0741740
01/10/10 19:06ID:???my $req = HTTP::Request::Common::POST($url, \%FORM);
0742名無しさん@お腹いっぱい。
01/10/10 19:37ID:???うまく動いてくれません。
何が足りないのか教えてください。
sub foo()
{
sub _getstr($)
{
my ($str) = @_;
return $str . "だよ\n";
}
my ($str) = _getstr("てきとー");
print $str;
}
sub foo2()
{
sub _getstr($)
{
my ($str) = @_;
return $str . "だもん\n";
}
my ($str) = _getstr("てきとー");
print $str;
}
&foo();
&foo2();
0743名無しさん@お腹いっぱい。
01/10/10 20:05ID:0t.5n9Msそれじゃ_getstrが局所的な関数定義になってないです。
Perlは基本的に、どこで定義してもグローバル関数(笑
2つの_getsrtを別々の名前空間で定義すればオーケ。
sub foo() { package foo; sub _getstr() 以下略 }
sub foo2() { package foo2; sub _getstr() 以下略 }
0744名無しさん@お腹いっぱい。
01/10/10 20:27ID:???どうもありがとうございます。
my宣言とかできるかちょっと期待したのですが、
これは、packageの方も少し試してみて、
内部関数名を変えるかpackage使うか決めたいと思います。
(関数内でpackage書けるの知りませんでした。どうもです)
0745名無しさん@お腹いっぱい。
01/10/10 20:42ID:???0746名無しさん@お腹いっぱい。
01/10/10 20:56ID:???local *foo = sub{ hogehoge };
my $foo = sub{ hogehoge };
#とすれば良いのではないかな?
0747名無しさん@お腹いっぱい。
01/10/10 22:41ID:???それがほんとのローカル関数ですね。
743みたいなのは外から&foo::_getstr()でアクセスできるし。
0748名無しさん@お腹いっぱい。
01/10/10 23:55ID:???なるほど! ありがとうございます。
0749名無しさん@お腹いっぱい。
01/10/11 11:44ID:???なるほど。こんな感じですね。
どうもありがとうございます。
sub foo()
{
my $_getstr = sub($)
{
my ($str) = @_;
return $str . "だよ\n";
};
my ($str) = $_getstr->("てきとー");
print $str;
}
プロトタイプに注意。
#!/usr/bin/perl
sub PrintScalar($){ print shift, "\n" }
BEGIN{
*PrintScalar2 = \&PrintScalar;
$PrintScalar3 = \&PrintScalar;
}
*PrintScalar4 = \&PrintScalar;
$PrintScalar5 = \&PrintScalar;
my @hoge = qw(foo bar);
PrintScalar (@hoge);
PrintScalar2 (@hoge);
$PrintScalar3->(@hoge);
PrintScalar4 (@hoge);
$PrintScalar5->(@hoge);
PrintScalar6 (@hoge);
BEGIN{
*PrintScalar6 = \&PrintScalar;
}
__END__
0751名無しさん@お腹いっぱい。
01/10/11 16:48ID:kMiBAPJ6えーと、「プロトタイプを有効にするには、BEGINブロックの中で
エリアスを作るしかない」つーことですか?
あ。念のため今perldoc perlsub見たら、そう明記されてたっす。
知らなかったー。プロトタイプあんま使わないから。
要するにプロトタイプ付きの「ローカル関数」は作れないってことなのか。
0752751
01/10/11 16:51ID:???0753名無しさん@お腹いっぱい。
01/10/11 20:27ID:???なんかサンプル見るとtry〜catch構文とか作ってて
いろんな意味でスゲーんですけど。
俺は一生プロトタイプ'&'を自分で使うことはあるまい。
0754nullsann
01/10/11 23:27ID:S31Vh/vQファイルロックは一度で良いんでしょうか?
sub filecheck{
&lock;#
open IN,"$logfile";
#syori
close IN;
open FP,"> $logfile"
#syori
close FP;
.
.
.
.
&unlock;
}
mkdirのロック方式使ってるんですが・・・。
0755名無しさん@お腹いっぱい。
01/10/12 00:30ID:???一度でよし。
0756名無しさん@お腹いっぱい。
01/10/12 01:31ID:kGkVgeeAif ($ENV{'HTTP_REFERER'} ne 'http://許可する.com') {
print "Location: http://ばいばい.com\n";
print "\n";
}
にしたのですが、閲覧を許可する参照元をもう一つ増やすにはどうしたらいいですか?
if ($ENV{'HTTP_REFERER'} ne 'http://URL1'|'http://URL2')
だとうまくいきませんでした
0757名無しさん@お腹いっぱい。
01/10/12 01:54ID:???許可するのが2つぐらいなら
「URL1ではなく、URL2でもなければ、ばいばい」というふうに
素直にコーディングするといいです。
if ($ENV{略} ne 'URL1' and $ENV{略} ne 'URL2') {
・・・
}
0758名無しさん@お腹いっぱい。
01/10/12 10:18ID:UFajsOUw根本的に違うのでしょうか?お教えください。
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>CGIテスト</TITLE></HEAD>\n";
print "<BODY>\n";
#
print "<form name="form1" method="post" action="">\n";
print "<input type="checkbox" name="checkbox" value="checkbox">\n";
print "</form>";
#
print "</BODY>\n";
print "</HTML>\n";
__END__
0759名無しさん@MZ-2000
01/10/12 10:21ID:???とりあえず
print "<form name="form1" method="post" action="">\n";
print "<input type="checkbox" name="checkbox" value="checkbox">\n";
この二行がだめ。
0760名無しさん@お腹いっぱい。
01/10/12 10:24ID:???0761名無しさん@お腹いっぱい。
01/10/12 10:39ID:DN2jVK/o0762名無しさん@お腹いっぱい。
01/10/12 11:11ID:VXGFJvh.print "<input type="checkbox\" name=\"checkbox\" value=\"checkbox\">\n";
だね。
0763名無しさん@お腹いっぱい。
01/10/12 11:16ID:VXGFJvh.print "<input type=\"checkbox\" name=\"checkbox\" value=\"checkbox\">\n";
鬱だ。
0764名無しさん@お腹いっぱい。
01/10/12 11:20ID:???0765名無しさん@お腹いっぱい。
01/10/12 11:39ID:???qq{<input type="checkbox" name="checkbox" value="checkbox">\n};
まぁ>>758、お前はマトモな本で基礎を勉強してから出なおしなさいってこった。
0766名無しさん@お腹いっぱい。
01/10/12 11:43ID:uPcFyHO2ロジックを1行に書くのって頭が混乱しない?
効率悪いかも知れないけど、こんな関数を作るほうがいいと思う。
if (! &is_good_referer()) {
:
}
sub is_good_referer {
my @kyoka = ('URL1', 'URL2');
foreach my $url (@kyoka) {
if ($ENV{HTTP_REFERER} eq $url) {
return 1; # 許可するURLのどれかに一致すれば1を返す
}
}
return 0; # どれにも一致しなければ0を返す
}
0767業
01/10/12 11:57ID:e.iu2Egsただ、空白2文字はちょっとな。4文字は欲しい。
0768名無しさん@お腹いっぱい。
01/10/12 12:13ID:Qk0xmYmc扱いができないのでしょうか?
cgiとして動かすか、実行形式にするしかないのですか?
0769名無しさん@お腹いっぱい。
01/10/12 12:18ID:ZYB0SiF6意味わからん…。
もっと具体的に言ってくれ。
0770名無しさん@お腹いっぱい。
01/10/12 12:19ID:???ラリーヲールが2文字推奨なんだっけ?
0771名無しさん@お腹いっぱい。
01/10/12 12:20ID:Qk0xmYmc即レス感謝です。
わかりずらいですね。DOS窓からスクリプト実行すると
file openとかしても読み取ってくれないのです。
これは何故でしょうか?
0772名無しさん@お腹いっぱい。
01/10/12 12:26ID:???0773名無しさん@お腹いっぱい。
01/10/12 12:27ID:ZYB0SiF6ありがちなのは、パス付きのファイル名を書くとき、
ダブルクォート文字列の中で"\"を"\\"としてないこと。
× "c:\hoge\fuga.txt" ←これはだめ
○ "c:\\hoge\\fuga.txt" ←これはよし。
○ 'c:\hoge\fuga.txt' ←シングルクォート使ってもよし
○ "c:/hoge/fuga.txt" ←"\"じゃなく"/"使ってもよし
0774名無しさん@お腹いっぱい。
01/10/12 12:29ID:???パスが違うかパーミッションの問題じゃねーの。
とりあえず
$filename = "moe/moe.txt"
open(F, $filename) or die "$!: $filename";
としかて、なんで失敗しているのか確認スレ。
0775名無しさん@お腹いっぱい。
01/10/12 12:37ID:???難しく考え杉じゃない。
わかれば簡単。で、サンプル
sub synchronized(&) {
my $code = shift;
lock();
$code->();
unlock();
}
synchronized {
# >>754から
open IN,"$logfile";
#syori
close IN;
open FP,"> $logfile"
#syori
close FP;
}
0776775
01/10/12 12:40ID:???synchronized {
#...
};#<-これ
0777名無しさん@お腹いっぱい。
01/10/12 13:23ID:PeaA6TSMor die "$!: $filename";
いれてやったらファイルみつからんて言われちゃいました.
0778名無しさん@お腹いっぱい。
01/10/12 13:34ID:???0779名無しさん@お腹いっぱい。
01/10/12 13:50ID:???御迷惑おかけしました。
どうもありがとうございました。
0780名無しさん@お腹いっぱい。
01/10/12 14:02ID:PeaA6TSM$sym = mypack::$var;
は、
$var = 'myvar';
$sym = "mypack::$var";
とは違うらしいのですが、何が違うのでしょうか?
0781777-780
01/10/12 14:45ID:???DOS窓だと
open(MAIL, ">>$docomo");って
できないんですか?追記のはずが最初の一回目しか
書き込めんですヽ(`Д´)ノ
0782名無しさん@お腹いっぱい。
01/10/12 14:49ID:???なんか私の恥じをさらすスレと化してしまい
申し訳ありません。
ごめんなさい。ごめんなさい。ごめんなさい。
0783JAPU@見知らぬ国のトリッパー ◆dcddJAPU
01/10/12 14:51ID:???...という違いです。
0784名無しさん@お腹いっぱい。
01/10/12 14:51ID:???ミスるのはいいから、なにをどうミスっていたか書いておいてほしい。
それを見た他の初心者が同じ事をしないですむ可能性があるんだから。
0785名無しさん@お腹いっぱい。
01/10/12 15:29ID:???誰もしないようなミスだったんで、、、
openする前に$docomoをforeach文で上書きしまくってました。
ちなみに相対パスだとオープンできないってのは
よくわからないままです。
他はみなさんの言うと通りやったらできました。
0786名無しさん@お腹いっぱい。
01/10/12 15:33ID:???780に対するのですね。ありがとうございます。
ただそれだけなんですか。なんか深い意味があるのかと
思っちゃいました。
0787名無しさん@お腹いっぱい。
01/10/12 15:35ID:???実行時のカレントディレクトリとスクリプトがおいてあるディレクトリは同じ?
0788名無しさん@お腹いっぱい。
01/10/12 15:53ID:???実行時のカレントディレクトリはスクリプトの
ある所になるのでは無いのですか?
0789名無しさん@お腹いっぱい。
01/10/12 16:05ID:???実行時のカレントディレクトリが基準になるのでは。
0790名無しさん@お腹いっぱい。
01/10/12 16:08ID:???0791名無しさん@お腹いっぱい。
01/10/12 16:46ID:???command.comからの相対パスなんですね。
なるほど。ありがとうございます。
0792名無しさん@お腹いっぱい。
01/10/12 20:37ID:???> command.comからの相対パス
何故そう解釈出来る?
command.comからの相対パスだと、基準はC:\Windowsになってしまうでしょ。
実行時のカレントディレクトリだぞ・・・
0793名無しさん@お腹いっぱい。
01/10/12 22:52ID:.7AHiXCo違うんですか?実行時のカレントディレクトリというのは
どういう事ですか?
ちなみにcommand.comからの相対パスで
やったらうまくいったものでして。。。
0794名無しさん@お腹いっぱい。
01/10/12 22:55ID:???0795名無しさん@お腹いっぱい。
01/10/12 23:16ID:???■ このスレッドは過去ログ倉庫に格納されています