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

Perl コーディング初心者質問コーナー Part36

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

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

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

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

過去ログやお勧めサイトは >>2-10
0003nobodyさん04/07/14 13:24ID:???
[過去ログ] 1 of 2

Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
0004nobodyさん04/07/14 13:25ID:???
[過去ログ] 2 of 2

Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/ (前スレ)
0005nobodyさん04/07/14 13:25ID:???
[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html


[総合]
 ・http://www.excite.co.jp/world/ # 英文のページ多いから一応
 ・Perl Com: http://www.perl.com/
 ・CPAN.com: http://search.cpan.org/
 ・ActivePerl: http://www.activestate.com/
 ・CGI-ML:http://forest.ne.jp/cgi-ml/

[お薦め]
 ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
 ・Perl Recipes: http://www.effectiveperl.com/recipes/ # 死んでるか?
 ・Randal's WebTechniques columns: http://www.stonehenge.com/merlyn/WebTechniques/
 ・Perlの部屋: http://www.cc.rim.or.jp/~midorin/mad-p/perl/index.html
 ・Perl初心者の部屋:http://www.harukaze.net/~mishima/perl/
 ・Perlリファレンス:http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
 ・Perlのページ:http://homepage1.nifty.com/nomenclator/perl/
0006nobodyさん04/07/14 13:26ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://www.perldoc.com/
perldoc.jp: http://www.perldoc.jp/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
0007nobodyさん04/07/14 13:26ID:???
補足

コーディング 【coding】

プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)

自分の質問がPerlに関することなのか、
それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、
質問して下さい。
0008nobodyさん04/07/14 14:05ID:???
WebProgと関係ないならム板のPerlスレに統一した方がいいと思う。
0009nobodyさん04/07/14 14:17ID:q0q7Chkl
CGIでパラメーターを受け取る時は、
use CGI;を使うか、
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});で自分でデータを分解するか
だと思いますが、それぞれのメリットとデメリットを教えてください。
0010nobodyさん04/07/14 14:28ID:???
前者はGET,POSTに関わらず扱える。
0011nobodyさん04/07/14 14:45ID:???
後者はPOSTとGETで処理の振り分けが必要。
0012nobodyさん04/07/14 23:00ID:fRIUupct
携帯電話対応のBBSを作っているのですが、
EZwebの一部の機種で「キャッシュ」が起きてしまいます。
methodはGETにしています。
postだと回避できるのですが、都合によりgetは使えません。
ちなみに
<meta http-equiv="Cache-Control" content="no-cache">
は効きませんでした。

お願いします。
0013nobodyさん04/07/14 23:22ID:???
>>12
スレ違い。
CGIスレでも行け。
0014nobodyさん04/07/14 23:59ID:???
>>12
ホント、わりいな。そうしてくれ。
俺は別にかまわねーじゃん、と思ってるよ
0015nobodyさん04/07/15 00:01ID:???
>>12>>7を読めない半島の人
0016nobodyさん04/07/15 00:11ID:???
>>15
あのな、スルーしてるんだよ、みんな。
いろいろあるんだよ、それぞれが。
そんくらいわかれよ。
0017nobodyさん04/07/15 01:27ID:???
ネット上のページを読み込む方法で、前スレでLWPというものを勧められたのですが、
全くどういうものなのか分かりません。取り敢えず分かりやすく説明しているサイトなど御座いませんでしょうか?
どういうものかが見当付かないため調べる方法も思いつきません。
ググったら「ライブラリー」とか言うのが出てきたんですけど意味がわかんないです。

リファレンスサイトとかありましたらお教えくださいませんでしょうか?
宜しくお願いいたします。
0018nobodyさん04/07/15 01:28ID:???
>>17
ttp://www.perldoc.com/perl5.8.0/lib/LWP.html
00191704/07/15 01:30ID:???
まさしく俺も>>7読んでないですね。
CGIスレに移動します。本当にゴメンナサイ。
00201704/07/15 01:31ID:???
>>18
スレ違いなのに申し訳ありません。
でも英語なので理解するのに2年くらいかかりそうです。
有難う御座いました。
0021nobodyさん04/07/15 14:16ID:???
一定の形式に従って記述してもらうテキストエリアがあり、書き方が不正な行があったら、その行数を表示したいのです。
不正のある行数を配列に格納する部分まではできるのですが、それの表示方法で質問です。

@err_lineの中身が("1","3","5")だとした場合、「1,3,5行目の書式が不正です」と表示するエラー画面を出したいのですが、

