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

【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を見よう。
 
0655nobodyさん02/05/13 07:46ID:???
どうでもいい事だとは思うけど、コーディングしてて山の様にあっちこっちに
動的変数作ってしまって、プログラム終了まで使われなくなった変数って
やっぱシステムリソース喰ったままなんですかね?

「もう、この変数は使わない〜」と思ったら、undef した方がいいの?
それとも、コンパイラが適当に判断してくれたりするんだろうか?

$a = "(・v・)";
$b = 12345;

{
# ここで $a と $b 使う。これ以降は使用されない
}

{
# 新たに変数 $c を割り当てる。しかし、$a $b が使われていないので
# $a $b 用の領域を使って確保される?(暗黙の undef とか?…)
$c = "( ゚д゚)";
}
0656nobodyさん02/05/13 07:58ID:???
素人のものすごい素朴な質問なんですけども、
-wとuse strict;とuse warnings;$|=1;も入れて可能な限りエラーをなくして見たりしてるんですが
なぜか
Use of uninitialized value in concatenation (.) or string at C:\***.cgi line n.
と
Use of uninitialized value in string eq(またはneとか==とか!=とか。) at C:\***.cgi line n.
というエラーは消えてくれません。
動作にはまったくこれといって支障ないですけど、なんとなく気になってた疑問なのでちょっと聞いてみました。
0657nobodyさん02/05/13 10:50ID:???
>>656
理由はメッセージに書いてあるじゃないか。変数は初期化しろ。
とわいえ、俺もこのwarningはウザイと思う場合もある。そん時はno warnings;〜;use warnings;ではさむ。
0658nobodyさん02/05/13 13:13ID:???
>>655
myしる。そうすればブロック抜けた時に消える。

{
my $c = '( ゚д゚)';
# 〜$cを使う処理〜
}
0659nobodyさん02/05/13 16:13ID:e7rLHiwb
比較結果の表示と保存をするのに

my $patch = system("diff file1 file2");
system ("diff file1 file2 >patch.diff");
print qq|$patch\n|;

これをまとめるのはどのようにしたらよろしいのでしょうか?

my $patch = system("diff file1 file2 >patch.diff");
print qq|$patch\n|;
では表示が 256 になってしまうので宜しくお願いします。
0660nobodyさん02/05/13 20:22ID:???
>>659
何がしたいのか分からないのでこの答えが妥当かどうかはわかりませんが
$patch = `diff file1 file2`;
066165602/05/13 21:29ID:???
>>657
変数のところじゃなくて、
Use of uninitialized value in concatenation (.) or string at C:\***.cgi line n.
が出るのは
print <<"EOF";
の行なんです。これを指摘されるのは何でなんでしょう?
print <<"EOF";
〜
EOF
内で使われる変数は全部use var qw[$a $b 〜];というふうにあらかじめ書いてるんでが。
ヒアドキュメントになにか決まりごとでもあるんでしょうか?
0662nobodyさん02/05/13 21:47ID:???
>>661
宣言と初期化は違う。
宣言しただけだと変数の中身はundefだから、そんな感じで怒られる。
初期化(空文字列を代入するとか)をしておけばエラーは出なくなる。
066365602/05/13 22:55ID:???
>>662 ども。
use strict;
use var qw[$a $b 〜$z];
$a=$b=$c=〜$z="";

{
print <<"EOF";
〜
$a
$b 〜
$z
EOF
}

とやってみましたが、やっぱりprint <<"EOF"; を指摘されます。別に問題なく動くということは
print <<"EOF";で出るUse of uninitialized value in concatenation (.) or string at C:\***.cgi line n.は
やっぱり意味の無いエラーなんでしょうか。
0664nobodyさん02/05/13 22:56ID:S5I/8Zh9
perlでオラクルを使ってDBIのモジュールをインストして使ってます。

