【Perl】初心者コーナー Part17
レス数が900を超えています。1000を超えると表示できなくなるよ。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0802nobodyさん
02/11/12 21:27ID:9jFBTK95s/,a,/,b,/g;
とすると/,a,/は大丈夫なんですが/,b,/でエラーになります。
/\,b\,/としてもだめでした。
s/a/b/g;だとよけいなところまで変わっちゃいます。
どう書けばよいのでしょう?
0804nobodyさん
02/11/12 22:07ID:???ちなみにそのやり方だと、,a,a,a,が,b,a,b,にならないか?
0805785
02/11/12 22:09ID:???今一度御教授ください、おながいします
色々自分で調べてみて、Perl5.6で実行してる(はず…)ので、ourで宣言しても
Global symbol "$log_dir" requires explicit package name at 2ch.cgi line 1340.
とかガソガソ警告吐かれました( ´Д⊂
use vars qw[$log_dir];と、もう片方の御教授いただいたやり方だと
引っ張ってきた変数に関しては警告吐かれなくなりました… なんでだ…
でも20も30もあるのに全部引っ張ってくるなんてわかりにくすぎー…、と
ちなみにCORE::の方はわかんなかったのでとりあえず呪文みたいなもんだと思っておきます(藁
>>801
-cスイッチ スクリプトの構文チェックだけして終了する(スクリプトを実行しない
-Tスイッチ 汚染チェック(データセキュリティチェック)を有効にする
-wスイッチ 警告を出力する
本よりコピペ …本にCtrl+Fとかやりたくなったりしません?
0806795
02/11/12 22:21ID:???1500行でpackage分けされていないとは、物凄いコードをつかまされてしまいました
ね。ご愁傷様です。
さて...まずですね、myをつけると、別の変数から移し換えない限り、スコープの外
からは読めません。別のファイルはスコープの外なんで読めません。
従いまして、settingの変数はグローバル変数かパッケージ変数にするしかありませ
ん。よって、settingのuse strict; を外すか、>>787さんが書いているように明示的
なグローバル宣言をしなければなりません。mainでuse strict; していないなら、
シンボルのエクスポート/インポートという手もありますが、名前空間を汚染するの
で、グローバル変数にするのと何ら変わりません。
名前空間を汚染しないようにするには、おそらく私の書いた方法しかないはずです。
納期が迫っているなど、修羅場な場合は、settingをmainの先頭にべちょっと貼りつ
けるという手もあります(これならmyでも読めます)が、非推奨です。
0807795
02/11/12 22:26ID:???スコープの外では参照できません。
例えば、同じサブルーチンを何回も通る時に、前の値を記憶しておいて使いまわし
たい時とかに使います。
私も過去に誤解して苦しんだ経験があるのを忘れていましたよ。ヤレヤレ。
0808nobodyさん
02/11/12 22:34ID:???>&error の部分で失敗してるっぽいですね...
&error でコケてるの?
コケてるのが &error なのか正規表現なのかの切り分けが先では?
0809785
02/11/12 22:59ID:???つかまされたと言うかなんというか…
すみません本から得た付け焼き刃の知識なので効率とか可読性とかその他モロモロダメダメです( ´Д⊂
いまだにどういう記述をしたらのちのち楽できるかとか分かってないリアルに初心者なもので…
えと、スコープってまだよくわかんないんですけどスコープ≒個別の名前空間みたいな認識でいいのでしょうか(汗
あと、use strict;の方はmainの方でしてますです、そのあとにsetting.cgiの方を引っ張ってくる、とゆー流れです
えーと、それでourで宣言してもレキシカル(?)で局地的だよ、>>787さんの言ってたuse vars略で
引っ張ってくる、と言う手もあるけど名前空間が汚染される(意図しない変更が加えられる?)ので
よろしくない、パッケージにしちゃった方がよい、という意味だと思ってよいのでしょうか…
…がんがります
0810nobodyさん
02/11/13 00:57ID:???0811nobodyさん
02/11/13 09:43ID:4S21F8gNこれってDBMによる恩恵はあるんでしょうか?
とりあえず勉強目的で作ってみたのですが。。。
0812795
02/11/13 11:35ID:???まぁまぁ。慌てない慌てない。マターリと落ちついていきましょうや。
my変数のスコープは、宣言してあるところを囲んでいる一番内側のブロック、
サブルーチン、ファイル、eval(これは分からなくてもいい)です。
よって、setting.cgiというファイルの外は、「スコープの外」になりますので参照
不可能です。
グローバル変数のスコープはありません。どこからでも参照できて変更できる、
地獄への片道切符です。package Pak; と指定することによって、package宣言のス
コープ(これはmy変数と同じです)の範囲に書いてあるグローバル変数が、パッケージ
変数となります。だから、ファイルの先頭でpackage Pak; とやると、そのファイル
に書いてあるグローバル変数すべてが、Pakに属するパッケージ変数になります。
要するに、スコープとネームスペースは別ものです。
パッケージ変数はグローバル変数の一種ですが、レキシカル変数(my)はそれらとは別
ものです。
0813795
02/11/13 11:48ID:???それで、our宣言した変数のスコープはmyと同じですから、settingの外では参照不可能
です。our => グローバルではありません。
main で use strict; しているということですから、settingから変数を読む仕様に
なっていると、それはグローバル変数なので(myだと読めませんよ)、警告が出ます。
use vars qw(var ...)は、use strict; した時にグローバル変数を使うぞ、と宣言する
ものですから、これをやっておけば警告は出ません。しかしながら、これをやると
いうことは、setting を main の先頭に書いているのと同じことになります。つまり
setting で使ったシンボル(変数とかの名前)だけ、mainのネームスペースが汚染され
ることになります。ネームスペース汚染の恐ろしさは、exitの件でお分かりでしょう。
以上の理由からパッケージ分けをおすすめしているわけです。
というか、納期が迫っているんでなければ、settingをクラス化、そこで宣言されて
いる変数をクラスのメンバにしてアクセスメソッドを実装してそれでアクセスする
ようにし、ついでにmainでそれらのデータをいじくっている部分をクラスに放り込む
といったことをするといいんじゃないかと思います。
0815792
02/11/13 15:51ID:???結局、別の項目の処理で出るエラーページを流用する事にして
(不正な入力の項目があります、平仮名にしてくださいと一文足して)
こうなりました
if ($in{'msg'}){
if ($in{'msg'} !~ /\x82[\x9F-\xF1]/){
&error1();}
}
レス下さった方々ありがとうございました。
0816785
02/11/13 18:41ID:???ありがとうございます 本とかネットとかもそーゆーふーに簡潔に書いてもらいたいもんです(藁
>>812-813
毎度親切にありがとうございます( ´Д⊂ がんがります
スコープは>>810さんともあわせて分かったような気がします
今までもmyで宣言した変数が使える範囲はなんとなく分かってたんですけど、それがスコープだったのですね
んで、パッケージ内でグローバル変数っぽく振る舞ってるヤシがパッケージ変数、と…
スコープと名前空間は別物だということも多分わかりました
ourで宣言した変数の扱いのほうも自分なりに調べてみますた
tp://books-support.softbank.co.jp/pn/special04-1.html
↑のより、"宣言した時の名前空間に所属する変数だけど同じスコープ内だったら別の名前空間のトコでも明示しなくても扱えるよ"
て感じなのですかね?
また、名前空間の汚染の方のお教えも、大体分かった気がします
(´-`).。oO( いまだに名前空間の汚染、というののハッキリした意味が分かっていないのですけれども(藁 )
とりあえずスクリプト全体を見直しながら、設定ファイルの方をパッケージにして書き直してみようと思います
最後の4行は全然分かりませんでしたが( ´Д⊂ オブジェクト指向…? 勉強不足です…
ちなみに工房の道楽(不真面目にやってるわけでもないですけど)ですので納期とかはありません(藁
(´-`).。oO( 大人は大変なんだろうなぁ… 現在BlackBookのPerl&CGI言語リファレンス読んでます 今までに読んだ3冊とはレベルが…(トオイメ )
0817nobodyさん
02/11/14 22:14ID:???MFCガリガリ弄ってるリア厨も居る訳だから
分かった気になったもん勝ち
0818785
02/11/14 23:15ID:???工房だもーん、会社勤めなんかしてないもーん、と
つーか分かった"気になった"もん勝ちですか(藁
とりあえず本読み終わって>>813で御教授いただいたヤツの最後4行もほんのりとわかりますた
でもそういう管理の仕方にする利点がいまだにわかりません(藁
あとクラスとかの宣言がどうとか、とかも(藁
perlobjの日本語化されたヤツとか探して彷徨ったり、と( ´ー`)y-~~
(´-`).。oO( 正直もうごちゃごちゃしちゃって大変ですたい )
0819nobodyさん
02/11/14 23:45ID:WsA3gc/pフリーの掲示板をカスタマイズするコトすらままならない者です。
バカなわたくしめに御教授お願いします。
※HTMLタグは分かります。
わたしがダウンロードした掲示板はタグ禁止タイプです。
しかし、メッセージ・フォーム($body)に「http://」で始まる文字列には<a href="">でリンクを
はりたいのですが、どうしたらよいのでしょうか。
すみませんがよろしくお願いします。
0823nobodyさん
02/11/15 09:01ID:Vx/BDeum今CGIの猛勉強中なのですが、分らない事があったので教えてください。
「-=」 マイナスイコール
この演算子は、どういう意味のものなのでしょうか?
そもそも演算子なのでしょうか;;
検索を書けても-=ではヒットせず、色々調べてみても情報が見当たりませんでした。
知ってる方、是非教えてください〜〜。
0824nobodyさん
02/11/15 09:31ID:???$hoge -= 10; $hoge = $hoge - 10;
$hoge += 10; $hoge = $hoge + 10;
$hoge *= 10; $hoge = $hoge * 10;
$hoge /= 10; $hoge = $hoge / 10;
ほとんどのプログラム言語で使える
http://216.127.90.232/scripts.html
0827nobodyさん
02/11/15 10:16ID:???s/(s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/<A HREF="$1">$1<\/A>/g;
が略解。
by perlメモ
0828nobodyさん
02/11/15 11:03ID:???0829nobodyさん
02/11/15 13:41ID:???0830nobodyさん
02/11/15 15:26ID:???あるよ。CGI.pm
0832nobodyさん
02/11/15 16:13ID:???0834nobodyさん
02/11/15 17:14ID:???829と830は僕じゃないデスヨ。そして書くのにルールがあるのをいま知りますた。
初心者コーナー、よしここだ! ズザー!! て感じで書いてしまいますた。反省。
1、Perlのおべんきょに一つ掲示板でも、と(`・ω・´)
2、とりあえずフォームから何か入力して表示させて見よう
3、
まだまだ右も左もわからないので、他所様のソースをじろじろ見ながらまずはデコード、と思ったわけですが。
人によって色々と違ったり何かしてみちゃったりしてよく分からなくて。
お約束事?みたいなのはあるようなのでつが…そこでーデコードと言えば、まあ普通こう書くよ。
みたいなのはあるのかなぁ、とか思った次第であります!(`・ω・´)
CGI.pmは調べて舐めたり触ったり眺めたりしますたが、よく分かりませんでした(´・ω・`)
(´・ω・`)ショボーン
0835nobodyさん
02/11/15 17:20ID:???cgi-lib.pl
0836nobodyさん
02/11/15 18:01ID:???0837nobodyさん
02/11/15 18:55ID:???0838(* ・ω・)萌えー
02/11/15 19:08ID:???0839rubyist@カラアゲうまうま
02/11/15 20:30ID:???まあ、君たちのような低学歴どもは円周率3でいいんじゃない?
(大爆笑)
0840rubyist@カラアゲうまうま
02/11/15 20:37ID:???0841nobodyさん
02/11/15 21:04ID:???if(time-60 >= (stat('比較するファイル.txt'))[9]){
とゆーやり方はやっぱ無理がありますか?
0842nobodyさん
02/11/15 21:12ID:Mv79oNNwそれで出来たんならいいんじゃねーの?
0843nobodyさん
02/11/15 21:43ID:???<input type=text name=$hoge>
というテキストボックスに数字を入力してもらい、
その数の回数、$hogeに対する処理を行いたいのです。
たとえば、$hogeをブラウザに出力するとして、
$cou=$form{"$hoge"};
for($i=0; $i<$cou+1; $i++)
{print "$hoge";}
で良いだろうと思いサンプルを作ってテストしてみましたが、
エラーこそ出ないものの{print "$hoge";}の処理を行ってくれません。
何か悪いところがあったらご指摘いただけますでしょうか。
よろしくお願いします。
0844nobodyさん
02/11/15 21:48ID:???name属性に文字$を用いる必然性と、
use CGI;
my $query = CGI->new();
$query->param("hoge");
とやらない理由を補足せよ。
0845843
02/11/15 22:40ID:???すみません、説明が足りませんでした。
<input type=text name=$hoge>
の$hogeですが、事前に外部ファイルから読み込んだデータを
任意の検索条件によって抽出した文字列が入るようになっています。
商品番号のようなものだと思っていただければ良いかと思います。
後者の方ですが、純粋に当方の勉強不足により
矢印演算子の用法に自信が無いというのでは駄目でしょうか。
844さんの挙げた例も、リファレンス片手に解読を試みましたが
今ひとつピンと来ておりません。
いかにも初心者の書いたループ文でお恥ずかしい限りですが
よろしくお願いします。
0846nobodyさん
02/11/15 22:57ID:???0847nobodyさん
02/11/15 23:45ID:R8gc4u8S初心者にも入らないおヴァカなわたしに御教授下さいまして。
勇気出して投稿してヨカッタ。。。
0848(* ・ω・)萌えー
02/11/16 00:46ID:???0849nobodyさん
02/11/16 00:53ID:???フォームの name をURLデコードしてないなら、$hoge の $ は %24 でおくられてくるからネ。
もしや name=$hoge の $hoge がそのまま Perl のスカラー変数として扱われると勘違いしてたりして・・?(んなことないか ・ω・;)
0850nobodyさん
02/11/16 12:12ID:???0851nobodyさん
02/11/16 12:59ID:???なんで英語のドキュメントしか見つからないんだヽ(*`Д´)ノ
だれか使えるメソッドとか色々書いてあるページ知ってましたら教えてください…
0852nobodyさん
02/11/16 13:02ID:???0854nobodyさん
02/11/16 19:31ID:y1C/hDJGCGIファイルのに渡し、ユーザ名ごとに表示されるページ(構成は同じ)を
変えたいのですが、CGIスクリプトで開くデータファイルをユーザごとに用意
しなければならないと考えデータファイルのパスのところに各ユーザ名に対応
した変数を用意したのですが、CGIスクリプトが上手く実行できません。
どういった理由が考えられますか?
0856nobodyさん
02/11/16 19:38ID:???君の脳に問題がある。<理由
もしくは君の言語能力に問題が。
0857854
02/11/16 19:41ID:y1C/hDJGかえたらオッケーだったんですけど、変数とかパスの中に使うとダメなんすか?
チョー初心者ですいませんがお願いします。
0859nobodyさん
02/11/16 20:18ID:meodONVA「書き込む」をクリックすると
CGIWrap Error: Execution of this script not permitted
Execution of (diaryh/diaryh.cgi) is not permitted for the following reason:
Script is not executable. Issue 'chmod 755 filename'
というエラー表示がでてしまいます。
エースにはサポート掲示板がないので、大変困っています。
お手数ですが、どうぞよろしくお願いします。
0861nobodyさん
02/11/16 20:44ID:IpoPd8nuやっぱりお金をはらってレンタルサーバーかりないと練習にならない
のでしょうか?
0862nobodyさん
02/11/16 20:56ID:???0863nobodyさん
02/11/16 21:01ID:???勉強するならまずローカル環境を用意しる!
ActivePerlとApacheをインスコすればオフラインでCGIテストできて(゚д゚)ウマー
レンタルサーバーで練習するのは他のユーザーの迷惑になるので止めよう。
0864nobodyさん
02/11/16 21:53ID:???それともずっとエラーメッセージをこのスレにコピペするの?
0865デフォルトの名無しさん
02/11/16 22:30ID:???0866nobodyさん
02/11/16 22:36ID:li3X+/+9たとえば $file の中身が userid.dat という文字列で
ここから userid を得たいので
$file =~ s/\.dat$//;
とかやれば、userid を得られると思うが、元の文字列をファイル名としても使いたいので
いつも
$file =~ s/\.dat$//;
$id = $file;
$file .= ".dat";
とやったり
$file =~ /(.*)(\.dat$)/;
$id = $1;
のようにしていますが、これを1行で書きたい。
0868nobodyさん
02/11/16 22:52ID:li3X+/+9うぉぉォォ、、鬱くしい。
さんくす。
0869nobodyさん
02/11/17 00:04ID:rKD6R3WV教えて下さい。あと、素材があったら貼っといて下さい。
0872rubyist@カラアゲうまうま
02/11/17 01:11ID:???それがPerlスレ
0875nobodyさん
02/11/17 01:41ID:???あほだね〜♪ あほだねえ〜♪ Perl厨がPHP本買ってる〜♪。
0876843
02/11/17 01:46ID:???相談に乗って頂き、ありがとうございます。
確認ということですが、$hogeを生成する方のスクリプトは以前動作確認済みだった為、
以下のような今回追加したい部分だけを抽出した
テスト用のスクリプトを作成し、生成される$hogeには
適当な数値をあらかじめ代入してテストしていたのです。
&decode;
$hoge="001";
$cou=$form{"$hoge"};
print "Content-type: text/html\n\n";
print "<html><head>";
print "<META HTTP-EQUIV=Content-type CONTENT=text/html; charset=euc-jp>";
print "<title>test</title>";
print "<body>";
for($i=0; $i<$cou+1; $i++){print "$hoge";}
print "<form action=sample.cgi method=post>";
print "<input type=text size=4 name=$hoge><input type=submit value=送信>";
print "</form></body></html>";
sub decode{省略}
これを実行した結果、name=001の属性を持つ
テキストボックスを表示するところまでは上手く行きましたが、
送信ボタンを押した後に入力した数の分だけ表示される筈の『001』が表示されないのです。
そもそも、値を最初から代入してテストするという思考自体が間違っていたのでしょうか。
(849さんのご指摘の『勘違い』が正しいのかも・・・)
至らない初心者で本当に申し訳ありませんが、
何とぞもう少しご教授いただけませんか。よろしくお願いします。
0877nobodyさん
02/11/17 02:09ID:???0879nobodyさん
02/11/17 04:24ID:???まさか君Perlを webで使うことしか考えてないのか?
ちょっとしたSystem管理みたいなことやらせるのに
PHPとかは向いてないでしょ (w
0880nobodyさん
02/11/17 04:34ID:???Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perl
0881nobodyさん
02/11/17 05:35ID:???0882nobodyさん
02/11/17 08:12ID:???PerlEditorとかなんか挙動不審なんですけど…
(・∀・)イイ!エディタに乗り換えたいよ…
0883nobodyさん
02/11/17 12:27ID:???追いつめられた羊のような事を書かないで欲しいです。
PerlはWEB使うことが主流です。
そんな使い方をする人なんて極々わずかです。いや今は他の言語を使います。
あなたはWEBはPHPを使ってるんですか?Perlでしょ?
だったらもっとPerlを応援してください。
Perl最高! Perl最高! Perl最高!
0886nobodyさん
02/11/17 14:00ID:???0887nobodyさん
02/11/17 16:44ID:eZnGzPxh0888nobodyさん
02/11/17 16:48ID:???自分周辺の狭い世界だけで語るなボケ
0889nobodyさん
02/11/17 16:51ID:???0891887
02/11/17 16:55ID:eZnGzPxhwhile (<DATA>){
if (/set|SET/){
print "$line : $_<br>";}
$line++;
}
0892nobodyさん
02/11/17 17:12ID:???while (<DATA>){
if (/set|SET/){
print "$line : $_<br>";}
$line++;
print;
}
0893887
02/11/17 17:12ID:eZnGzPxhさっきのHTMLの中に埋め込むタグは<SET1></SET1>と対にさせて、その中身を取り出すってかんじです
0894nobodyさん
02/11/17 17:26ID:???>中身を取り出す
いったいどっちがやりたいの?
0895887
02/11/17 17:36ID:eZnGzPxhスマソ
まず、HTML内の<SET1>この文字を取り込む</SET1>から対象文字「この文字を取り込む」をを読み込む。
その後、「この文字を読み込む」を消し、別の文字列を代入
こんなかんじです。どうぞおながいします
0896nobodyさん
02/11/17 21:00ID:JxVm/eIS文字列の最後に改行コードが入ってる為か抜けられません。
chopで改行コードを取り除かずにEOF(改行)のまま認識させるためにはどうしたら良いでしょうか?
0897nobodyさん
02/11/17 22:33ID:???頭に書いてあるではないか。
print Jcode->new($str)->h2z->tr($from, $to)->utf8;
これが理解できないのなら、おそらく一般的なモジュールの使い方が理解できていない
ので、少し戻ることをお勧めする。
また、英語のマニュアルが読めないと、プログラミングにいちじるしい支障をきたすこ
とが多いので、あなたが職業プログラマなら即刻退職を、趣味のプログラマなら英語の
マニュアルに慣れることを勧告する。
>>895
HTML::Templateを使ってみることをお勧めする。
>>896
@hoge = ();
$i = 0;
while ($hoge[$i] = <STDIN>) {
print "$hoge[$i]", "\n";
$i++;
}
と書いてみたらC-dで抜けられたが、どういうコードを想定しているのか教えて欲しい。
それから、改行を削るのは通常chompで行なう。chopは削った残りを返り値として欲しい
場合などに使う。
0899test ◆wSaCDPDEl2
02/11/17 23:08ID:???挫折。
わかる方宜しくおねがいします
0900nobodyさん
02/11/17 23:11ID:???HTMLでは、独自に定義したタグを使うことはできない。
そのため、「完成品」からは、独自タグが消えていなければならない。
HTML::Templateでは、独自タグを残せないので>>895の用件を満たせないと指摘したい
のだと思われるが、もしそうなら用件がおかしい。
しかしながら、>>887を見ると独自タグ自体に意味はないものと考えられるため、上の
ような回答を行った。
0901nobodyさん
02/11/17 23:16ID:???どんな風に挑戦したかソース出してみ。
俺は意地悪だからアドバイスをする気はあっても、答えをそのまま載せる気はなくてね。
レス数が900を超えています。1000を超えると表示できなくなるよ。