foreach(@err_line){
 print $_ , ",";
}
print "行目の書式が不正です"

とすると、「1,3,5,行目の〜」となり、配列の最後の文字を出力した後にも","(カンマ)が出力されてしまいます。
何か良い書き方はないでしょうか。
0022nobodyさん04/07/15 14:35ID:???
>>21
$line_num = join(",",@err_line);

かな?
0023nobodyさん04/07/15 14:39ID:???
>>21
print join(',', @err_line), ' 行目の書式が不正です';
0024nobodyさん04/07/15 14:40ID:???
>>22
即レス感謝です。期待通りに動きました。サンクスです。
0025nobodyさん04/07/15 14:51ID:???
特定のファイルの仮想パスを絶対パスに変換する関数なんてあるんでしょうか?aspのServer.Mappathみたいな。
0026nobodyさん04/07/15 14:53ID:???
>>25

>>7
0027nobodyさん04/07/15 14:58ID:???
perl の組み込み関数には無い。
なぜなら絶対パスへの変換はWWWサーバの設定によって違い、
perl はサーバの設定がどうなっているかを知らないから。
ASPはIISと一体となっているから変換できる。

mod_perl なら Apache::* モジュールでなんかそういうのがあるかも。
0028nobodyさん04/07/15 16:43ID:???
perl の組み込み関数には無い。
なぜなら絶対パスへの変換はWWWサーバの設定によって違い、
perl はサーバの設定がどうなっているかを知らないから。
ASPはIISと一体となっているから変換できる。

KENT なら CGIでなんかそういうのがあるかも。
0029nobodyさん04/07/15 18:20ID:???
>>27
まじめに考えてみると難しいな
単純に頭に DocumentRoot をつけるだけなら楽だが
mod_rewrite とか使われた日には目も当てられない

mod_perl の環境に限定だが、サブリクエストを使って
$filename = Apache->request->lookup_uri($uri)->filename;
とかやれば、ほとんどの場合は変換できるんじゃないかと思う
Reverse Proxy だったりした場合には何が起きるか保証できないが
0030nobodyさん04/07/15 18:50ID:???
>>25
PerlってASPやJavaみたいにアプリケーションサーバ込みで考える開発環境じゃないんだよね。
だから関数で実現するんじゃなくって、別のソリューションを見つけるべきだね。
00312504/07/15 18:54ID:???
あまりにありがたいレスにただただ感謝です。
コピペして保存させていただきます!
0032nobodyさん04/07/15 23:15ID:???
$a,$b,$cの中でカンマに区切られている要素の数でポイントを出したくて
以下のようなコードを書きました。

$total = (split(/,/,$a) * 3)+(split(/,/,$b) * 2)+(split(/,/,$c) * 1);

で、perl -cw すると以下のような警告が出てしまいます。

Use of implicit split to @_ is deprecated at test.pl line xx

どうすればこの警告が出ないようになるのでしょうか?


0033nobodyさん04/07/15 23:25ID:???
scalar(split(/,/,$x))
0034nobodyさん04/07/15 23:36ID:???
>>32
@a = split(/,/, $a);
@b = split(/,/, $b);
@c = split(/,/, $c);
$total = (@a * 3) + (@b * 2) + (@c * 1);

# クドいな(汗)。

明示的に配列に突っ込んだりすると出なくなる仕組み。
0035nobodyさん04/07/15 23:45ID:???
ありがとうございます!!
>>33
> scalar(split(/,/,$x))
これをやってみましたが、同じエラーが出ました...

やっぱり地道に
>>32
のようにするしかないのですかね。
0036nobodyさん04/07/15 23:46ID:???
>>34
それでいいんじゃないかな。
0037nobodyさん04/07/15 23:56ID:???
本当に「line xx」って出てるのかね?んー?
splitの結果何が返って来るのかね?んー?
00383404/07/16 00:05ID:???
ずっと /usr/local/bin/perl しか使ってなかったけど、
最近、perl.exeを入れてみたところ。

C:\Documents and Settings\hoge>perl -cw %home%\test2.pl
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
C:\home\hoge\test2.pl syntax OK

# 元コードの、split() が @_ に implicit に代入されてるとこが line 5。

こんな感じです。>>37
0039≠3704/07/16 03:30ID:???
>>34
> splitの結果何が返って来るのかね?んー?
は試してみた?
>要素の「数」でポイントを出したくて
ということなら、
my $a = ("fred","wilma","barney");
my $b = ("hoge","hogehoge");
my $c = ("2","6","8","9");
print split/,/,$a;
print split/,/,$b;
print split/,/,$c;

