Perlコーディング初心者質問スレ Part 53
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/11/26(日) 14:38:23ID:SlmGsFMB【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2-10
前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0757nobodyさん
2007/01/11(木) 14:56:34ID:???0758nobodyさん
2007/01/11(木) 15:08:39ID:???0760nobodyさん
2007/01/11(木) 15:27:03ID:???少し疑問があるのですが、これってURLを直接打ち込まれたら
第三者に覗かれる恐れがありますよね?
0761nobodyさん
2007/01/11(木) 15:28:49ID:???0762nobodyさん
2007/01/11(木) 15:30:33ID:???データファイルは HTTP で見れる範囲より外に置くか、ランダムな文字列で生成された16文字ほどのディレクトリに置けばいい
でなきゃ DB にぶち込むとか・・・
0763nobodyさん
2007/01/11(木) 15:32:42ID:???0764nobodyさん
2007/01/11(木) 15:36:39ID:???説明不足でした。条件を満たしたら隠しページのファイルを読み取るよう
にしたかったのですが、隠したいページのURLを直接入力されたら終わり
だなあと思いまして。
>>762
HTTPで見れる範囲外ですか...なるほど。ちょっと調べてみます。
ランダムなディレクトリはrand関数でなんとかなりそうですが、
僕の知識ではまだまだできそうにありませんorz
>>763
cgiを644にするとファイルが読み取れなくなってしまうので
どうしたもんかと途方にくれています。
みなさんありがとうございます。
0767nobodyさん
2007/01/11(木) 15:57:25ID:???ここでちょこちょこやりとりするだけじゃ面倒みきれない
ような気がする
0768nobodyさん
2007/01/11(木) 16:03:19ID:???openで読み込みましたが、やはりうまくいきませんでした。
急遽、CGIとPerlでシステムを作るよう頼まれたのですが
おっしゃる通り、まだまだ無知なことも多いので1週間くらい
死ぬ気で勉強してみます。
色々聞けてよかったです。ありがとうございました。
0769nobodyさん
2007/01/11(木) 16:03:57ID:???0770nobodyさん
2007/01/11(木) 19:01:52ID:???はぁ・・・
0771nobodyさん
2007/01/11(木) 19:48:29ID:???まあ初心者はPerl/CGIをよくわかってないからな,
偉そうに言ってる俺もいまいちよくわかってないけど.
ここは初心者スレだけど,やっぱりできる人間が多いの?
0772nobodyさん
2007/01/11(木) 20:31:25ID:apL14Vu+742がふぁびょりすぎて噛みあってないんだと思うぞw
Basic認証は、利用できるように設定がなっているなら
.htaccess
.passwd
の2ファイル作って
.htaccessを認証させたいディレクトリに置き、.passwdのある場所を指定する。
.passwdを適切な場所におく。レンサバだと.passwdを置く領域確保されてないっしょ?
/home/[account]/ とか用意してくれている鯖ならいいんだけどね
0773nobodyさん
2007/01/11(木) 20:40:24ID:???たいてい.ht*のファイルすべてがアクセスを拒否されるから、.passwdも
.htpasswdにしておいた方が安心だな。
0774nobodyさん
2007/01/11(木) 23:45:41ID:???770は何がおかしいのかわからんのだが.
CGIとPerlって部分か?
0775nobodyさん
2007/01/11(木) 23:51:59ID:???0776nobodyさん
2007/01/11(木) 23:56:09ID:???770は言葉の意味と用途が違うと言いたいんだろうけど、
ここは初心者質問スレだからな。
「断熱とベニヤ板で家を作る」と言ってる感じか?
そんなの、「ベニヤ板で断熱しつつ家を作る」と
置換・理解できない770がDQNなだけ。ほっとけ。
0777nobodyさん
2007/01/12(金) 01:19:27ID:???CGIの中身をPerlで書きますよって意味なら問題ない。
>CGIとPerlでシステムを作る
って書き方だと
CGIからシステムコールでplなファイルを叩くイメージっぽい気もするかも
でも770の突っ込み自体おかしい。そこは素通りしとけw
0778nobodyさん
2007/01/12(金) 04:21:38ID:???まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
0779nobodyさん
2007/01/12(金) 10:37:26ID:???0780nobodyさん
2007/01/12(金) 11:03:38ID:???とリンクに書いたのなら%A5などのURIエンコードされた部分が
デコードされてくるのは当たり前だろう。
http://www.xxx.com/index.php?%A5%AC%A5
というURIをuriという名前のパラメタで渡したいのなら本来は、
xxx.cgi?url=http://www.xxx.com/index.php?%25A5%25AC%25A5
とすべきなのでは?
0781nobodyさん
2007/01/12(金) 11:13:04ID:???0782nobodyさん
2007/01/12(金) 11:20:56ID:???http://www.example.com/hoge.cgi?a=xxx&b=yyy
みたいなものもありうるとするならば、渡す前の方で
適切にエンコードしておかないとだめですな。
0783nobodyさん
2007/01/12(金) 13:48:13ID:???なるほど…最初のリンクを生成する時点で%を%25にエンコードしておく必要があるんですね。
>じゃなきゃ表示時にもう一回urlエンコードすりゃいいだけの話
>http://www.example.com/hoge.cgi?a=xxx&b=yyy
>みたいなものもありうるとするならば、渡す前の方で適切にエンコードしておかないとだめですな。
urlパラメータに入るURLは、一般的なURLか前述したような文字コードを含んだURLが大半を占めるのですが、
ユーザー投稿式なので、何が来るかわからないという点を考えると、
最初のリンク生成の時点で適切なURLエンコードをしておいた方がいいようですね。
教えていただいた事を踏まえて、最初のリンク生成時に%を%25にエンコードする様スクリプトを組んだ所上手く動きました。
皆さんありがとうございます。
しかし、この方法だとhoge.cgi?a=xxx&b=yyyのようなものが来た時にダメとの事なので、
もう少し適切に処理させたいと思うのですが、またまた上手くいきません。
というか、どういう風に処理したらいいか分からないという感じです。
$elem =~ s/(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)/<a href=\"$script?url=$1\">LINKはこちら<\/a>/go;
$elem =~ s/\%/\%25/go;
1行目は日本語混じりの文章($elem)の中にURLが張られた場合、それを「LINKはこちら」というリンクに置換させています。
そして、2行目で%→%25にしているわけですが、これだと当然問題が。
・本文中の文章の中にURL以外の%があっても置換してしまう。
・&などが来るとダメ?
「%だけじゃなくてちゃんと全部エンコードすればいいじゃないか」 とは思うのですが、
本文中から(https?:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%\$]*)にマッチする文字列だけをエンコードさせる方法がわかりません。
どのようにしたらいいでしょうか?
本文中にはURLが複数箇所張られる可能性も考慮したいです。
度々の質問失礼しますが、ご教授の程よろしくお願いします。
0784nobodyさん
2007/01/12(金) 13:56:34ID:aFkw6ayOヒアドキュメントを使わない時に以下のように書けるコードは
どのように書けばいいでしょうか。
print NEW "mydoc = \"@document\";\n";
これでは出力されるファイルの方には@documentという文字が出る。"をエスケープでも同様
print <<"EOM";
mydoc = "@document";
EOM
これではmydoc = "@documentの中身";という形にならない。
print <<"EOM";
mydoc = @document;
EOM
0785nobodyさん
2007/01/12(金) 13:58:42ID:???use URI::Escape;
$本文 =~ s/(その正規表現)/uri_escape($1)/ge;
てな感じでいいはず
0786nobodyさん
2007/01/12(金) 14:06:42ID:???前者の書き方でいいはずだが。試すときになんか勘違いしてない?
% cat a.pl
@document = qw(unko chinko);
print "mydoc = \"@document\";\n";
print <<"EOM";
mydoc = "@document";
EOM
% perl a.pl
mydoc = "unko chinko";
mydoc = "unko chinko";
0787nobodyさん
2007/01/12(金) 14:13:10ID:???'mydoc = "' .@document. '";' ."\n";
0788784
2007/01/12(金) 14:26:05ID:???まさに勘違いしていたようです(滝汗)
前者であってました。すみません。ありがとうございます。
>>787
さんくすです。
0789nobodyさん
2007/01/12(金) 15:27:30ID:???おぉおおお! できました!
ありがとうございます!
こんな一行で出来る事だったんですね。
これで目的のスクリプトが組みあがりそうです。
2度の長文質問に答えてくださった方々、本当にありがとうございました。
0790nobodyさん
2007/01/13(土) 00:05:27ID:???拡張子が.plのスプリクトの動かし方を教えてください!!!
ActivePerlをインストールしたのですが、そこからどすればいいのか分かりません・・
.plファイルをダブルクリックしてもコマンドラインが一瞬でて消えるだけです・・
通常のアプリのように直感的に扱いたいです。コマンドライン?から起動とかじゃなくて
あと一つ質問です。
拡張子が.plのファイルの拡張子を無理やり.cgiに変更した場合、cgiとして正しく動作しますか? サーバーレンタルしたらそこで使えますか?
perlに詳しい方、厨房にも分かるように教えてください!!!
どうかお願いいたします。
0791790
2007/01/13(土) 00:13:42ID:???ActivePerl-5.8.8.819をインストールしてから.plをクリックしたら、
D:Perl\bin\perl.exeとなってコマンドラインがでてきました。
コマンドラインは消えませんが、ここからどうすればいいのか・・・・
助けてください
0792nobodyさん
2007/01/13(土) 00:17:33ID:???ここは「プログラムを作る人」の為の板でありスレッドです。使う側の質問は板違いです。
0793nobodyさん
2007/01/13(土) 00:20:49ID:???UNIX鯖レンタルしてそこで動かそうと思うですが、何をインストールすればよいのでしょうか?
0795nobodyさん
2007/01/13(土) 21:51:44ID:wEKIwJY9C言語でいうところの、getch() に相当する関数はないでしょうか?
WebProg板って事なので、CGI経由になるのかしら?
それならJavaScriptを使った方がよさげの悪寒♪
0798795
2007/01/13(土) 22:08:17ID:???そっちへ移動します。
0799nobodyさん
2007/01/14(日) 22:03:27ID:7dLarnkvforeach my $key (keys %target){
my $value= $target{$key};
if($key == 1){ next OUTER }
else{ next OUTER; }
}
}
上記と下記は同じ流れ方をすると思っていたのですが、下記のwhileの場合、
どうも%targetを最上層のforeachから再度読み出すとハッシュのはじめから
よんでいないような挙動を見せます。
こちら何かアドバイス等ございます際にはいただけますと幸いです。
OUTER: foreach my $tmp (@tmp_data){
# my %target = %common::target; を入れて初期化すると上記同様の流れになる
while(my ($key, $value) = each(%target)){
if($key == 1){ next OUTER }
else{ next OUTER; }
}
}
0800nobodyさん
2007/01/14(日) 22:11:17ID:???0801nobodyさん
2007/01/14(日) 22:17:51ID:???早速のご返答有難うございます。
そうだとは思うのですが、これに関する説明がググってもどうも
出てこなかったため、質問させていただきました。
ちなみに、PHPの場合では以下がございました。
おそらくこういうことかとは思いますが。。
ttp://asakura.g.hatena.ne.jp/asakura-t/20051116/1132113906
0802nobodyさん
2007/01/14(日) 22:27:08ID:???したら書いてあったけど。ググるだけじゃなくて、マニュアルも読もう
There is a single iterator
for each hash, shared by all "each", "keys", and "values" func tion calls
in the program; it can be reset by reading all the
elements from the hash, or by evaluating "keys HASH" or "values HASH".
0803nobodyさん
2007/01/15(月) 05:27:53ID:???$::FLAG{'cache'}
というのがあったんですけど、
この時の「$」はいったいなんでしょうか?
0804nobodyさん
2007/01/15(月) 08:15:52ID:???0805nobodyさん
2007/01/15(月) 13:31:24ID:???俺的には高度な話題が多くなったなぁ、みんな凄いわ
0806nobodyさん
2007/01/15(月) 20:35:55ID:???:: はパッケージを指定する為の演算子です。
$Pkg::var のように書くと Pkg パッケージのパッケージ変数 $var を参照できるのですが
パッケージ名を省略すると、デフォルトのパッケージである「main」を指定した事になります。
our $hoge = "In main"; # ← main パッケージの $hoge
package Sandbox;
our $hoge = "In sandbox"; # ← Sandbox パッケージの $hoge
print $hoge, "\n";
print $::hoge, "\n";
print $Sandbox::hoge, "\n";
print $main::hoge, "\n";
0807nobodyさん
2007/01/16(火) 10:45:24ID:Vliwd/jI秒数を日付にするのはありますが、
秒数が何時間とか、何日分に当たるのかとかいった変換を行うものはありますか?
3600S→1Hのようなかんじで。
0808nobodyさん
2007/01/16(火) 10:47:49ID:???0809nobodyさん
2007/01/16(火) 10:58:59ID:Vliwd/jIそういうことでなく。
あと、時間や分、秒ごちゃ混ぜで計算できるものあれば。
77H - 4M = 76H56M みたいなの。
秒に戻さず、直感的に計算できればいいです。日付の計算はDate:Simpleにあるんですよね・・・。
0810nobodyさん
2007/01/16(火) 11:19:26ID:???$t1 = DateTime::Duration->new(hours=>77);
$t2 = DateTime::Duration->new(minutes=>4);
$t3 = $t1 - $t2;
printf "%dH%dM\n", $t3->in_units(qw(hours minutes));
0811nobodyさん
2007/01/16(火) 11:25:29ID:???0812nobodyさん
2007/01/16(火) 11:38:08ID:???なるほど。
でも、あらかじめ分解しておかないとダメなんですね。
モジュール探すときって、英語が出来ない自分が恨めしい・・・orz
0813nobodyさん
2007/01/16(火) 11:44:11ID:???0814nobodyさん
2007/01/16(火) 11:51:34ID:???0815nobodyさん
2007/01/16(火) 14:34:37ID:???全体で一意な文字列になるの?
0816nobodyさん
2007/01/16(火) 14:51:23ID:???a) 無名ファイルハンドルを使う
a-1) IO::Handle->newで作る
a-2) my $fh; open $fh, 〜 で作る
b) 型グロブをlocalで局所化する local *FH; open FH, 〜
0817nobodyさん
2007/01/16(火) 15:05:14ID:???楽でいい。
0818nobodyさん
2007/01/16(火) 15:23:34ID:???open my $fh, ">", $file or die $!で済ませられる程度の簡単なプログラムなら
いいんだけど、
unless (open my $fh, ">", $file) {
エラー処理
}
通常の処理
みたいに書こうとすると$fhのスコープがif文の中だけなのでだめなんだよな。
0819nobodyさん
2007/01/16(火) 15:50:18ID:???エラー処理がそんなに長くなければだが、こんなんでどうよ。
ただしインデントには気をつけないと読みづらくなること請け合い。
open my $fh, ">", $file
or do {
エラー処理
};
通常の処理
0820nobodyさん
2007/01/16(火) 16:06:17ID:???�dクス。
ラクダ本見たらこんな感じの記述があったから、
変数に何らかの文字列を設定しなきゃいけないのかと思ってた。
foreach $file (@ARGV){
process( $file, 'fh00' );
}
※process内
open( $input, $filename );
0821nobodyさん
2007/01/16(火) 16:48:11ID:???or do {
エラー処理
};
通常の処理
open my $fh, ">", $file
or do {
エラー処理
};
通常の処理
連続で使うと二重宣言の警告出るがな
0822nobodyさん
2007/01/16(火) 17:17:37ID:???そもそもそれは役目が終わったはずの$fhのスコープを閉じてないところに問題があると思う。
(ただの変数ならともかく、中身がファイルポインタと言う最初と最後がはっきりしているものだから。)
状況にもよるが俺は、ファイルの処理部分をラベル付きブロックに押し込むと
ファイルへのアクセスのスコープが一目で明白になるからしばしばこうやってる。
WRITE_HOGE: {
open my $fh, ">", $file;
通常の処理
}
WRITE_FUGA: {
open my $fh, ">", $file;
通常の処理
}
0823nobodyさん
2007/01/16(火) 18:05:33ID:???WRITE_HOGE:
0824nobodyさん
2007/01/16(火) 18:11:29ID:???0825nobodyさん
2007/01/16(火) 18:11:50ID:???>>822のコードでは何もして無い。こんな効果が
WRITE_HOGE: {
open my $fh, ">", $file
or do {
last WRITE_HOGE; # とかやると
};
通常の処理
} # エラー時にここまでジャンプする
あるけれど、822ではブロック自体に名前をつけて解りやすくするという意味でつけた。
0826nobodyさん
2007/01/16(火) 18:21:52ID:???> ファイルの処理部分をラベル付きブロックに押し込むと
と書いてあるのに何故ググりもせずに聞くのだ?
0827nobodyさん
2007/01/16(火) 18:34:16ID:???0828nobodyさん
2007/01/16(火) 18:37:29ID:???perl ラベル でググるといい
0829nobodyさん
2007/01/16(火) 19:50:01ID:???s#do#doとかラベル#
0833nobodyさん
2007/01/17(水) 01:42:58ID:???より自然な気がすっけどね。
my $code = sub { die : } # エラーしょり
{ # 空ブロック宣言
open my $fh, "hoge" or $code->() ;
close $fh ;
}
0834nobodyさん
2007/01/17(水) 03:08:12ID:???たとえば、aiueoとkaiukekoならaiの部分、abcdeとadeabなら「de」と「ab」です。
でも、連続した文字でない場合は抜き出さなくていいです。二文字以上。
上の例だとa,i,u,e,oの文字、a,b,c,d,eの文字が使われているからといって抜き出さない、といった感じです。
0835834
2007/01/17(水) 03:09:07ID:???>たとえば、aiueoとkaiukekoならaiの部分、
重なってる部分は「aiu」です。
0836nobodyさん
2007/01/17(水) 07:17:18ID:???一箇所しか重ならないの?
たとえば hogefugahoge v.s. fugahogefuga みたく複数の場合とか考慮せんでえーの?
0837834
2007/01/17(水) 07:21:58ID:???hogeが二回とか同じものが複数は別扱いでいいです。
まとめたいときは配列にでもして重複削除処理を加えると思うので。
0838837
2007/01/17(水) 07:26:27ID:???hogefugahoge v.s. fugahogefugaなら
fugahogeというデータが抜き出せたらいいです。
fuge、hogeでもいいです。fugahoge,fuge,hogeでも。
そのあたりは作り手にお任せします。
一番理想的なのは、コノ例なら最初のfugahogeだけですね。後は同じことですから。
0839837
2007/01/17(水) 07:30:03ID:???[hogefuga]hoge v.s. fuga[hogefuga]なら
[]の部分が重なっているのでhogefugaです。
他、fugeと書いている部分はfugaです。
0840837
2007/01/17(水) 07:40:16ID:???hogefugahoge v.s. fugahogefugaの例の場合、
hoge[fugahoge] v.s. [fugahoge]fugaもあるんですね・・・。
重なってる箇所がある場合は長いほう優先にしてください。
同じ長さの場合はどちらか一方で構いません。
説明足りなかったですが、これらの条件と合わせて
二つの文字列で何文字共通箇所があるか?データも欲しいです。
0842nobodyさん
2007/01/17(水) 09:39:21ID:???最長だけでよければCPANに
String::LCSS - Find The Longest Common Substring of Two Strings.
というのがある。
0843nobodyさん
2007/01/17(水) 10:18:37ID:???2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0844nobodyさん
2007/01/17(水) 10:53:47ID:???0845nobodyさん
2007/01/17(水) 10:59:11ID:???0846nobodyさん
2007/01/17(水) 12:13:51ID:???my $two = 'fugahogefuga' ;
my %ones
= map { $_, 1
} map {
unpack +( join '', map "\@${_}A*", 0.. ( length $_ ) - 1 ), $_ ;
} unpack +( join '', map "A${_}X${_}", 1.. length $one ), $one ;
これで全組合せが出るのであとはお好きなように。。。
例えば以下みたく。絞り込むのは自分でやっとくれ。
my @ans ;
for my $str ( sort { length $b <=> length $a } keys %ones ){
my @two_ind ;
my @one_ind ;
push @two_ind, pos $two while $two =~ /($str)/g ;
push @one_ind, pos $one while $one =~ /($str)/g ;
push @ans, { str => $str, one => \@one_ind, two =>\@two_ind } if @two_ind ;
}
0847nobodyさん
2007/01/17(水) 12:17:45ID:???0849nobodyさん
2007/01/17(水) 12:41:34ID:???0850836=846
2007/01/17(水) 12:49:39ID:???0851nobodyさん
2007/01/17(水) 12:52:13ID:???吊ってくるわ
0852nobodyさん
2007/01/18(木) 00:58:49ID:???0854nobodyさん
2007/01/18(木) 01:08:56ID:???どこにでもいるのでスルーするのがよろしい。ゴキブリホイホイより
■ このスレッドは過去ログ倉庫に格納されています