【Perl】初心者コーナー Part12
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/04/27 23:17ID:1NNXdNspいらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
CGIの質問は【CGIだけどなんか質問ある Pert 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を見よう。
0172nobodyさん
02/05/01 14:33ID:???まぁそりゃ一回書いて二度と見ない・手直ししないスクリプトや1行
スクリプトならね・・・
でも基本的には意味ある・意味ないの問題ではなく、その後問題に
ならないように癖としてつけておくべきものだと思ふ。
0173nobodyさん
02/05/01 14:34ID:Y6d+iOU0たしかPHPではグローバル変数はサブルーチン内で作成できないと思いましたが、
Perlでは間違って変数をグローバル宣言してしまっていてもわからないのですか。
0174nobodyさん
02/05/01 14:35ID:???なんだ、宣言って。local $global;とでもやったのかね。これって
全然グローバルじゃないって事わかってるだろうね?
0175あげ太郎
02/05/01 15:28ID:nNyYCbiy同じ内容の投稿を禁止するには
どうすればいいかわかりますか?
0176あげ太郎
02/05/01 15:30ID:nNyYCbiy0177168の無知
02/05/01 15:32ID:OCxUwcxhそもそもperlという言葉の意味を簡単でいいので教えれくださ
0178nobodyさん
02/05/01 15:43ID:???発言を記録する前に、発言者&内容と、最新の記事の発言者&内容を比較。
具体的なやり方が知りたければ、二重投稿禁止機能のあるBBSを探してそのソースを見るといい。
無料配布のでもたくさんあるだろ。
0179nobodyさん
02/05/01 15:45ID:???http://www.google.com/search?num=100&hl=ja&as_qdr=all&q=perl%82%C6%82%CD%82%C8%82%C9%82%A9&lr=lang_ja
0180nobodyさん
02/05/01 15:58ID:???ourはブロックスコープでuse varsはパッケージスコープを持っているので,
use strict;
sub hoge { use vars qw($hage); $hage = 'sage' }
hoge();
print "$hage\n";
は合格で,
use strict;
sub hoge { our $hage = 'sage' }
hoge();
print "$hage\n"; # Error!
は失格.
ちなみにstrict 'vars'が怒るのは
・パッケージが指定されていない
・パッケージ内でuse varsされていない
・ブロック内でmy,ourされていない
という条件を全て満たす変数にアクセスしようとした場合のみです.
間違ってグローバル宣言する事はまず無いと思うけど,宣言しただけではエラーは出ません.
0182nobodyさん
02/05/01 16:56ID:???この辺ですか?
0183nobodyさん
02/05/01 18:52ID:1jtifKOi参照渡しできなくなるのですか?
0184nobodyさん
02/05/01 18:56ID:???0186nobodyさん
02/05/01 20:37ID:Kie4dwlr自動的にリンクされるように設定したいんですが、
簡単に書きかえれるものなんでしょうか?
それともおれみたいな初心者は無理でしょうか?
0187nobodyさん
02/05/01 20:41ID:???スクリプト改造工房
http://pc.2ch.net/test/read.cgi/php/1012839651/
0188nobodyさん
02/05/01 21:51ID:c2Kry9FX親切に教えて頂きありがとうございます。
わたしのグローバル宣言とは、タイポで未宣言の変数名に
$abc="abc";
のように、存在しているかのように値を入れたことです。
エラーがでなかったので特定に困りました。
パッケージはプログラムの最初に宣言していました。
0189nobodyさん
02/05/01 22:56ID:???あれ? それは use strict; していればきちんと怒られると思うのですが…….
パッケージ云々について少し伝わらなかったような気がするので補足します.
これはプログラムの最初でパッケージ宣言をしているかどうかは関係ありません.
>>180でエラーになっていたところ
print "$hage\n"; # Error!
がありましたが,この場合でも
print "$package_name::hage\n"; # OK
のように変数にパッケージ名を指定すれば怒られずに済むという事です.
この際そのパッケージが実際に存在しているかどうかは問いません.
ぱっと見で参照先が特定できない変数を見つけたらエラーを出す,
というのが use strict 'vars'; です.
あと,Typoを防ぐのであれば /perl -w するのがよろしいかと.
0190nobodyさん
02/05/01 23:12ID:???0191nobodyさん
02/05/01 23:20ID:???0192nobodyさん
02/05/02 00:45ID:???教える方がコーマンチキじゃない(これが素晴らしい)
初心者は結構すぐに礼をしてる。
って辺りを言っているんだが、こういうこと書くと意図的に荒らす奴とかでそうだな。
0193_gnuzip
02/05/02 01:05ID:???教えるほうについては、たまたまそういう解答者がいただけだね。
荒らしについては、いつもの彼が連休でどっか逝ってるんでしょう。
0195183
02/05/02 01:14ID:+oT0W11F下のスクリプトなのですが、local宣言をmy宣言にすると
Can't declare ref-to-glob cast in my at foo.cgi line 10, near ")="
foo.cgi had compilation errors.
となってしまいます。どこを直せばよいのでしょうか?
#!/usr/local/bin/perl
$str='ギコギコニャーニャー。トカトントン';
print "$str\n";
&str_omit(*str,16,'…');
print "$str\n";
sub str_omit
{
local(*str,$size,$omit)=@_;
local($buf)=substr($str,0,$size);
if($buf!~/^([\x00-\x7f]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/){
$buf=substr($str,0,$size-1);
}
if(length($buf)<length($str)){ $buf.=$omit; }
$str=$buf;
return "$str";
}
__END__
0198nobodyさん
02/05/02 01:49ID:???敢えて型グロブを使うなら
×
my(*str,$size,$omit)=@_;
○
local *str = shift;
my($size,$omit)=@_;
0199あぼーん
NGNG0200nobodyさん
02/05/02 04:20ID:Opu6NMoF0204nobodyさん
02/05/02 16:25ID:Opu6NMoFお前を見てるとむかつくんだよ。死ね!!!!!!
死ね!
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
(省略されました・・全てを読むにはここを押してください)
0205nobodyさん
02/05/02 16:26ID:???0206nobodyさん
02/05/02 16:30ID:???・.htaccessで制限
・ログの拡張子を.cgiや.plにしてしまう
サーバーによって使えたり使えなかったりするけど。
ちなみにコーディングの話じゃないからスレ違いな。
0207nobodyさん
02/05/02 16:37ID:???せっかく書いちゃったので。
ログ入れてるディレクトリの .htaccess で
<Files "*.log">
Order allow,deny
Deny from all
</Files>
0209nobodyさん
02/05/02 16:52ID:???出来ない方法を教えられてると思ったか?
出来るよ。
0210nobodyさん
02/05/02 16:52ID:???調べたところrequireしたplファイル内のサブルーチンで
宣言するとエラーにならず、メインのルーチン内で宣言するとエラーになるようです。
0211183
02/05/02 16:56ID:lVIeVo5Wすいません。型グロブというのはよくわかりません。
Cのようなポインタ渡しをPerlで行う方法はありませんか?
0212207
02/05/02 17:00ID:???試せば分かることじゃん。まず自分で試そうよ。
もちろん、悪意のあるアドバイスかもしれんので、apacheの<Files>
の意味を調べてからね。
http://japache.infoscience.co.jp/japanese_1_3/manual/mod/core.html#files
で、CGI内でのファイルの読み書きは、httpd(webサーバ)とは関係ないので、
いくらでもできるよ。
system("cat /etc/passwd");
とか。
0213nobodyさん
02/05/02 17:03ID:???| >>209
| うるせーモカ!うるせーモカ!うるせーモカ!
∧ ∧ |/\_________
(,,゚Д゚)____.
(つ/~ ※ ※ \
/※ ※ ※ ※ \
>>205じゃないよ
0214nobodyさん
02/05/02 17:07ID:???↓調べてみた。型グロブ。
http://www5a.biglobe.ne.jp/~n_rieko/perl/1.htm
リファレンス渡しについては
perldoc perlref
0215nobodyさん
02/05/02 18:39ID:???無ければデフォルト値をセットしたいのですが、変数で
よく使われるテクニック(?)が使えませんでした。
@week = qw(日 月 火 水 木 金 土);# ユーザ任せ
my @week = @week || qw(Sun Mon Tue Wed Thu Fri Sat);
これでは $week[0] に配列の要素数が入るだけのようでした。
それで考えたのは下記ですが、もっと簡単な方法ありませんか?
my @week = @week ? @week : qw(Sun Mon Tue Wed Thu Fri Sat);
0216215
02/05/02 19:01ID:???セオリー通りのやり方が知りたいのでした。宜しくお願いします。
0217nobodyさん
02/05/02 19:07ID:???@week or @week = qw(Sun Mon Tue Wed Thu Fri Sat);
変数だったら $var ||= $default; が普通かなー。
0219nobodyさん
02/05/02 21:28ID:???if ($in{'name'} eq "#pass") { $in{'name'} = "管理人 ★"; }
これでキャップと似たようなものになるはずなんですが、
パスを打って書き込むと「管理人 ★」になるはずですが
「管理人 ☆」になってしまいます。
どうすればいいのでしょうか?
0220197
02/05/02 21:35ID:???型グロブがよくわらんって、あなた自分で使っているやつだよ。
local(*str,$size,$omit)=@_; って書いてる、*strの部分。
型グロブには my は使えんから、>>195のエラーが出るって
とこまで書かないとダメかいね。
しかし、なんでスカラ値渡すのに、リファレンスや、型グロブが
必要なのか謎。
0221nobodyさん
02/05/02 21:39ID:???パス付きでも何でもいいけど、
書き込んだ時にどういう順番で処理されるかをもう一度考えてみれ。
あと、if ($in{'name'} =~ /★/) { $in{'name'}=~ s/★/☆/g; }は
$in{'name'} =~ s/★/☆/g; で十分。
0223nobodyさん
02/05/02 21:47ID:???if ($in{'name'} eq "#pass") { $in{'name'} = "管理人 ★"; }
else{$in{'name'} =~ s/★/☆/g;}
としておけば問題は起こらないと思われ。
これでもまだ「管理人 ☆」になるなら、
1:プレビュー画面を挟んでいないか
2:この処理が2回以上行なわれるようになっていないか
を確認するべき。
0224219
02/05/02 22:25ID:???再確認してみたら
if ($in{'name'} eq "#pass") { $in{'name'} = "管理人 ★"; }
if ($in{'name'} =~ /★/) { $in{'name'}=~ s/★/☆/g; }
と書かれており、上下を入れ替えて試してみたら正常に動作しました。
つまり、ただ自分がミスしてただけでした(w
>>221-223
質問に答えてくれてどうもありがとうございました。
0225nobodyさん
02/05/03 01:45ID:???if ($in{'name'}=~ /アホ/) { $in{'name'}= 'Dream ★'; }
elsif ($in{'name'}=~ /無能/) { $in{'name'}= '_gunzip'; }
elsif ($in{'name'}=~ /厨/) { $in{'name'}= '弐編'; }
0226pear ◆FRUIT8pk
02/05/03 02:45ID:???あ、そのコードを使うなら、下に2行足さないとダメですね
elsif ($in{'name'}=~ /用(無|な)し/) { $in{'name'}= 'pear'; }
else{ $in{'name'}='その他名無し'; }
0227nobodyさん
02/05/03 03:03ID:???効率の良い方法はありませんか?
ファイルの一覧は、@filesに格納してあります。
入力された、$in{'word'}が含まれるファイルをリストアップしたいのです。
よろしくおながいします。
0228nobodyさん
02/05/03 03:57ID:???楽勝だな!
0229nobodyさん
02/05/03 07:36ID:???{
my $tmp;
@files = grep {
open FILE, $_ or die;
read FILE, $tmp, -s FILE;
close FILE;
$tmp =~ /\Q$in{'word'}\E/;
} @files;
}
0230nobodyさん
02/05/03 07:38ID:???my $tmp;
@files = grep {
open FILE, $_ or die;
read FILE, $tmp, -s FILE;
close FILE;
$tmp =~ /\Q$in{'word'}\E/o;
} @files;
}
すまん、/oつけ忘れた。
0231nobodyさん
02/05/03 07:57ID:???でも作りたいものはあります。
まず、お手数かけて恐縮ですがこのサイトを見てみてください。
http://kooks-highhat.com/jpn_index.html
ここの「カラーピックアップシステム」では、何種類もの色と柄を
自由に組み合わせてオリジナルTシャツ作りのシュミレーションができる
ようになっています。
私は、こういったことをTシャツの色と柄ではなく、
「複数種のワイシャツ(写真画像)」と「複数種のネクタイ(写真画像)」を自由に組み合わせて
シュミレートできるようなシステムを作りたいと思っています。
しかしながら全くの初心者のため、どんな言語をどんなふうに使えばできるのか
さっぱりわかりません。
どなたか教えて下さいませんか?
とりあえず「すぐわかるPerl」とかで学べばよろしいのでしょうか?
0234nobodyさん
02/05/03 08:55ID:6+RS1vf9コテハンは死ね!
0235nobodyさん
02/05/03 08:56ID:6+RS1vf90236nobodyさん
02/05/03 09:04ID:6+RS1vf9gdsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgsdgs
xs5r6rs56rs56rs56rs56rs56rs56rs56jtx,7wz434w34w34w34w34w34w34w34w34w34w34,........
0237nobodyさん
02/05/03 10:54ID:6+RS1vf90238nobodyさん
02/05/03 10:54ID:6+RS1vf90240nobodyさん
02/05/03 11:05ID:6+RS1vf90241nobodyさん
02/05/03 11:09ID:6+RS1vf9スキルの低い奴ばっかり
0242こてはん ◆W181N/6Q
02/05/03 11:22ID:???0244nobodyさん
02/05/03 11:26ID:6+RS1vf9スキルの低い奴ばっかり
0245nobodyさん
02/05/03 11:48ID:KcX/dW600246nobodyさん
02/05/03 12:01ID:6+RS1vf9要するに初心者以下のレベルってことよ(ゲラ
おめーら小学校からやりなおせよ(ハゲワラ
0248nobodyさん
02/05/03 12:10ID:???0249nobodyさん
02/05/03 12:11ID:6+RS1vf90251245
02/05/03 12:21ID:KcX/dW60my (%s) = @_;
my %test;
%h_test = ("1", "h1",
"2", "h2");
%$s = %h_test;
}
これでは駄目でしょうか?
0252245
02/05/03 12:24ID:KcX/dW60my %test; -> my %h_test
0255nobodyさん
02/05/03 12:36ID:6+RS1vf9はげ指導医
0256nobodyさん
02/05/03 12:37ID:6+RS1vf9激しく同意
0257nobodyさん
02/05/03 12:59ID:6+RS1vf90259_gnuzip
02/05/03 13:18ID:???すまど
0261nobodyさん
02/05/03 13:43ID:6+RS1vf9│□ ■2ch BBS . − Microsoft Internet Explorer 囗曰区| |
├───────────────────────┬─┤
│ファイル(F) 編集(E) 表示(V) お気に入り(A) モナー(∀) |::田|
├────────────────┬──────┴─┤
| ← → × 圍 合 | Q 》|
| 戻る 進む 中止 更新 ホーム | 検索 |
├────┬───────────┴──┬─┬───┤
│アド レス(D) | □http://www.2ch.net/2ch.html. . |▼|⇒移動|
├────┴───┬┬─────────┴─┴──┬┤
│ ├┤ ├┤
|2ちゃんねる.. || ||
│2chの入り口.. || ||
│2ch総合案内┌───────────────────────┐
│. | 2ch. |
│ ├───────────────────────┤
│おすすめ | 1は不正な処理を行いました 。 ┌───┐ |
│モナー | 残念ですが1の人生を | 終了.... | |
│ | 終了させてあげて下さい。(推奨). └───┘ |
│ | |
│ └───────────────────────┘
│特別企画 ├┤ ├┤
├┬──────┬┼┼┬────────────┬┼┤
├┴──────┴┴┴┴──┬─┬─┬─────┴┴┤
│□ エラーが発生しました | | |●インターネット |
└─────────────┴─┴─┴───────┘
0262nobodyさん
02/05/03 15:29ID:???0263nobodyさん
02/05/03 15:50ID:7hc2ohlWただ、<img src="image.png">などの場合の""の中は変換したくないのですが。
0264nobodyさん
02/05/03 15:57ID:???すっごいめんどうくさい正規表現を組む。
0265nobodyさん
02/05/03 16:19ID:???$str = join '', map {
/^</ and $_ = join '', map { /^"/ or $_ = lc; $_ } split /("[^"]*")/; $_
} split /(<[^>]*>)/, $str;
$strにHTML文書を入れれ。
0266nobodyさん
02/05/03 16:21ID:???alt='この中では"が使えます'
が入ってた場合は?
0267nobodyさん
02/05/03 16:43ID:???$str = join '', map {
/^</ and $_ = join '',
map { /["']$/ or $_ = lc; $_ } split /(["'])([^\1]*\1)/; $_
} split /(<[^>]*>)/, $str;
こんな感じかな? 適当スマソ。
0268nobodyさん
02/05/03 18:01ID:7wVKBbUQprint "Content-type: text/plain\n\n";
print "Hello Perl !";
これをローカルで試そうとして、http://127.0.0.1/chapter1/1.cgi
と入力しました。が、なぜかダウンロードしてしまいます。(保存するか聞いてくる)
text/htmlにするとちゃんとブラウザに表示されます。
解決策教えてください。
0269nobodyさん
02/05/03 18:06ID:???0271nobodyさん
02/05/03 18:13ID:7wVKBbUQダウンロードせずに、結果をブラウザで表示させたいんです。
>>270
Netscape6で確かめたらちゃんとできました。Opera6.01だとだめでしたが。
どうもありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています