トップページphp
1001コメント346KB

Perlコーディング初心者質問スレ Part 38

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/10/07 23:23:08ID:kiEzDCJF
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0362nobodyさん04/10/27 20:56:50ID:???
>>361
そういうライブラリはあればあったで便利かもしれんな。
0363nobodyさん04/10/27 21:59:06ID:???
package LWP::Open;

use base 'EXPORTER';
use LWP::Simple;
our @EXPORT = ('open');

sub open{

}
ここまで書いた後は頼んだ>>364
0364 ◆7CWqH7Oesg 04/10/27 22:34:08ID:???
use LWP::Simple;
use subs qw(open);
*open= sub { get($_[0]); };
$url="http://www.hogehoge/";
$data= open($url);
0365nobodyさん04/10/28 01:47:21ID:GkfPSbvy
たびたび申し訳ないが、ちょっと教えて下さい

ハッシュのリストを作ってはみたものの
どうやってサブルーチンから出せばいいのかわからなくなりました。

sub XXX{

push @{ HoA{key_name} }, "value1", "value2";

return (??????);
}

このような場合ってどうやってリターンすれば宜しいでしょうか??
0366nobodyさん04/10/28 02:07:20ID:GkfPSbvy
というか、リストのハッシュと言ったほうがよさそうだ。
0367nobodyさん04/10/28 08:40:21ID:???
>>365
先にサブルーチンへリファレンスを渡してからゴリゴリするのが常套かと。
0368nobodyさん04/10/28 08:42:07ID:???
push @{$HoA{key_name} }, "value1", "value2";

こう?

return \%Hoa;

で、

$refHoA->{key_name}->[0]
0369nobodyさん04/10/28 09:10:58ID:???
別にグローバルならrefをreturnしてもいいけど、こうじゃないの?
my %HoA;
&XXX(\%HoA);
print @{$HoA{'key_name'}};
exit;

sub XXX {
my $refHoA = $_[0];
push @{$$refHoA{'key_name'}}, "value1", "value2";
return(0);
}
0370nobodyさん04/10/28 09:56:08ID:???
>>369

そんなことしない
サブルーチンで局所化した変数でもリファレンスを返すと、スコープ外でも変数の内容は維持される。
なんか変な気もするが、そういうものらしい
なんでかはしらない(局所化してもスコープ外で実際に破棄されるわけではない?)
つーか、perlモジュールのコンストラクタは普通に局所化したハッシュをblessしてるし
0371nobodyさん04/10/28 09:56:09ID:???
はじめから無名ハッシュにしとけばいいような。

sub XXX {
my $HoA;

push @{$HoA->{key_name}}, "value1", "value2";

return $HoA;
}
0372nobodyさん04/10/28 14:04:58ID:???
>>370
my宣言した変数は内部に被参照カウンタを持っていて、
それが0にならない限りデータ領域は解放されないです。
サブからリファを返した場合、そのリファを保持する限り
領域も保持され、破棄すると領域も解放されるです。
037336504/10/28 14:35:37ID:???
ありがとうございました。みなさま。
どれも有効でしたが、368氏の方法が一番マッチしました。
ありがとうございました。
0374nobodyさん04/10/29 18:08:56ID:jolcQ+aO
変数名にハイフンは使っていいですか?
今ローカル環境がないのであまり無茶なテストをサーバでしたくないために質問しました。すみません。

アンダースコアは大丈夫なことは知っています。
ハイフンもハッシュのキーになら使えるということも知っています。(クォート必要ですが)

変数名にも使えるのでしょうか?
例)
$a-a = 1;
$aa- = 1;
$-aa = 1;

確か一番下はダメなはず。
宜しくお願いします。
0375nobodyさん04/10/29 18:14:21ID:???
ぐぐった
出てきた


>>374は腹を切って死ぬべきである
037637404/10/29 18:25:42ID:jolcQ+aO
>>375
>ぐぐった
>出てきた