selectall_arryとかで値を抜き出す時に使う変数が理解不能です。
$@hogehoge とか $$_[1] って奴です
一応$_[1]とかは解りますが$@を会わせたり$$でjobid以外の使い方が今いち理解できません。
0665nobodyさん02/05/13 23:03ID:???
>>663
んな事はない。どれかの変数の初期化を忘れているだけだ。
目を皿にして良〜く見ろ。
0666nobodyさん02/05/13 23:13ID:???
>>660 ありがとうございました。以下で解決しました。
$patch = `diff file1 file2`;
open (FH, ">patch.diff");
print qq|$patch|;
print FH qq|$patch|;

0667nobodyさん02/05/13 23:22ID:???
>>664
man perlref
0668nobodyさん02/05/13 23:30ID:???
>>663
途中で変数にundefが代入されたんだろう。
試しにprint文の直前でprintに関わる全ての変数に対して defined $z or $z = ''; してみれ。
0669nobodyさん02/05/14 00:14ID:ZpKcImQq
古くなった掲示板の投稿を次々とHTMLページにして過去ログを作成する掲示板がありますが、
1ディレクトリ内のファイル数が多くなるとアクセスが重くなったり、サーバーに問題が起きたりするのでしょうか。
サーバーはファイルにアクセスするときに1ディレクトリずつ辿っていくとするなら遅くなりそうですが。
5000ファイルとかでも大丈夫でしょうか。
0670nobodyさん02/05/14 00:21ID:???
Perl5で掲示板CGIを作っているのですが、CGIの”重さ”ってどうやって調べればよいのでしょうか。
WinソフトならCPU使用率のグラフでも見ればいいんですが、サーバ上となると。

CGIスレで聞こうと思ったんですが、言語に依存しそうなのでこちらでよろしいですか?
0671nobodyさん02/05/14 00:26ID:i98930LO
よく見るとsageだったスマソ
0672nobodyさん02/05/14 00:39ID:o5LDH6aT
>>670
-d:DProf とか。

CGIなら
#!/usr/bin/perl -d:DProf
とかで。
067367002/05/14 00:55ID:???
あの…それってなんのオプションですか?(今調べてますが)
CGIのほうではエラーで起動できず、DOSプロンプト(WinME+Apache)のほうではなにも表示せず終了なのですが。
067467002/05/14 01:04ID:???
あ、なんか出てきた。
ありがとうございましたm(_ _)m

…と言っても、そんなファイルは見つからない〜のw。
0675nobodyさん02/05/14 01:21ID:???
>>658
Perl内部ではメモリ開放されるだろうけど、OSには返されないだろ、
ってクックブックに書いて有ったきがする。つ〜わけで、システム
リソースは喰ったまま。スクリプトが終了した時点で全て回収
される。
ただmyを使用すれば、新たな変数宣言時に跡地が有効利用されて、
全体としてメモリ使用量が減る、ってことになるんですかね。
067665602/05/14 02:11ID:???
>>665
>>668 どうもです。
とりあえずそれをやってみます。
undefってやっぱりPOSTから分解したときに対応している値が空だとundefが入っちゃうんでしょうか?
***.cgi?a=&b=123だと$a=$FORM{'a'};は中身はundefなのか''空なのかどっちになってるのかよくわかってないです。。
0677nobodyさん02/05/14 03:03ID:???
>>676
>POSTから分解したときに対応している値が空
その場合はundefじゃないと思うよ(空)。分からない時は
defined $FORM{'a'} ? print "定義済み〜\n" : print "未定義〜\n";
しちゃえば?

>>672
質問した者では無いんですが、良い事を教わりました。
0678nobodyさん02/05/14 09:12ID:???
とりあえず *無意味なエラー* なんてものは存在しないってことを理解しる
0679nobodyさん02/05/14 09:34ID:???
>>678
なんか当たり前だがハッとなる言葉だな。
0680nobodyさん02/05/14 11:32ID:???
糞ッたれなエラーメッセージは世の中に溢れている。
abnormal termination...
0681nobodyさん02/05/14 13:14ID:???
-d:DProf について解説してるサイトないですか?
0682nobodyさん02/05/14 14:04ID:???
>>681
http://www.perldoc.com
0683nobodyさん02/05/14 14:27ID:cCd3d73e
derectory indexのかわりにSSIで
http://www.xxx.com/cgi-bin/bbs/
のように表示しようと思ったんですが、1つのスクリプトで.shtmlと.cgiを表示させようとすると.shtmlのときにContent-type: text/htmlが表示されてしまいます。
そこでヘッダーに
if($ENV{'SCRIPT_NAME'} eq 'xxx/cgi-bin/bbs/') {
print "Content-type: text/html\n\n";
}
とかいて可変型の出力をさせるとhttpdでは動いたんですが、サーバへ送るとエラーになります。
こういうことってできないんでしょうか。
0684nobodyさん02/05/14 15:42ID:???
>>683
何をしたいんだかいまいちわからない。
もう少し詳しく書いて。
0685 02/05/14 15:57ID:???
>>684
宣伝をしたいんじゃないの?
0686nobodyさん02/05/14 16:02ID:???
>>685
www.xxx.comって適当に書いたのかと思って行ってみたら、エロサイトだったのでビクーリ
0687nobodyさん02/05/14 16:04ID:???
>>686

同じく..
0688nobodyさん02/05/14 17:49ID:ggUNICfm
すいません。
宣伝ではありません。適当に書いただけです。

同じスクリプトをbbs.cgi(元のスクリプト)とindex.shtmlの両方で呼び出したいんですが、
if($ENV{'SCRIPT_NAME'} eq 'xxx/cgi-bin/bbs/bbs.cgi') {
print "Content-type: text/html\n\n";
}
と書くとエラーになってしまうんです。
ようするにbbs.cgiを読んだときにはContent-type: text/htmlを出力して、index.shtmlを読んだときにはContent-type: text/htmlを出力しないようにしたいと思って。
0689nobodyさん02/05/14 18:40ID:IM/zSuxh
>>688
if( $ENV{'SCRIPT_NAME'} =~ /bbs\.cgi/ ) {
print "Content-type: text/html\n\n";
}
としてみてはどうでしょう。
069068802/05/14 22:30ID:gZX6Mv2h
どうもありがとうございました。
うまく動きました。簡単でしたね(汗)
0691nobodyさん02/05/15 07:19ID:???
1行だけのファイルがあったとします、
これを8バイトごとに区切って、
@sort に代入していくにはどうすればいいですか?
split 関数では区切り文字がないとダメなので…
区切り文字はなく、とにかく8バイトずつ区切りたいです。
よろしくお願いします
0692nobodyさん02/05/15 07:33ID:???
0693nobodyさん02/05/15 07:33ID:???
>691
readで一定量づつ読み込んでからunpackで分割
0694nobodyさん02/05/15 12:25ID:???
$/ = 8;
@sort = <FILEHANDLE>;

これでもいけなかったけ。確かめてないけど。
# バージョンが低いとだめっぽいが
0695TO02/05/15 15:52ID:+mZA1LnL
早速質問です。
フォームメールを使い会員宛に情報を送るCGIプログラムをテストしています。
PCやJskyでは無事メールは届きますがi-modeには届きません。
自分の携帯だけかなと思い、友人のi-modeに送ってみたが届きません。
ただしOUTLOOKなどのメーラーを使うと送ることは出来ます。
着信拒否の設定も何もしていないのに...
考えられる原因って何かありますか?
※独自ドメインをレンタルサーバーで運用しています。
0696 02/05/15 16:30ID:???
>>695
一部のドメインからの送信が規制されているらしいという話を聞いたことある
0697TO02/05/15 16:40ID:???
ありがとう。
共有型のレンタルサーバ使用で、
sendmailから送られるメールのMessage-Id:が
レンタルサーバ会社名なので、
もしかして他サイトが迷惑メールを送信したために
規制されてるのかな?うーん...
0698nobodyさん02/05/15 22:07ID:DvGtt9Y8
MLDBMを使ってプログラムが書きたいんですけど、
MLDBMについて詳しく説明しているページや
使い方を教えてください。
0699nobodyさん02/05/15 22:09ID:???
>>698
http://www.google.co.jp/
ここのフォームにMLDBMと書いてボタンを押すとお望みのページが出てきます。
0700nobodyさん02/05/15 23:16ID:???
>>691
use IO::File;
my @ary = IO::File->new('data.txt')->getline =~ /.{0,8}/g;