my @a = ("fred","wilma","barney");
my @b = ("hoge","hogehoge");
my @c = ("2","6","8","9");
print split/,/,@a;
print split/,/,@b;
print split/,/,@c;
上の二つ比べてみ。
0040nobodyさん04/07/16 03:53ID:???
>>39
問題を読み違えているぞ。

$a = 'fred,wilma,barney';
$aa = split(/,/, $a);
print $aa;

splitをスカラで受けた場合に
「Use of implicit split to @_ is deprecated」警告が出るという話。
0041nobodyさん04/07/16 04:08ID:???
>>37
>splitの結果何が返って来るのかね?んー?
もしかしてsplitをスカラで受けた結果何が返ってくるか知らないのかね?んー?
004234 != 3204/07/16 04:35ID:???
>>39
質問者さんの「$a,$b,$cの中でカンマに区切られている要素の数」を、
my $a = "fred,wilma,barney"; # これを「カンマに区切られている要素」と呼んでるのかな、と。
my $b = "hoge,hogehoge";
my $c = "2,6,8,9";
print scalar(split(/,/,$a));
print scalar(split(/,/,$b));
print scalar(split(/,/,$c));
こういうのを想定して>>34を書きました。>>22を書いたのも自分なので、その記憶もあり。

>>39は、
ex1. 'barneyhogehoge9' # 最終の要素。手前のsplitがなくても、同じ結果に。
ex2. '324' # 要素の「数」。
という出力になりました。

あっ、>>37さんの「splitの結果何が返って来るのかね?」は、
>>32だと $total = 1 * 3 + 1 * 2 + 1 * 1 で固定やぞ、ということなんでしょうか?>>39さん
質問者じゃないのに、何を混乱してるんだろう(泣)。
00433404/07/16 04:40ID:???
リロードしておけばよかったーっ_| ̄|○

元質を見て想定してたのは>>40さんと同じ。

>>37さん、>>39さんのお話の意図がつかめなくて
マゴマゴしてしまいました(汗)。
0044nobodyさん04/07/16 04:42ID:???
>>42
>>32でも答えは得られる。
-wオプションによる警告をどうしたらいいかと言うこと。
00453404/07/16 05:07ID:???
>>44
ありがとうございます。元々、>>40さん、>>44さんと同じように考えてたはずが、
>>39を見て「俺、何かとんでもない勘違いしてたんだろうか?」と不安になってました。

# 慌てて書いたので>>42のコードだと…同じ警告を吐くような。

とりあえず、頭冷やします。
0046nobodyさん04/07/16 08:41ID:???
>>32
警告メッセージは、@_ への暗黙な代入を警告しているだけだから
警告が特に問題ないとわかっている場合は、
オプションを切ってもいいんじゃない?

{ no warnings;
$count = split(/,/,$a) * 3 + split(/,/,$b) * 2 + split(/,/,$c);
}

no warningを使う場合は、必ずブロックで局所化する事と、
警告オプションを切ったブロックないで
組み込み関数以外の他のサブルーチンの使用に注意する。

明示的に配列に代入する でも回避できるみたい。
3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);
0047nobodyさん04/07/16 09:12ID:???
my $a = 'foo,bar,baz'; # 3 * 3
my $b = 'hoge,fuga';  # 2 * 2
my $c = '1,2,3,4,5,6,7'; # 1 * 7