だから?ぐぐるのもここで質問するのも同じだろ。
まぁ、ぐぐったら出てくるという回答だとしたら・・・

ありがとうございました。ハイフンは使えないようで。それでは失礼します。
0377nobodyさん04/10/29 18:28:19ID:oV9k/ZOo
>>376
うわすげームカツクこいつ

マジで死ね 首吊って今すぐ死ねや 糞が
037837404/10/29 18:39:04ID:jolcQ+aO
>>377
たかが2ちゃんでの出来事にいちいち本気になるなよ
0379nobodyさん04/10/29 18:45:37ID:???
>>374がむかつくという事実に変わりはない
0380nobodyさん04/10/29 18:46:02ID:oV9k/ZOo
>>378
ハァ?それが関係あんのか?

更に胸糞悪ぃなてめぇは
038137404/10/29 18:47:36ID:jolcQ+aO
>>379-380
そもそも2ちゃんで本気になるお前らがおかしいだろ
ムキになるなよ
0382nobodyさん04/10/29 18:50:58ID:???
>>381
いいから氏ね
0383nobodyさん04/10/29 18:51:58ID:???
態度が悪い>>374がムキになって暴れております
0384nobodyさん04/10/29 18:52:42ID:???
>>375>>377>379-380>>382
ttp://perldoc.com/perl5.8.4/pod/perlstyle.html
最後の項目を声に出して読みましょう。

>>376
> ぐぐるのもここで質問するのも同じだろ。
false
038537404/10/29 18:54:15ID:jolcQ+aO
>>382
お前が死んだらいいんじゃないか?
自分のために人が何かしてくれるとでも思ってるの?

いい加減自立しろよ、な。
嫌いなやつは「氏ね」なんて理屈は小学生レベルだぞ。
もうすこし大人になったほうがいいんじゃないか、な。
0386nobodyさん04/10/29 18:55:51ID:???
>>384
英語厨は消えろ
0387nobodyさん 04/10/29 18:56:36ID:???
この程度のもんぐらいならテストで作って動かしゃわかるってこった。
0388nobodyさん04/10/29 19:05:53ID:???
$abc=1234
の最後の文字列を消すようにはどのようにすればいいでしょうか?
この場合は、$abc=123にしたいです。
0389nobodyさん04/10/29 19:37:50ID:???
chop
0390nobodyさん04/10/29 20:26:27ID:???
$abc = int($abc/10);
0391nobodyさん04/10/29 20:45:30ID:???
すいません、初心者なんですが教えてください。
登録や削除のできるCGIを作っています。
一つのフォームから、いくつかのsubmitを使って、それぞれ処理を変えたいのですが、
どのようにすればよいでしょうか?
なんとなく、nameを使ったり、受ける側でif文を書けばいいのかな?という感じなのですが、
どうやって、if文でsubmitのnameを受けたり、分岐したりすれば良いのか分からない状態
です。
どうぞ、よろしくお願いします。
0392nobodyさん04/10/29 20:52:34ID:???
>>391
同じ name にして value を見る
0393nobodyさん04/10/29 20:57:57ID:???
>>392
0394nobodyさん04/10/29 20:59:11ID:???
>>392
すいません、その書き方が分からないので・・・
if文になるんでしょうか?
突然言い渡された仕事で、何が何だかさっぱりな状況なのでお願いします・・・。

連投になってしまい、すいません
0395nobodyさん04/10/29 21:25:48ID:???
------html-------
<INPUT name=text1>
<INPUT name=text2>
<INPUT name=text3>
<INPUT name=text4>
<INPUT type=submit value="ここ押せ" name=hoge>
-----------------

-------cgi--------
#!/usr/bin/perl
require 'cgi-lib.pl';
require 'jcode.pl';

&ReadParse(*in);
$txt1 = "$in{'text1'}";
$txt2 = "$in{'text2'}";
$txt3 = "$in{'text3'}";
$txt4 = "$in{'text4'}";
&jcode'convert(*txt1,'sjis');
&jcode'convert(*txt2,'sjis');
&jcode'convert(*txt4,'sjis');

