Perl コーディング初心者質問コーナー Part34
■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ
04/04/05 16:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0181nobodyさん
04/04/12 19:57ID:???($hoge,$foo) = split /\//, 'japan/korea';
こんな感じですんでまた来てね♥
0182nobodyさん
04/04/12 20:12ID:???0183nobodyさん
04/04/12 22:06ID:???# 侮ヲ不可狽ネ頼エ
これってもちろんPerlのバグですよね?
0187nobodyさん
04/04/12 22:51ID:???PERLで「cgiを呼び出すHTML」を吐き出すcgi を作ったのですが
クエリーがうまくわたらないのです。
1.最初の(固定の)HTMLでは、ファイル中のクリッカブルマップからたとえば
test1.cgi?hogehoge
をリンクしています。
2.test1.cgiでは QUERY_STRING から hogehoge を取り出し
データファイルと照合して hogehogehoge というアイテム名を取り出してるので
HTMLファイルに、
<A href="test2.cgi?hogehogehoge> と出力させています。
3.test2.cgi では、 QUERY_STRING から hogehogehoge を取り出すようにしているのですが
ここで 空文字列しか来ていないようで、2.のHTMLファイルのリンクをクリックするとエラーです。
test2.cgi は確かに呼び出しています。
一連の動作でやるとエラーなのですが、2.のHTMLが表示された段階でブラウザにソースを吐かせ、
それを別のHTMLファイルとして起動してやると、そこからのリンクでは、test2.cgi にちゃんと
hogehogehoge が渡っています。
何か設定を忘れているでしょうか?
0188nobodyさん
04/04/12 23:11ID:???↓
<A href="test2.cgi?hogehogehoge">
0189nobodyさん
04/04/13 00:51ID:???Redhat8.0のperl5.8.0でLWP使って
レスポンスヘッダを編集したいんですが、
newの書式が分からないです。マジで。
require HTTP::Response;
$rc = '200';
$msg = 'OK';
$header = 'Accept-Ranges: bytes\n';
$header .= 'Content-Length: 186965910\n'
$header .= 'Content-Type: text/html\n\n';
$content = '';
$res = HTTP::Response->new($rc, $msg, $header, $content);
print "$res";
と書いたんですが、InternalServerErrorで進めません。
HTTP::Responseでレスポンスヘッダを編集する方法教えてください。
お願いします。
0190nobodyさん
04/04/13 01:00ID:???なんかグタグタですな。。。
use HTTP::Response;
$header =<<"EOS";
Accept-Ranges: bytes
Content-Length: 186965910
Content-Type: text/html
EOS
186 MB の HTML なんてブラクラですね。。。
0191189
04/04/13 01:04ID:???お早い回答ありがとうございます。
いや、ヘッダー情報をいじったり削除したかっただけなんで、
値はどうでも良いかと思ってテキトーに設定しました。気をつけます。
0192nobodyさん
04/04/13 07:51ID:???Windowzで「ヌルポ」と文字化けします。
これってもちろんPerlのバグですよね?
0193nobodyさん
04/04/13 08:21ID:OVsnEkWRTEXTAREAの内容について改行の処理をしようとすると
数字の羅列になってしまいます。
$msg = $FORM{'msg'}; #バッファからセット。URLデコード済。
# $msg = ~ s/\r\n/<BR>/g;
この状態だと「$msg」の中身はちゃんと文字列になっているのですが
下のコメントをはずすと途端に数字の羅列になります。
(文字列を変えても同じ数字になります。)
どうすればこの状態を回避できるでしょうか?
0194nobodyさん
04/04/13 08:29ID:???$msg =~ s/\r\n|\r|\n/<BR>/g;
このようにコーディングしてみたらいけました。
0196nobodyさん
04/04/13 15:08ID:???何かちゃんとした名前があったような気がしたんだけど。
何だっけ。
カタカナ4文字でスがついたような気がする。
0197196
04/04/13 15:09ID:???名前がなかったかも。
0198nobodyさん
04/04/13 15:42ID:sCIWFJ4B表示させる、ということをやっています。
番号が入っているcar_numフィールド(11番目)には
[****-****-****-****]
という形でデータが入っています。
しかし、番号確認画面でその末尾4ケタのみ表示させたいのですが、
なかなか良い考えが浮かびません。
今は以下のように書いて丸々16ケタ表示させています。
諸先輩方、アドバイスよろしくお願いいたします。
<tr>
END
if ($odr[10] == 2){
print"$odr[11]"
}
print <<END;
</td>
0200199
04/04/13 16:05ID:???エボック秒だわ
0202199
04/04/13 16:06ID:???0205nobodyさん
04/04/13 18:00ID:???抜き出してPERLで使いたいのですが、どうすれば良いのでしょうか?
例えば
$string = "FilesystemSizeUsedAvailCapacityMounted on"
の一行から、Size, Usedだけを取り出して使いたいとすると、
@pairs = split(/(\t)/, $string);
print "@pairs[1] @pairs[2]";
としても上手く行きません。(\s)*でも無理なようです。
0206nobodyさん
04/04/13 18:18ID:???print "$pairs[1] $pairs[2]";
0207205
04/04/13 18:21ID:???@pairs = split(/\t/, $string);
だと、何故か全て@pairs[0]に全文が入ってしまい、
@pairs[1]以降は空になってしまうようです。
0209205
04/04/13 18:40ID:???shellのdfコマンド出力から一行抜いてきたstringです。
dfは何を使って区切っているのでしょう?
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/disk1s9 39870600 36823240 3047360 92% /Volumes/disk1
/dev/disk3s2 320144448 267850648 52293800 84% /Volumes/disk2
0210nobodyさん
04/04/13 18:42ID:???何も調べずに的外れなコードを書く奴もDQNだが、解答する奴もそれに劣らずイカレてるな。
>>205
> データから一部の数字だけ
とあるのにコードに数字が一切ないのは何故だ?
my(@data) = ($string =~ /([A-Z][a-z]+)/g);
print "$data[1], $data[2]\n";
お前の望むことはとりあえずこれで出来るが、本当にこんなことがしたいのか?
0211nobodyさん
04/04/13 18:44ID:???$stringを切って配列に代入しようとしてるなら
$stringをprintしてみれば何区切りかわかることだろ。
0213210
04/04/13 18:50ID:???おいおい…(絶句)
もう何も言うまい。ほらよ。
my %data;
my @fileds = ('Filesystem', '512-blocks', 'Used', 'Avail', 'Capacity', 'Mounted on');
@data{@fields} = split / /, $string;
use Data::Dumper;
print Dumper(\%data);
0215205
04/04/13 19:00ID:???みたいな感じの文章出力に使う用です。
0217nobodyさん
04/04/13 19:08ID:???0218nobodyさん
04/04/13 19:36ID:???WinXP+cygwin使用
$ df -h /cygdrive/c | perl -MData::Dumper -ne 'print Dumper split /\s+/'
$VAR1 = 'Filesystem';
$VAR2 = 'Size';
$VAR3 = 'Used';
$VAR4 = 'Avail';
$VAR5 = 'Use%';
$VAR6 = 'Mounted';
$VAR7 = 'on';
$VAR1 = 'c:';
$VAR2 = '74G';
$VAR3 = '39G';
$VAR4 = '35G';
$VAR5 = '52%';
$VAR6 = '/cygdrive/c';
0219205
04/04/13 19:40ID:???で出来ました。ありがとうございます。
0220nobodyさん
04/04/13 23:40ID:???187で質問した者です。
WEB動作環境は勤め先にあるので返答が遅れました。(アクセス制限がかかってるので)
ここに書いた例が間違っていて、実物はちゃんとダブルクォート閉じてました。
いろいろやってみて、どうも
A. CGIが出力したHTMをそのまま(連続で)表示した場合と、
B. それをソース表示して「保存」し、改めて表示した場合で
振る舞いが違うようです。こんなことがあるのかいなと思うのですが...
A.B.のHTMでは、hrefを使って別のCGIを引数つきで呼んでます。
そのCGIを、サーバにあった ENV.PL(環境変数を表示するやつらしい)と換えてみると
Bで表示される環境変数の多くがAでは出てこず、QUERY_STRINGもありませんでした。
(空文字列でなく、環境変数そのものが出て来ない)
ひょっとするとPERLの問題ではないかもしれませんが、スレ違いなら誘導してください。
明日はサーバーを変更してやってみます。
0221nobodyさん
04/04/14 00:50ID:???x <A href="test2.cgi?hogehogehoge">
o <A href="http://〜/cgi-bin/test2.cgi?hogehogehoge">
0223nobodyさん
04/04/14 06:12ID:???回答ありがとうございます。
最初の例では詳しく書いていませんでしたが、どちらのCGIの参照も
http:// から記述してます。(厳密には場所は一段違うところ)
222もそういう主旨ですよね?
0224nobodyさん
04/04/14 15:57ID:???CGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
0225nobodyさん
04/04/14 19:03ID:ALtQW+6b187,220,223です。
誘導ありがとうございました。実は、サーバー変更(自分のPCでAN HTTPD走らせて)したら
問題なく環境変数が渡りました。問題のあったサーバーはNT+IISです。
どうもCGI機能まわりのようなので、あちらで聞いてみます。お騒がせしました。
0226nobodyさん
04/04/14 20:57ID:1L/HDnzJこちらへ質問させて頂きます。
a.pl
b.pl
というスクリプトで、a.plからb.plへ標準出力で引数を渡し
b.plで受け取った引数を加工して、同じく標準出力で
a.plへ返すには、どうすれば良いのでしょうか?
open(FD,"./b.pl data1 data2 |");
という感じでやってみたのですが、a.pl⇒b.plへ
うまく渡されません。
どなたか、ご教授お願い致します。
0227nobodyさん
04/04/14 21:06ID:???0228226
04/04/14 21:38ID:1L/HDnzJ0229nobodyさん
04/04/15 14:38ID:???@<<< @<<<<<< @<<<<<< @<<
$a $b $c $d
.
write;
で出力される物を掲示板などのhtmlに出力したいのですがどうすればいいでしょか?
print format DATA;
みたいなアホな事してみましたがやはりエラーです。
ぐぐっても該当しそうな記事がみつからないし図書館のperlクックブックは
貸し出し中・・
先輩方よろしければお助けください。
0230nobodyさん
04/04/15 15:06ID:???0231229
04/04/15 15:19ID:???0232nobodyさん
04/04/15 17:41ID:???format =
@<<< @<<<<<< @<<<<<< @<<
$a $b $c $d
.
write;
formatは半角スペースでレイアウトするからhtmlへ出力するなら
<pre>で囲んで使うとかしないと。
固定ピッチになって間が抜けて見えるから掲示板には向かない気がするが。
0235233
04/04/15 22:16ID:???あ、writeでエラーになるってことね…。
format DATA =
@<<< @<<<<<< @<<<<<< @<<
$a,$b,$c,$d
.
$~ = 'DATA';
write;
0236nobodyさん
04/04/15 22:22ID:???0237nobodyさん
04/04/16 03:04ID:OgytMPQdkey $hash
key %$hash
と色々やってみたのですが 「keyの引数はハッシュじゃないとダメ」とエラーになります
0238nobodyさん
04/04/16 03:09ID:OgytMPQd0239nobodyさん
04/04/16 03:19ID:5vM41xl8なぜでしょう?
0241nobodyさん
04/04/16 03:27ID:5vM41xl8どのような記述をすると初期値に戻ってしまうのか
教えて下さいませ
0242nobodyさん
04/04/16 03:35ID:???そもそもそういう質問をすることからして何か勘違いしてる可能性もあるが。
0243nobodyさん
04/04/16 03:45ID:5vM41xl8役立たずですね
0244nobodyさん
04/04/16 03:56ID:???暇つぶしなだけ
0245nobodyさん
04/04/16 03:59ID:2Due2Uz0早く寝ろ
0246nobodyさん
04/04/16 04:03ID:???漏れは今起きた
0247nobodyさん
04/04/16 04:03ID:???0248nobodyさん
04/04/16 05:09ID:5vM41xl8自力で解決しました。
役立たずさんは早く寝てください。
0249nobodyさん
04/04/16 06:03ID:???0250nobodyさん
04/04/16 06:56ID:???>なぜでしょう?
これでどう解決すればいいんだよ
き違いはイラク行ってろ
0251nobodyさん
04/04/16 09:58ID:???0252nobodyさん
04/04/16 10:28ID:???0253nobodyさん
04/04/16 10:33ID:???0254229
04/04/16 10:48ID:???>>233
>>234
みなさん、ありがとうございました。うまく出力できるようになりました。
あれから起動hddが逝って換装後os再インストなどでご報告遅れてしまいました。
>>232
ん〜そうですねぇ。間が抜けてみえちゃいますねぇ。
一応管理用のデータ表示程度に出力させたかったので御の字なんですが
本当はこれ以外の出力のさせ方しらなかったのです。
純粋にプログラム初心者なperl初心者なのでhtmlタグの知識などもほとんどなかったり。
ほかにも出力の出し方探してみようと思います。どうもでした。
0255nobodyさん
04/04/16 11:25ID:???グローバル変数の値が初期値に戻ってしまいます
なぜでしょう?
240 名前:nobodyさん 投稿日:04/04/16 03:24 ID:???
>>239
そうなるようなコード部分があるから
241 名前:nobodyさん 投稿日:04/04/16 03:27 ID:5vM41xl8
>>240
どのような記述をすると初期値に戻ってしまうのか
教えて下さいませ
242 名前:nobodyさん 投稿日:04/04/16 03:35 ID:???
初期値を代入した部分が再度実行されれば戻るでしょ。
そもそもそういう質問をすることからして何か勘違いしてる可能性もあるが。
243 名前:nobodyさん 投稿日:04/04/16 03:45 ID:5vM41xl8
>>242
役立たずですね
0256nobodyさん
04/04/16 11:39ID:TQSKBaOOhttp://anonymouse.ws/anonwww.html
↑これみたいに、URLクリックしたら串刺さった状態で該当サイトに飛ぶようなスクリプト探してるんですが、
こんなのって普通に配布されてるんでしょうか?
だとしたらどういう検索ワードで探せばよいか教えてほしいんですけど・・・
0257nobodyさん
04/04/16 12:35ID:???>>1
http://pc5.2ch.net/test/read.cgi/php/1078568723/
0259nobodyさん
04/04/16 22:59ID:???お恥ずかしい初歩的なミスですが、?の後のクエリーを全角文字で書いてました。
受け側もデコードとかしてなくて、それでもクエリーはちゃんと読めて、思ったとおりの
HTMを出力していたのですが、その時点で正常ではなかったようで、そこから飛ぶ
先の環境変数が壊れていました。
誘導してもらった先でも報告しました。報告ですのでマルチポスト御容赦。
0260nobodyさん
04/04/17 00:14ID:???コマンドラインオプションをつけてplファイルを起動したいのですが
perlでコマンドラインオプション引数を受け取る方法がわからないのです。
たとえばデバック用にコマンドラインオプションであらかじめpl内の変数を
設定しておいてフラグを立てたり、logファイルの読み込みディレクトリを
変更したりしたいのです。
そういうことはできないのでしょうか?アドバイスいただければ幸いです。
0262260
04/04/17 01:16ID:???さっそくやってみます。
0263nobodyさん
04/04/17 08:40ID:???掲示板のファイル名取得コードが
$file =~ /\/([\s\S]*)\./;
となっている為、相対パスでlog/log.txtなどの場合は正常に取得できるのですが
絶対パスでH:/bbs/log/log.txtなどの場合は正常に取得できません。
正規表現を調べて
$file =~ /*\/([\s\S]*)\./;
$file =~ /*.\/([\s\S]*)\./;
$file =~ /.*\/([\s\S]*)\./;
$file =~ /.\/([\s\S]*)\./;
みたいな事もやってみたのですが文法エラーだったり目的通りに動いてくれなかったりで
気づけば朝。
こういった場合どういうようにしたらいいのでしょうか?
0264nobodyさん
04/04/17 10:15ID:???絶対パスが他のサーバのファイルだとしたら笑いますよ。
0265nobodyさん
04/04/17 10:16ID:???正規表現を勉強する。
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
0266263
04/04/17 10:34ID:???今自鯖立てていろんな掲示板設置して掲示板弄ったりして
変数やら制御構文やら関数やらを覚えてるんですがその過程で
掲示板のファイル名やlogなどのファイル名を一括表示できる
cgiを作りたいなと思いまして。
>>265
まさに今そのHP見ながら勉強させてもらってるんですが
無い知恵絞って出てきたのが上の文です。
これでいけるはずだ!と思って書いてみてもミスると次どうすればいいのかも
思いつけなくて・・。
0267nobodyさん
04/04/17 10:42ID:???プログラミングは
1 これでいけるはずだ
2 やっぱ駄目。
3 直して1に戻る。
の繰り返しなので、2で止まってしまう人は、お金出して他人に任せなさい。
0268263
04/04/17 10:55ID:???分かりました。お金出して他人に任せ・・たくないので1にもどります。
とりあえず寝ます。ありがとうございました。また何か詰まったら質問させてください。
0269nobodyさん
04/04/17 11:07ID:???最近、Perlの気持ちになってないヤシが多いよ。
0270nobodyさん
04/04/17 11:19ID:???そんなことない?
$file =~ /.*\/([\s\S]*)\./;
俺ならこれに何か付け足す。
あとはガンガレ。
0271nobodyさん
04/04/17 11:29ID:???$
0273nobodyさん
04/04/17 12:31ID:???$file =~ /.*\/(.+)\./;
/だけならいいけど、\まで対応すると一気に面倒なんだよなぁ。
全角とか半角カナが。(SJISね)
0274nobodyさん
04/04/17 14:20ID:ksEVTWBi「&」 … @pairs = split(/&/,$buffer);
と
「=」 … ($name,$value) = split(/=/,$pair);
でデータ切ると思いますが、これを別の文字にできますか?
「&」を「<>」とかに替えてみて、GETだと出来たんですが
POSTで渡すとき強制的に「&」になるようでデータを渡せませんでした。
POSTの時「&」意外にする方法はあるのでしょうか。
お願いします。
0275nobodyさん
04/04/17 14:58ID:???http://pc5.2ch.net/test/read.cgi/php/1055597189/
0276nobodyさん
04/04/17 20:32ID:???./Hoge/Foo.pm
というモジュールを作り、
package Foo;
use strict;
@ISA = qw(Hoge);
としたのですが、
Can't locate Hoge.pm in @INC (@INC contains: /usr/...とか色々
と怒られてしまいます。また、
use Hoge;
としている./aho.plでも、useの行で
BEGIN failed--compilation aborted at …
と怒られてしまいます。
おそらくHoge.pmの位置というか、そのような物が悪いのだと思うのですが、
どう直せばいいんでしょうか?
らくだ本では、Hoge::Fooは./Hoge/Foo.pmを表すって書いてあったと思うんですが…。
0277nobodyさん
04/04/17 21:01ID:???#--- ./Hoge.pm ---
package Hoge;
sub new { return bless {}, shift }
1;
#--- ./Hoge/Foo.pm ---
package Hoge::Foo;
use base 'Hoge'; # base.pm のヴァージョンが古いとコケる場合がある
# use Hoge; push @ISA, 'Hoge'; # その場合の代替策
sub foo { print 'foo!' }
1;
#--- ./script ---
#!/usr/bin/perl
BEGIN { print map "[$_]\n", @INC } # @INC に . が存在するか確かめる
use Hoge::Foo;
Hoge::Foo->new->foo;
__END__
0278nobodyさん
04/04/17 21:08ID:???http://www.kt.rim.or.jp/~kbk/perl5.005/perlfaq8.html#How_do_I_add_a_directory_to_my_i
0279nobodyさん
04/04/17 22:03ID:???が
package Foo;
となっていました…。
フルパスというか、祖先も全部書かないと駄目なんですね。
ありがとうございました。
0280nobodyさん
04/04/17 22:33ID:???./Hoge/Foo.pm の中身は package Foo; でも package Bar; でも
構わないが、use は実際のディレクトリ構造に従って Foo.pm を
探すので、./Hoge 内に置いている限り use Hoge::Foo; とする
必要がある。
■ このスレッドは過去ログ倉庫に格納されています