{ local $" = "\n"; print "@ary" }

>>694
perl5.005 より前だと使えないけど、今となっては問題ないような。
ちなみに、整数へのリファレンスでないといけない。

my $str = 'abc8defg8hijkl';

$/ = 8;
open my ($h), '<', \$str;
print "$.: $_\n" while <$h>;

$/ = \8;
open $h, '<', \$str;
print "$.: $_\n" while <$h>;
0701nobodyさん02/05/15 23:26ID:hRG/E5t+
foo(%abc);

sub foo {
my %hash = @_;
}

って正しい?
0702nobodyさん02/05/15 23:42ID:???
Perlの最新版ってどこにあるの?
0703nobodyさん02/05/16 02:38ID:I5/FxZ58
数値ソートがうまくできません。
下のコードをサーバ(version = 5.004_01)で実行すると、
uninitialized value警告が大量に出て、@aはソートされません。
でもローカル(version = 5.6.1)では警告無しでソートされるようです。
これはどうすればいいですか?

#!/bin/perl -w
# perl version = 5.004_01
use strict;
sub cmp($$);
my %h;
for (my $i = 1; $i <= 30; $i++) {
  $hash{$i} = rand;
}
my @a = sort cmp (keys(%h));
print @a;

sub cmp($$)
{
  my ($i, $j) = @_;
  return ($i <=> $j);
}
0704nobodyさん02/05/16 02:50ID:???
>>701
正しく動くけど、できればリファレンスで渡したいところ。
0705nobodyさん02/05/16 02:51ID:???
>>703
何と言うかメチャクチャだよ。基本から学ぼう。
0706nobodyさん02/05/16 02:56ID:???
>>702
CPANでも逝ってくれ。
窓用のActivePerlならactivestate.comへ。

……activestate[s]にして全然違うところへ飛ぶ罠にご注意(w
0707nobodyさん02/05/16 09:05ID:???
>>705
?
別にむちゃくちゃってわけじゃないだろ。
何故こんな質問が出るのか少しばかり謎ではあるが。

>>703
Perl5.6以前ではsort用比較関数は$aと$bを参照しなけりゃならんのよ。
つまり
sort { $a <=> $b } @array;
とするわけだ。
# プロトタイプの設定で@_でも参照できるようにしたのは
# おそらく別パッケージでも簡単に動かせるようにする為だろうね。

ついでに、cmpはPerlの組み込みキーワードなんで
サブルーチンの名前にするのはやめたほうが無難かもしれない。
特に問題なく動いてるようだし、構わないのかもしれないが。
0708nobodyさん02/05/16 21:25ID:???
質問、というか添削希望です

DB_Fileを使って、
-------------------------
use DB_File;
$DB_BTREE->{'flags'} = R_DUP;
my $d = tie %db, 'DB_File', 'data.db', O_RDWR|O_CREAT, 0600, $DB_BTREE;

if(my $count = $d->get_dup($key)){
  print "key: $key ($count times)\n";
}
-------------------------

というふうに、データベースに指定したキーに対応するデータが
1つ以上存在する場合、その重複数を数えつつ処理したいのだけど、
このifの条件式に問題点はありますか?
0709nobodyさん02/05/16 21:40ID:???
房な質問すいません

ローカル環境でCGIデバグして、動いていたものがほんちゃん用の
鯖にうpしたらエラーだった…

telnetでコマンドライン実行した所、↓のコードがダメだった

# 駄目
delete $hoge[ $i ];

# OK
delete $hoge{ $i };

単なるコーディングミスなんだけど、なんでローカルの perl では
コンパイル通っていたんでしょうか?
071070902/05/16 21:57ID:???
自己レス…素直に splice 使った方がいいね。出直してきます…
0711げ鬱02/05/17 01:00ID:Yz0hLQt9
こんな素プリ区とを作ってみましたがうまく動きません。
どこがまちがっているのでしょうか。。。
ちなみにperl -CPAN -e shellで関係するモジュールはインストール済みです。
-----
#!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
require 'jcode.pl';

my $ua = new LWP::UserAgent;

my $request = new HTTP::Request('GET', $ARGV[0]);
my $response = $ua->request($request);

if($response->is_success) {
$html_response= $response->content;
}else{
print $response->error_as_HTML;
}

0712げ鬱02/05/17 01:00ID:Yz0hLQt9
@html_response = split(/\n/,$html_response);

foreach (@html_response) {

if ($_ =~ m/name="?[^"]*"? value="?[^"]*"?/g) {
$data{'$1'} = $2;
}
if ($_ =~ m/NAME="?[^"]*"? value="?[^"]*"?/g) {
$data{'$1'} = $2;
}
if ($_ =~ m/NAME="?[^"]*"? VALUE="?[^"]*"?/g) {
$data{'$1'} = $2;
}
}

while(($key, $val) = each レta) {
push @key,$key;
push @val,$val;
}

$data1 = join(',',@key);
$data2 = join(',',@key);

&save_data;

sub save_data
{
$save_url = "./data.txt";

open(IN,">>$save_url");
flock(IN,2);
print IN "$data1\n$data2 \n";
flock(IN,8);
close(IN);
}
-----ここまで
0713厨房02/05/17 03:50ID:bHXEkEom
ご質問です。あるホスト名のみ、アクセス拒否できるCGIってありますか?
教えて下さい。
0714nobodyさん02/05/17 04:09ID:???
tyuubo-だけど言葉ずかいが素敵だから教えたる。
楽勝。
0715厨房02/05/17 04:17ID:bHXEkEom
>>714さん
ご指導ご鞭撻、よろしくお願いします。
0716nobodyさん02/05/17 11:12ID:kkxtU/zb
初歩で素朴な筆問でスマソ

「文字連結」ってどうやるの?

配列に入れて、joinするのはめんどいけど、
正規表現とかでやり方はないっすか?
0717nobodyさん02/05/17 11:42ID:???
>>716
ハァ?何が肢体のかワカラソ。
$catedstr = join "", $str1, $str2;
とか
$catedstr = $str1 . $str2;
のことじゃないよな?
0718nobodyさん02/05/17 15:08ID:jYg7e4+R
便乗質問です。
文字列の500文字目に"abcde"を入れるには
どういたら良いのですか?
0719nobodyさん02/05/17 15:53ID:???
>>718
substr
0720波兵02/05/17 16:06ID:???
>>718

ばっかもーん!それぐらい調べればすくわかることだろうが!!
今度そんな質問したらゲンコツだぞ!!
0721nobodyさん02/05/17 16:18ID:???
つーか何の便乗なのか謎。DQN?
0722nobodyさん02/05/17 23:00ID:???
>>714
お前の言葉づかいは素敵じゃないな。(藁
0723時雨02/05/18 22:28ID:T/2gJeJW
あのぅ・・・掲示板のフラットボタンありますよね?あれってどうやってるんですか?
0724nobodyさん02/05/18 23:38ID:???
>>723
掲示板のフラットボタン?こういうことですか?
<input type="submit" value="送信" style="border:solid 1px #000000">
これはスタイルシートつかってます。
Web制作板のCSSスレに載ってるサイト見て勉強してください。
0725nobodyさん02/05/18 23:41ID:???
>>723
たぶん平べったく見えるボタンの事だよね。それならスタイルシート。
border: 1px solid silver; とか。板違いなのでWeb製作板へ。
0726nobodyさん02/05/18 23:41ID:???
激しくカブタ(w
0727nobodyさん02/05/19 01:22ID:AQpyLtDP
関数の戻り値を、リファレンス使わずに、ハッシュで返したいんですけど、

sub a
{
 my %hash = (a=>0,b=>1,c=>2) ;
 return %hash ;
}

my %myHash = a() ;

こんな感じなんですけど、添削してくれませんか、ねた無しで・・・
0728nobodyさん02/05/19 01:36ID:???
>>727
それでいけるよ
072972702/05/19 01:45ID:AQpyLtDP
>>728
レスありがとう御座います、確認不足でした。
うまくいけてました。
0730nobodyさん02/05/19 08:13ID:???
ここでよく見かける質問で極簡単なソース晒して「結果」を求める質問あるが、
それはCGIの一部でローカルでテストする環境無いヤシが質問しているのか?
0731nobodyさん02/05/19 12:20ID:fEY33UPf
携帯で画面を自動で移動させるにはどうしたらいいでしょうか?
0732nobodyさん02/05/19 13:58ID:???
>>731
君はPerlを宝島か何かのように考えているのかね。
0733nobodyさん02/05/19 15:59ID:???
>>731
携帯では無理だよ
0734nobodyさん02/05/19 16:04ID:Y5d1n8OF
教えて下さい。
スクリプトを見られないように文字化けさせるやりかたがあるときいたのですが、
変換させる用にマクロメディアかマイクロソフトかで何かを
ダウンロードしてこないといけないと裏技の本に書いてあったそうです。
書店に本を探しに行ったのですが見つからず。もしご存じでしたら教えて下さい。
073572702/05/19 16:09ID:???
>>730
自分の事?、
あるよ、Vine Linux2.?と、Slackware8、WinじゃCygwinも
自分の今回の確認ミスは、結果のハッシュ構造の確認をDumoer使っていたため、
リファレンス先のハッシュは問題無く表示されるけど、
直接ハッシュ指定すると正しく表示してくれないみたい、
常識?
073672702/05/19 16:11ID:???
>>734
それは、Javascriptの話じゃない?
CGIの場合は、パーミッションをきちんと設定すれば、
見られる事は無いとおもうけど
0737nobodyさん02/05/19 16:18ID:???
=
073873402/05/19 18:53ID:81BFGvHe
>>736
すみません。
おっしゃるとおりJavascriptのことです。
ソースのJavascriptを文字化けさせて、読めなくする方法だとききました。
わかりますでしょうか?
0739 02/05/19 19:02ID:2IiQOx1u
動画アップローダーのスクリプトありませんか?
情報お待ちしてます。
0740nobodyさん02/05/19 19:11ID:???
>738
そこまでわかってんならスレ違い,というよりも板違い
0741nobodyさん02/05/19 19:24ID:F0t0o3W7
今あるCGIを作ってるんですけど、
(WINのユーザー・FREEBSD上のcgi)
HPでデバックするため、
読み込んだファイルを
¥r¥nを¥¥rに書き換えて処理して、
¥¥rを¥r¥nに直して
改めてファイルに書き込んでいます。

1回目はちゃんと処理するのですが、
2回目以降、¥r¥nを¥¥rに書き換えて処理の部分が実行されていないようです。

書き換えられたファイルも一見何も変わってないようなものはないので
八方ふさがりになっています。

ファイルを書き込むときに
BSD上で¥r¥nが何かに変更されているとかしか考えられません。
そのようなことは起こりうるのでしょうか?

074274102/05/19 19:39ID:F0t0o3W7
今バイナリで調べてみたのですが、
0D0Aが、0A0Aに変わってしまっていました。
でも、
s/\\r/\r\n/ig;

してるんですよね。
何でだろう。
0743734,73802/05/19 20:47ID:gBCciPdK
>>740
あああ、すみませんでした!
今気付きました!
ここは[Perl]の初心者コーナーだったのですね。
「初心者」という部分しか目に入ってませんでした。
申し訳ありませんでした。
0744nobodyさん02/05/19 20:48ID:???
>>741
俺がこれまで見た中で十指に入るひどい日本語だ… 意味不明。
0745nobodyさん02/05/19 21:01ID:???
¥¥rって
バックスラッシュと小文字の r ってこと?
なんでそんなことするのか理解に苦しみます。
0746nobodyさん02/05/19 23:48ID:688ScNbc
>>745
おそらく>>741の使ってるファイルには"\\r"がたくさん入ってるんだろう。
0747nobodyさん02/05/19 23:50ID:CPJQ1VYR
質問させてください、次のようにソートされた配列を
@list=(102,105,111,205,245,250,297,312,322,456,473,479,482,499);

こんなかたちに分解したいんですけど
@list1=(102,105,111);#----------頭が1
@list2=(205,245,250,297);#------頭が2
@list3=(312,322);#--------------頭が3
@list4=(456,473,479,482,499);#--頭が4

出来るだけシンプルにやりたいなぁと思ったわけです。
で初心者の僕ががんばって考えたのは
$i=1
foreach(@list){
 while($_ !~ /^$i/){#--$iの値を配列要素の先頭の数字とマッチするまで増やす
  $i++;
 }
 push(eval("\@list"."$i"),$_);#---新しい配列「@list+$i」に配列要素を追加
}
というもので、当然というか配列と変数をくっつけるevalが
効かなかったんですよね。
なんかよい方法はないものかと。
いっぱい間違ってるかもしれませんが、簡潔な方法があればよろしくおねがいします。
0748nobodyさん02/05/20 00:09ID:???
>>747
for (@list) {
die 'あほ' unless(/^(\d)/);
push @{"list$1"}, $_;
}
074974702/05/20 00:49ID:dmmb40il
>>748
大変短くして頂いてありがたいのですがエラーがでました。
スミマセン
0750  02/05/20 00:55ID:???
>>749
まさか>>748のをそのままコピペ(以下略
0751nobodyさん02/05/20 00:58ID:???
>>747

@list=(102,105,111,205,245,250,297,312,322,456,473,479,482,499);
foreach (@list) {
next if !/^(\d)/;
eval sprintf 'push @list%s,$_',$1;
}

print @list1,"\n";
print @list2,"\n";
print @list3,"\n";
print @list4,"\n";
<>;
075274702/05/20 01:00ID:dmmb40il
いや、なんか配列名に変数をくっつけるみたいな書き方のとこ
push @{"list$1"}, $_;
ココだけコピって使ったんですけどね
0753nobodyさん02/05/20 01:01ID:???
ソケットのことでついての質問です。
#!/usr/local/bin/perl
use IO::Socket;
use IO::Select;
@servers = ('www.zdnet.co.jp','www.asahi.com',);
print "Content-type: text/html\n\n";
foreach $server (@servers){
$socket = IO::Socket::INET->new(PeerAddr => $server,
PeerPort => 80,
Proto => 'tcp',
);
print $socket "GET /index.html\r\n";
print $socket "Host: $server:80\r\n";
$socket->flush();
print <$socket>;
}
これでページを取得出来るんですが、
ページを全部読み込んでしまいます。
これを一部のみ読み込むにはどうすればいいのでしょうか?
と、、、
print <$socket>;
これを変数にあてはめて表示するにはどうすれば、、、。
075474702/05/20 01:01ID:???
あ、何か751さんが新しい答えくれてる、ちょっとこれ試してみます。
075574702/05/20 01:05ID:???
うわ、スゲエ、出来た!
でもよーわからん、、、
ノートに書き写して後でゆっくり考えてみます。
ありがとう!
■ このスレッドは過去ログ倉庫に格納されています