処理
---------
こんなもんだろ。
0396nobodyさん04/10/29 21:52:26ID:???
>>394
まずはHTMLから勉強して濃いよアフォ
>>395
アフォに何を言っても無駄だからやめとけ
0397nobodyさん04/10/29 22:00:17ID:???
すいません、perlでテキストファイルを白紙に戻す方法ってあるんでしょうか?
なんかどこをみても載ってない気がする。
0398 ◆7CWqH7Oesg 04/10/29 22:11:15ID:???
truncate
0399nobodyさん04/10/29 22:58:21ID:buGH5/R1
perlからhtmlファイルを「open」で呼び出した場合、呼び出し元はwebサーバですか?それともクライアント側ですか?
0400nobodyさん04/10/29 23:26:28ID:???
>>374
まあ裸では使えないが${'...'}のかたちにすりゃほとんど
なんでもアリ。

そうまでして使いたいものかどうかはギモンだがな。

${'a-a'} = 1;
${'aa-'} = 1;
${'-aa'} = 1;
0401nobodyさん04/10/30 00:29:39ID:???
>>397
print OUT '白紙';
0402nobodyさん04/10/30 00:47:08ID:???
print if(m/test/) while(<DATA>);

こんなことはできますか?
0403nobodyさん04/10/30 00:48:20ID:???
やってみれば?
0404nobodyさん04/10/30 01:10:10ID:???
403さんの言われた通りにやってみましたができませんでした。
どこがいけないのでしょうか。
0405nobodyさん04/10/30 01:17:43ID:???
>>404
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsyn.html#Simple_statements
0406nobodyさん04/10/30 01:44:29ID:???
>>405
ありがとうございます。
読んだ上で色々やってみましたが、このような書き方は仕様上不可能のようですね。
お手数おかけしました。
0407nobodyさん04/10/30 03:37:08ID:???
push(array, value) って value 省略したときに $_ 使ってくれないみたいなんですけど、
これって常識ですか?

省略したときに $_ を使うようになる条件て何かあるんですか?
0408nobodyさん04/10/30 04:46:55ID:???
>>407 常識、ない
040940704/10/30 05:22:56ID:???
>>408
がびーん!

ありがとうございます
0410nobodyさん04/10/30 10:23:50ID:???
短いスクリプトではない場合あんまり暗黙の$_を使わない方がいいと思うよ
0411nobodyさん04/10/30 10:59:58ID:eCRfKScU
教えてください。

文字列ソートを
@data = sort{(split(/\,/,$b))[2] cmp (split(/\,/,$a))[2]} @data;

としてたものを、文字の数でソートしたいと思い、
@data = sort{(split(/\,/,length$b))[2] <=> (split(/\,/,length$a))[2]} @data;

とやってみましたが、ソートしてくれません。
lengthの位置を色々変えてみましたが、ソートしないかエラーかでした。
どうすれば(この場合)[2]番目の文字数でソートできるのでしょうか。
0412nobodyさん04/10/30 11:13:52ID:zVFP7DHQ
ファイルアップロードについて教えてください。
環境 -> Linux + Perl5 + cgi-lib.pl

kentさんのjoyfulとか、ほかモジュールを使わないでアップロード機能を
装備しているスクリプトを参考に下記のようにやってみたのですが、
まったくダメダメクンのようです。

ユーザーのファイルを受け取るには、これ以外何をやればよいでしょうか?
どうか教えてください。