my $total = (1 + $a =~ tr/,//) * 3
       + (1 + $b =~ tr/,//) * 2
       + (1 + $c =~ tr/,//)
; # 20
0048nobodyさん04/07/16 09:34ID:???
>>41
お前も知らないんだから黙ってろ
0049nobodyさん04/07/16 11:15ID:???
>>48
use strict                                               
0050nobodyさん04/07/16 11:24ID:???
>>47
空要素の扱いに注意。--> 1 +
例外的なケースかもしれないけど仕様を確認した方が良いよ、念の為。
0051nobodyさん04/07/16 13:52ID:???
>>50
こういう事を言いたいのかな?

#--- test1.p ---

my @str = ('1,,,,', ',,,,1', ',,1,,', '');

print 0 + @{[split /,/]} for @str; # 1530
print "\n";
print 1 + tr/,// for @str; # 5551
print "\n";
print 0 + (length && 1 + tr/,//) for @str; # 5550

#--- test2.p ---
use Benchmark;
our @str = ('foo,bar,baz', 'hoge,fuga,' x 5, ',,,,1', ',,1,,', '1,,,,', '');

timethese(-5, {
  split => sub { my $n = @{[split /,/]} for @str },
  tr => sub { my $n = 1 + tr/,// for @str },
  length => sub { my $n = length && 1 + tr/,// for @str },
});
00523204/07/16 15:17ID:???
元質問者です。予想外にレスがついていてびっくりです。
みなさんありがとうございます。勉強になりました。

>>46 さんの
> 3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);

>>47 さんの
my $total = (1 + $a =~ tr/,//) * 3
       + (1 + $b =~ tr/,//) * 2
       + (1 + $c =~ tr/,//)
; # 20

あたりが良さそうですね。ちょっと今から試してみます。
>>47 は、コード読んでもなんでそうなるのかよくわからない...


0053nobodyさん04/07/16 16:35ID:???
>>52
http://flex.ee.uec.ac.jp/texi/perl/perl_103.html
0054nobodyさん04/07/16 16:35ID:???
>>52
, の数を数えているの。
00553204/07/16 17:04ID:???
>>46
> 3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);

これやってみましたが、同じエラーがでました。???
これからtrの方を試してみます。
00563204/07/16 17:14ID:???
>>47
のtrだとエラーも出ませんでした。当たり前ですね。


0057nobodyさん04/07/16 19:49ID:???
あれもこれも「エラー」、か・・・
0058nobodyさん04/07/16 19:56ID:wqtiPvAW
>>57晒しage
0059nobodyさん04/07/16 20:04ID:???
>>51
フォローthx you, なるほど @{[split/,/,$a]} でもいいのか。
詳細を書くと、
'' を要素数0とカウントするか空文字1要素とカウントするか、という事ですが
他にも 'a,b,c' と 'a,b,c,' の様な場合、数え方で結果がかわってきます。
shiftでは末尾の空要素はなくなるが、tr, lengthの方法だとカウントされる。
一見同じ様に見えても、細部で微妙に仕様が変わってくるので注意しようってとです。

use strict;
use warnings;
my $a = '';
my $b = 'a,b,c';
my $c = '1,2,3,4,5,6,';

sub count_item_1($) { return int @{[split/,/,$_[0]]} }
sub count_item_2($) { return int 1 + $_[0] =~ tr/,// }
sub count_item_3($) { return int length $_[0] && 1 + $_[0] =~ tr/,// }

sub count(&) {
my($func) = @_;
printf("%d %d %d\n", $func->($a), $func->($b), $func->($c));
}

count(\&count_item_1); # 0 3 6
count(\&count_item_2); # 1 3 7
count(\&count_item_3); # 0 3 7


>>56
自分の環境(perl 5.6.1, perl 5.8.2 build for linux)ではこの方法で警告消えたのだけど、どうしてだろ。
0060nobodyさん04/07/17 12:40ID:???
スレ違いかもしれないけど jcode.pl の半角カタカナが強化されたバージョンが
あったはずなんだけどご存知ないでしょうか??
0061名無しさん04/07/17 14:06ID:BYFAIbz8
JAVAでServlet書くときは1インスタンスをいろんなセッションで使うから、
他のセッションに影響しないように注意するけど、Perlはそういう心配しなくていいの?
0062nobodyさん04/07/17 14:39ID:???
>>1を読め
0063名無しさん04/07/17 14:44ID:BYFAIbz8
Servlet書いたことないくせに
0064nobodyさん04/07/17 14:57ID:???
>>61
利用するフレームワーク (CGI、mod_perl、FastCGI、
SpeedyCGI、PerlScript etc. etc.) に依る。
0065名無しさん04/07/17 15:43ID:BYFAIbz8
どういう風に依るですか?
0066nobodyさん04/07/17 19:32ID:???
Javaでも標準のセッションクラス以外にも、いろんなセッションクラスがあるでしょ。(俺は標準のしか使ったことないけど。)
セッションサービスの仕様はそのクラスによる。
つーか、Perlには標準でセッション関数はない。だから、自分で書くなり、そういうモジュールを探してくる。
0067nobodyさん04/07/17 20:54ID:ihUsGdG4
aaa/bbb

と入力されたデータを受け取って

$a="aaa";
$b="bbb";

という二つのデータに分けたいんだけど

$id(入力されたデータ)=~s/$1\/$2/$1$2/i;
$a="$1";
$b="$2";

とやってもうまく行かない
悪い点があったら教えて下さい
0068nobodyさん04/07/17 20:58ID:???
>>67
> s/$1\/$2/$1$2/i;
0069nobodyさん04/07/17 21:01ID:???
>>68
そこですか。
どうもありがとうございます。
0070nobodyさん04/07/17 21:02ID:???
>>67
用途としてはsplit()のほうが。
($a,$b) = split(/\//,$id);
0071nobodyさん04/07/17 21:04ID:???
>>70
そっちの方が楽でしたね
全然知恵が回りませんでした
ありがとうございました
0072nobodyさん04/07/18 05:14ID:???
プログラミングで詰まってます。助けてください・・・

1〜1000の各数字が、5・6・7・8・9の5種のうちのどれかを所持しております。
所持するものの違いにより
1〜1000の数字をそれぞれ5つの配列に、分けるにはどうすればいいのでしょうか?
ずーーーーっと考えてるんですが、限界なので質問させてください。
0073nobodyさん04/07/18 05:58ID:???
お前の日本語がわからないのだが…
0074nobodyさん04/07/18 05:58ID:???
>>72
pushを使えばできるだろう。
0075nobodyさん04/07/18 07:57ID:???
> 1〜1000の各数字が、5・6・7・8・9の5種のうちのどれかを所持しております。

ここがよくわからん
0076nobodyさん04/07/18 08:34ID:???
まあ、放置しとけばいいさ。
0077nobodyさん04/07/18 09:59ID:???
>>75
data[1〜1000] にそれぞれ5〜9の値が入っていて、
その値に応じて新しい配列(5個)を生成したい、
ってことだと思う。
>>74のいうようにpushとifでできるやぁね
0078nobodyさん04/07/18 11:04ID:???
何で回答者が日本語の解析までやらにゃならんのだ
0079nobodyさん04/07/18 12:02ID:???
77 氏の通りだと仮定してやってみた。
効率なんて考えていないので添削キボンヌm(_ _)m

# 5,6,7,8,9 の数字が 1000 個入っている配列(リスト)
# 仮に rand を使って生成。
my @Source_array = map { ((5..9)[int rand 5]) } 1 .. 1000;

# を、それぞれ値 (5 〜 9) によって選別したい。
# でも 5 つも配列を作るのは、のちのちややこしくなるので、ここは 1 つの配列に格納して、
# それぞれを呼び出しやすくする。(リストリファレンスが 5 つ入っているハシュにする)

my %Dist_hash;
push @{$Dist_hash{$Source_array[$_]}}, $_ foreach 0 .. $#Source_array;

# 呼び出し方。
# 値が 7 の @Source_array の添え字を表示する。
my $value = 7; # 範囲は 5 から 9 の間で指定しる。
printf qq|\$Source_array[%s]\n|, join(', ', @{$Dist_hash{$value}});

# 実際に @Source_array の値を表示してみる。
printf qq|\$Source_array[%d] = %d\n|, $_, $Source_array[$_] foreach (@{$Dist_hash{$value}});
00807204/07/18 14:14ID:???
文章わかりにくかったみたいですいません。
意図してたのはまさに77氏の言うとおりです。
79さんどうも!思ってたことができました。こんなの自分で考え付けるようになりたい。
ありがとうございました。
0081nobodyさん04/07/18 22:22ID:LXS4mDIw
$aa = "aa";
@bb = qw[1 2 3];
$cc = "cc";
&hoge($aa,@bb,$cc);

sub hoge($,@,$){
my $aa = shift;
my @bb = shift;
my $cc = shift;

print "$aa \n";
print "$_\n" foreach(@bb);
print "$cc\n";
}

関数に変数と配列を渡し、関数側でそれぞれ上記のように
スカラ変数と配列を区別させて認識させたいのですが
どのようにすれば良いのでしょうか?
よろしくお願いします。
0082nobodyさん04/07/18 22:25ID:???
お約束として。

リファレンス使え。
0083nobodyさん04/07/18 22:29ID:???
>>81
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html#Pass_by_Reference
00848104/07/18 22:30ID:???
やっぱり参照使わないと実現できないのでしょうか?
もし使わずに実現できる方法があれば教えてほしいです。
0085nobodyさん04/07/18 22:34ID:???
ルートユーザしか使えないアプリをCGIから
動かしたいと考えています。perlを使ったCGIで
ルートユーザかしか使えないコマンドを
入力する方法はないでしょうか?

今、自分が作っているCGIの前に人が作った
認証を通す必要があり、ユーザは自分が指定した
一般ユーザでログインしているという形になります。

通常のコマンドであればシングルコーティションで
囲えばよいことがわかっているのですが、当たり前
ながら一般ユーザではroot専用のコマンドは
入力できません。

方法がありましたら、教えてください
0086nobodyさん04/07/18 22:51ID:???
ユーザに権限与えて sudo
0087nobodyさん04/07/18 22:55ID:???
>84
配列が一番後ろなら出来る。
が、リファレンスを使った方が問題が起こりにくい。
リファレンスを使わずにやるなら、複雑な方法になるか、問題の起こりやすい方法になるかどっちかだ。
0088黒死犬 ◆EgxBlf8nvc 04/07/18 23:00ID:???
>>81
Perl5.8以上なら

sub hogging($\[@]$) {

my $top = shift;
my @middle = @{+shift};
my $bottom = shift;

print("top = [$top]");
print("middle = [@{[join(',',@middle)]}]");
print("bottom = [$bottom]");

}

my @unko = (A..Z);
test("Test Start", @unko, "Test End");

これで出来ますよ
0089黒死犬 ◆EgxBlf8nvc 04/07/18 23:02ID:???
訂正
s/test/hogging/;
0090nobodyさん04/07/18 23:51ID:???
>>88
プロトタイプ宣言は 5.002 から利用可能だが。

sub test($\@$) {
  my $top = shift;
  my @middle = @{+shift};
  my $bottom = shift;
  ...
0091nobodyさん04/07/19 00:02ID:???
それってひょっとして
hoge($aa,@bb,$cc,@dd) みたく配列が二つ以上ある場合でもできたりします?
0092nobodyさん04/07/19 00:08ID:???
>>91
確認ぐらい人に聞かなくてもできるでしょ?
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html#Prototypes
00938404/07/19 04:16ID:???
>>87-90
やはり参照を使うのが無難のようですね。
しかし、勉強になりました。
どうもありがとうございました。
0094黒死犬 ◆EgxBlf8nvc 04/07/19 13:14ID:???
>>90
そうなんですか
自分が情報を得ているところでは、[Perl5.8の新機能]となっていた為、誤解をしてしまった様です
ご指摘有難うございます
0095nobodyさん04/07/19 16:08ID:???
ふむ。
0096nobodyさん04/07/19 21:58ID:54seOava
log.csv ってファイルに、改行したデータを書き込みたいんですが、
上手く書き込めません。
同じ行に表示されるようにしたいんですが、次の行に改行されてしまいます。
上手く、一つのセルに改行したデータを入れたいんですが、どうすればよいでしょうか?
コードは、下のようなのを使っているのですが・・・・
根本的に間違ってたりするんでしょうか?


$aaa = '123';
$bbb = '456';
@ccc = '789',
'0123';

open(LOGFILE,">>log.csv");

$LOG = "$aaa,$bbb,@ccc";

print LOGFILE $LOG;
close LOGFILE;

0097nobodyさん04/07/19 22:13ID:???
>>96
Excelで表示する時の話?セルっつーのが何のことやら。
特定のアプリでの表示の話なら、
逆にそのアプリで改行して保存したものを覗いてみれば分かると思われ。
0098nobodyさん04/07/19 22:27ID:54seOava
>>97
Excelで開いた場合です。説明不足ですみません。
メモ帳で開くと、改行のコードの問題みたいです。

改行コードの変換は

$ccc =~ s/\n/\r/g;

で良いんでしょうか?
0099nobodyさん04/07/19 22:32ID:OSilZxWF
>>96
perlコーディングには関係ないが

CSV形式では普通セル内に改行やカンマがあるときは「"」で囲うよ。
で「"」内では「"」を「""」で表現する

それからエクセルではセル内の改行は\r\nではなくて\n
0100nobodyさん04/07/19 23:24ID:54seOava
>>99
エクセル内の改行は\nなんでしょうか?
とすると、

$ccc =~ s/?/\n/g;

「?」の部分には何を入れればよいのでしょう?

上記のように、s/\n/\r/g; として書き込んだファイルを
メモ帳で開くと、見た目はUNIX改行コードっぽくなっているのですが、
エクセルで開くと、セル内改行が出来ていないようです・・・
0101nobodyさん04/07/19 23:56ID:???
>>100

1 │3 │4
2 │  │
─┼─┼─
5 │6 │7
  │  │8

   ↓

"1\n2",3,4\r\n5,6,"7\n8"\r\n

あとメモ帳じゃなくてバイナリエディタ使ってみな。
0102nobodyさん04/07/19 23:59ID:???
>>100
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
■ このスレッドは過去ログ倉庫に格納されています