$upfile = $in{'img'};
if ($upfile) {
$upfile =~ s/\\/\//g;
$img_file = basename $upfile;
open OUT,">$img_file";
binmode OUT;
binmode STDOUT;
print OUT $in{'img'};
close OUT;
chmod (0666,$img_file);
0413nobodyさん04/10/30 11:25:33ID:???
>>411
http://perldoc.com/perl5.8.4/pod/func/length.html
http://perldoc.com/perl5.8.4/pod/func/split.html
http://perldoc.com/perl5.8.4/pod/func/sort.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_sort_an_array_by_anyth

>>412
http://cgi-lib.berkeley.edu/
0414nobodyさん04/10/30 11:27:57ID:???
>>411
@data = sort{length((split(/\,/,$b))[2]) <=> length((split(/\,/,$a))[2])} @data;

>>412
デリミタの処理が一切見当たらない。
enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか?を確認するよろし。
041541204/10/30 11:39:40ID:zVFP7DHQ
>>413
参考にしてみます。

>>414
>enctype="multipart/form-data"でPOSTしたらどんなデータが送られてくるのか
File::Basenameで取得したファイル名の中に、ローカルパスが格納されています。
001.jpg -------------------------------------------------------------
C:\Documents and Settings\admin\My Documents\My Pictures\任天堂\001.jpg
---------------------------------------------------------------------
てことは、$in{'img'}をopen DATA,"$in{'img'}";する必要があるってことです?
041641104/10/30 12:03:05ID:???
>>413>>414
おぉ、できました。
ありがとうございます!
041741204/10/30 14:08:03ID:zVFP7DHQ
やはり、よくわからなかったので、おとなしくCGI.pmを使用することにしました。
みなさまありがとうございました。
0418nobodyさん04/10/30 14:28:37ID:???
ここにはファイルのアップを1から書ける人はいないから、
諦めた方がいいね
0419nobodyさん04/10/30 15:15:30ID:???
10文字以上20文字以内で、
英数字が使えて、最初の文字列にのみ数字を禁止するような
正規表現はどのようにすればいいでしょうか?

正規表現難しすぎる・・・。本読んでも頭がこんがら・・・
分かりやすいサイトあったら教えてください
0420nobodyさん04/10/30 15:27:19ID:???
>>419
http://pc5.2ch.net/test/read.cgi/php/1069245758/ に入門しる
0421nobodyさん04/10/30 17:16:32ID:???
>>412
車輪の再発明ではなく勉強のためなら↓を見るよろし。シンプルだ。
ttp://tohoho.wakusei.ne.jp/cgi/wwwupl2.txt

実用化するにはもう少し手を加えたほうがよいが。
0422nobodyさん04/10/30 20:00:53ID:M6l56cQx
WinXP + Apache + Perl5 cgiです。
cgiの再起呼び出しは可能なのでしょうか。
cgi上のフォーム で、cgiの一部を書き変えたいのですが。
0423nobodyさん04/10/30 20:14:58ID:???
>>422
そういうのは再帰呼び出しとは言わないような。。。
できるからやってみ。つーかやってみてから書きなはれ。
0424nobodyさん04/10/30 22:11:53ID:???
>>422
そのレベルで自己改変コードは危険すぎる。
つーか、99.999%書換え不要。
0425nobodyさん04/10/30 23:39:13ID:???
フォームからsubmitボタンが1回クリックされるごとに
1 -> 2 -> 3
と変更していく変数$aを作りたいのですが、
どうすればいいでしょうか?
大まかな方法は何となく分かるんですが、
ロック制御などについてよく分かりません。
0426nobodyさん04/10/30 23:39:44ID:JL00AQ8N
あg
0427nobodyさん04/10/30 23:58:31ID:???
カウンタじゃいけないのか?
0428nobodyさん04/10/31 06:04:57ID:PbybcUUP
s/(?:abc|bbc)/c/;

s/abc/c/;
s/bbc/c/;
とではどっちが速いですか?
0429nobodyさん04/10/31 06:43:53ID:/9xW7Y/D
<input type="file" name="file">
として、
$query->param('File')
で受け取った値を、同じ(type="file")として別のCGIなどに
渡す事はできないのでしょうか?

調べてみたところ、(type="file")はセキュリティのため、
初期値を設定したりスクリプトで値を操作することが出来ないとされており、
同じ内容を受け渡す事ができず、困っております。

よろしければ、おしえてください。
0430nobodyさん04/10/31 07:29:15ID:???
>>428
自分で試してみようとは思わないのですか?
0431nobodyさん04/10/31 07:46:09ID:???
動作が異なるものを比べても意味無いじゃん。
0432nobodyさん04/10/31 08:21:16ID:???
処理A,B,C,Dがあって、それぞれに対応する変数$a,$b,$c,$d(動作そのものではなく)があります。
これらの対応する変数の大きい順番に処理A,B,C,Dを行いたいのですがどうすれば良いでしょうか?
0433nobodyさん04/10/31 08:23:04ID:???
>>429
出来ないように作られているので出来ない。
出来るようにすると、お前以外の世界中の人が困るようになるので、出来るようには出来ない。
0434nobodyさん04/10/31 08:34:02ID:???
>>429
さんざんガイシュツだがLWP。HTTP::Request::Commonのマニュアルに
例つきで説明されてるのでよく読め。
0435nobodyさん04/10/31 12:18:51ID:???
KENT-WEBにあるWeb ProtectというCGIを設置したんですが、
パスワード認証画面が携帯電話(au W11H)で表示することができないです

<tr>
<td class="ent2">
<table border=0 cellpadding=0 cellspacing=5 width="100%">
<tr>
<td colspan=2>$title</td>
</tr>
<tr>
<td>ユーザー名 :</td>
<td><input type=text name=id size=15 value="$cid"></td>
</tr>
<tr>
<td>パスワード :</td>
<td><input type=password name=pw size=15 value="$cpw"></td>
</tr>
<tr>
<td></td>
<td><input type=checkbox name=cook value="1" $checked>
パスワードを記憶する</td>
</tr>
<tr>
<td colspan=2 align=right height=50 valign=bottom>
<input type=submit value="    OK    ">
<input type=reset value="キャンセル"></td>
</tr>
</table>


行数足りなくて最後の方ちょっと省略しましたが
これを携帯で表示させるにはどうすればいいのでしょうか?
0436nobodyさん04/10/31 14:15:22ID:???
>436
丸投げ改造スレへドゾー。
0437nobodyさん04/10/31 14:18:58ID:???
Aサーバに設置したスクリプトから、
lsコマンド使って、Bサーバのあるディレクトリの一覧を取得するようなことは
可能でしょうか?
0438nobodyさん04/10/31 14:32:57ID:???
>>437
いくつかのやり方に応じて適切な条件が揃わないとできんよ。
つーか、逆に言うとそれをやられないように作られてるんだから。
0439nobodyさん04/10/31 16:29:29ID:???
試行錯誤してやっと完成したスクリプト。
しかし初心者だけにセキュリティ的な部分が非常に気になります・・・。
何かセキュリティ的に大丈夫かどうかチェックする方法ないですかね?
2chでさらす以外で。
他の初心者さんたちはどうしてるんだろ?
0440nobodyさん04/10/31 16:37:53ID:???
上級者に聞くしかないでしょう。
じゃなきゃ自分が上級者になる。
0441nobodyさん04/10/31 22:09:05ID:???
>>439
只でやりたかったら、どっかで晒すか知り合いに頼むしかないだろ。
金かける気があるならhttp://www.softek.co.jp/Sec/WebProbe/のようなツール使う。
0442nobodyさん04/10/31 22:24:06ID:???
>>439
どういうセキュリティを懸念してるんだ。
とりあえずはクロスサイトスクリプティングあたりか?
0443nobodyさん04/10/31 23:47:52ID:???
作ったものによるだろ。
XSSは当然として、セッションハイジャックやSQLインジェクションなど
その他色々。
0444 ◆7CWqH7Oesg 04/11/01 00:59:27ID:???
4様が微笑みながら444ゲット ズサーーーー!!
0445nobodyさん04/11/01 01:09:12ID:CTnWn+hA
>>444
うるせーー!!!!!
0446nobodyさん04/11/01 04:25:18ID:rUgrlUVh
net::ftpのdirをつかって、ファイルの更新日時を取得したのですが、
月がOctのように英語表記になってしまいます。
これはどのように数字に変更すればいいのでしょうか?
0447nobodyさん04/11/01 10:51:27ID:???
>>446
%Month = (Jan=>1, Feb=>2...)みたいなハッシュを用意しといてひけば
とりあえず数字にはなる。
0448nobodyさん04/11/01 13:02:20ID:???
s/Oct \d{2} \d{2}:\d{2}/10月$1日$2時$3分/g;
みたいに12行書く。
0449nobodyさん04/11/01 13:03:07ID:???
カッコ付け忘れ。適当に補ふ。
0450nobodyさん04/11/01 19:42:22ID:IPrYAMkf
キリ番を調べたいのですが、
100単位でのキリ番は、
$a = substr("カウント値",-2,2);
if($a eq '00'){ print "キリ番"; }
で処理しています。
連番に関してはなかなかいいアイディアが思い浮かびません。
参考となるカウンターやアイディアをご教授ください。
0451nobodyさん04/11/01 19:52:51ID:???
キリ番とかダサイからやめたほうがいいよ
0452nobodyさん04/11/01 20:25:55ID:???
>>451
禿同
0453nobodyさん04/11/01 20:55:08ID:???
>>451-452
アイディアのカケラも思い浮かばないような発想力不足のクズはこのスレにいないでいいよ
0454nobodyさん04/11/01 21:05:16ID:IPrYAMkf
>>450です。
確かにダサイのですが要望があったので色々と試してました。
0の連続するきっちりのキリ番やゾロ目なら数十桁くらいを配列にいれて
比較してたのですが、連番となると数が多すぎて…
0455nobodyさん04/11/01 21:17:07ID:???
漏れもダサイとは思うが、どうしてもやらにゃならんと言うなら
キリ番やゾロ目なら正規表現使う方が賢明だろう

連番はアイデアがないが
「自分が数字を見たとき連番かどうかをどうやって判断しているのだろう?」と
自分の頭の中の認知回路を自己分析してみると
実装可能なアルゴリズムを思いつけるかもしれん
0456nobodyさん04/11/01 21:18:46ID:???
ゾロ目:
sub zorome { my($x)=@_; $x % ('1' x length($x)) == 0; }

連番:
sub renban { my($x)=@_; zorome($x - substr('123456789', 0, length($x)-1));}

あたりでどう?
0457nobodyさん04/11/01 21:25:11ID:hZSImnu8
連番は、何個同じ数字がどこに並んでりゃいいの?3個どこでもよければ
while(($var =~ /(\d)/) and ($var =~ s/$1{3}//)){print "連番やん\n";}

045845004/11/01 21:49:58ID:IPrYAMkf
>>450です。
>>456>>457様、ありがとうございます。
教えて頂いたものは負荷も少なく凄いです。

正規表現に疎いためまだ理解できていないのですが…
連番は何個からとかは特に決めていません。
12でも連番のキリ番として扱う予定です。

>>457
$varに数値をいれるとして、$1の部分が理解できません。
これだと例えば1114も連番となってしまいますか?
0459nobodyさん04/11/01 22:11:56ID:???
$1を知りたければ、多少でもいいから正規表現を学ぶんだ
0460nobodyさん04/11/01 22:35:50ID:???
正規表現だとゾロ目は

$x =~ /^(\d)\1*$/

なのでこっちの方がシンプルかも? (最初が数字でその後0個以上の
同じ数字が文字列の最後まで続く)

最低n桁にしたければ*のところを{n-1,}にすればいい。たとえば
最低4桁なら

$x =~ /^(\d)\1{3,}$/

0461nobodyさん04/11/01 22:38:27ID:???
連番は

index("123456789", $x) >= 0

という手もある
■ このスレッドは過去ログ倉庫に格納されています