【Perl】初心者コーナー Part16
■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo
02/09/15 15:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【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あたりを見よう。
0313nobodyさん
02/09/23 19:07ID:???$aは${a}って書けるのはわかるよね?
なら $$data{'2by4'} は ${$data}{'2by4'} ってなるのもわかるよね?
なら %$data (%{$data}) ってなるのもわかるよね?
そゆこと。
0314299
02/09/23 20:28ID:???sub make{
foreach $data(@file){
$_=split(/,/,$data);
&print;
$a++;
if($a eq 10){last;}
}
}
sub print{
$list=<<"_HTML_";
$list
$_[1]$_[2]$_[3]
_HTML_
}
299です。>>303さんレスありがとうございます。
勉強中の身でもうひとつ…
上記の例で、CSVデータから頭10件を取り出して表示したいのですが、
foreachで強制的に10件カウントしたら終わらせているのですが
こうじゃなくて普通にforあるいはwhileで書いたらどうなりますか?
@fileから取り出す記述が分からないです。
また速度は変わりますか?
どうも適当にかじってるので基本的なものが出来てないです。
0316nobodyさん
02/09/23 20:49ID:iHNT8XWdフォームに入力した文字が半角じゃないといけない所が全角だったり、
入力する数がおかしかったりする時に
間違ってますよと表示するにはどうすればいいですか?
0317さやか
02/09/23 21:07ID:UR9fVmIXこれのps_user.cgiだと思うんですが588行あたりが
たぶんネックです。
さやかは、後から登録した奴は下に表示したいんです
検索エンジンって、フリーでもらえる奴はみんな
後から登録されたサイトが上に出るじゃないですか
それを逆にしたいんです。
難しいです。こんな質問してるさやかは嫌いですか?
私体も弱いんです。男の人も怖いし。優しい人いないかな?
ちなみに男って言われました。文章が男っぽいのかな?
私の周りにはくわしい人いません。男の人ならくわしい人いそうですが
男の人さやか苦手です。女子高生です!←男の人ってこうかくと
優しくなるらしいですね。うそじゃないですよ。
0318nobodyさん
02/09/23 21:24ID:???それだけの説明では、こう答えるしかない。
$入力された文字列 =~ /半角を表す正規表現/ or &間違ってますよと表示
$入力された数字 =~ /数字以外を表す正規表現/ or &間違ってますよと表示
それぞれの正規表現は頑張って調べてね。
0319nobodyさん
02/09/23 21:28ID:???質問者が誰かなんてどうでもいいんだよ。
なんで人を小馬鹿にしたような質問の仕方するかなぁ。
優しい人?そんな聞き方されて喜んで答える奴はタダのスケベだろ。
つーかそんな聞き方されたら答える気無くなるつーの。
答えが欲しけりゃ
普 通 に 聞 け 。
0321さやか
02/09/23 21:42ID:UR9fVmIXでも、さやかにはくわしい人いないの・・・。
迷惑だったですよね・・・。
すいません。一から勉強します。>>320ショックです。
そんな酷い事いわれると。
0322nobodyさん
02/09/23 21:46ID:???SJISならこんな感じかな
if(length($in{kana}) > $kana_max ||
length($in{eigo}) > $eigo_max ||
length($in{suuji}) > $suuji_max){error('文字多いよ');}
if($in{kana} =~ /[^\x20\xa7-\xdd]/i){error('半角カナで入れてね');}
if($in{eigo} =~ /[^\x20a-z]/i){error('半角英字で入れてね');}
if($in{suuji} =~ /[^\x20\d]/){error('半角数字で入れてね');}
>>321
ここは匿名掲示板だからね
相手の概要はわからないほうが色々と都合が良いのよ
むしろ余計な情報は邪魔
0324nobodyさん
02/09/23 21:53ID:???動作を勉強したいんじゃなくて既製のスクリプトを改造したいのなら
こっちじゃない?
【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/l50
0325さやか
02/09/23 21:56ID:UR9fVmIXseek(ファイルハンドル,0,0)
これを0→2にしてもだめだったです。
たぶんこれが悪の正体です↓
while(<IO>){
if (index($_,">$siteyrl<")!=-1){
@y2=split(//<>/,$_);
close(IO);
とにかくこの辺がキーだと思います。苦しい。
0326さやか
02/09/23 22:06ID:UR9fVmIXなんかロールプレイングみたい!
0327nobodyさん
02/09/23 22:13ID:???> if($in{suuji} =~ /[^\x20\d]/){error('半角数字で入れてね');}
理解して参考にする人はいいが、丸写しする人は困るよな。
$n = '2' . "\x20" . '3';
print $n . "\n";
print $n + 0;
相手が出していない条件を黙って付け加えるのは危険だよ。
0329318
02/09/23 23:58ID:???半角→半角以外
or→andだね。
0330nobodyさん
02/09/24 01:45ID:???ファイルを読み込み・書き込みする場合、
+<、+>の入出力両用をあまり使用しないのは何故でしょうか?
0331nobodyさん
02/09/24 02:19ID:???ファイルサイズを求める場合
$size1=(stat( $filename))[7];#statを用いて
$size2=(-s $filename)#ファイルテスト演算子
それぞれの違い・利点は何でしょう?
0332nobodyさん
02/09/24 03:24ID:???意外と(存在|使い方)を知らない人が多いから。
…じゃ、答にならない?
使える場面では気にせず使えばいいよ。
>>331
# stat の返す 13 要素から成るリストを作り、その 8 番目の要素を得る
$size1 = ( stat $filename )[7];
# ファイルサイズのみスカラー値として得る
$size2 = -s $filename;
perl のソース確認したワケじゃないけど、内部的には大差ない気が。
でもたった一つの要素の為にリスト吐かせるのはバカらしいと思う。
「8 番目」よりは「-s」の方が、パっと見で分かりやすいし。
0333nobodyさん
02/09/24 04:11ID:???作業を終えるまでオンメモリで行ける小規模なものなら+<は使うが
巨大なログをテンポラリに小出ししながら記録していく場合は
ログへの直書きは必要無いので普通に読みテンポラリに普通に書く。
331は速度的にはどっちも似たようなもんだね。
statは他の情報も取れるし一度使えば後で何度でも結果が
使いまわせるのでタイプが面倒じゃないならstatのが
良いかも。
0334294
02/09/24 08:49ID:???$name = $in{'name'};
$a1 = $in{'a1'};
$a2 = $in{'a2'};
$a3 = $in{'a3'};
〜〜〜以下続く
$a15 = $in{'a15'};
$b1 = $a1 * 3;
$b2 = $a2 * 6;
$b3 = $a3 * 5;
$b4 = $a4 * 3;
$b5 = $a5 * 3;
$c = $b1 + $b2 + $b3 + $b4 + $b5;
$b6 = $a6 * 3;
〜〜(略)
$b10 = $a10 * 3;
$d = $b6 + $b7 + $b8 + $b9 + $b10;
(もう一度繰り返して15まで終わらせて、最後の式を$eにします)
$f = $c + $d + $e
として、
print "$name … $c : $d : $e : 「$f」\n";
と示すと、「1、2、3、4、5、1、2、………5」と入力したとすると
名前 … 57 :=@:=@: 「156」 と示されてしまうのです。
ログを見てみると、<>57<>45<>54<>156<>となっていて、同じ数字を入力して同じ計算をしても違う数字になっていて…。一番最初のはあっているのですが。計算の仕方を間違えてしまっているのでしょうか?
0336334
02/09/24 12:18ID:???ありがとうございます!急いで修正します。
…では、計算がおかしいのはどうしてでしょうか。
<>57<>57<>57<>171<>にならないとおかしい筈なのですが…。
0337nobodyさん
02/09/24 13:59ID:aoR+W3Ks**,***,***,***,**,***
**,***,***,***,**,***
**,***,***,***,**,***
とデータ(データは動的)が入っています。
これを配列data[][]
にいれるのどうしたらいいのでしょうか?
すいません教えてください。
だれかやさしい人お願いします
0338nobodyさん
02/09/24 14:29ID:???while(<>){
@date=split(/,/,$_);
}
0339訂正
02/09/24 14:30ID:???while(<FILE>){
@date=split(/,/,$_);
}
0341nobodyさん
02/09/24 14:36ID:???my @data;
open F, $csv;
while (<F>)
{
chomp;
$data[$. - 1] = [ split /,/ ];
}
(ここ数日変な質問のしかたする人が目立つ気がする)
open(CSV,$filename);
my@data=map{chomp;[split/,/]}<CSV>;
close(CSV);
0343nobodyさん
02/09/24 14:59ID:4thlbHdp# findpattern
while (<STDIN>) {
if (/Jackson$/) {
print;
}
}
findpattern < people.txt
と、本のとおりにやって、Jacksonで終わるデータだけを出力したいのに、
何も出力せずに終わってしまいます。
いろいろ試してみましたが、文字列の末尾にマッチさせる$のときだけ
うまくいかないようです。
原因がわかりません。
どこがおかしいんでしょうか?
0345nobodyさん
02/09/24 15:05ID:???どうすればいいんでしょうか。
ベンチマーク?で検索してもいまいちわからないもので..おながいします。
0346nobodyさん
02/09/24 15:09ID:???下の2行をスクリプトの2行目辺りに置いて
use Benchmark;
$start = new Benchmark;
下の3行をexitする直前にでも置いとけば?
$last = new Benchmark;
$bench = timediff($last,$start);
print timestr($bench);
0347nobodyさん
02/09/24 15:11ID:4thlbHdpwhile (<STDIN>) {
chomp;
if (/Jackson$/) {
print;
}
}
でしょうか?
ダメでした。
入力のパーサーがおかしいのか、処理がおかしいのか、
データを埋め込みにしてみるなりして、どこが問題なのか
切り分けをしてみたらどうでしょう>
>>345
Benchmarkモジュールって標準ではいってなかったけ?
http://search.cpan.org/author/JHI/perl-5.8.0/lib/Benchmark.pm
0349nobodyさん
02/09/24 15:20ID:???ああ、STDINか。POSTデータ?
while(<STDIN>){print "[$_]";}
一度こんな感じでどんな形でデータが入って来てるか見てみ。
0351nobodyさん
02/09/24 15:37ID:???1 wallclock secs ( 0.10 usr + 0.01 sys = 0.11 CPU)
てなカンジのものがでてきますた
哀しいかな読みとれません
意味を教えていただけると幸いでつ
0352nobodyさん
02/09/24 15:43ID:4thlbHdpこんなかんじでした。
[Micheal Jackson
][Janet Jackson
][Joe Jackson
][Joni Mitchel
][Jackson 5
][Micheal Johnson
][Jon Anderson
][Sade
]
末尾に何かがあるみたいですが、
chomp;を入れると、"]"しか表示されませんでした。
>>350
キャリッジリターンとは改行コードのことでしょうか?
取り除く方法はchompでは間違ってますか?
上の結果を見ると、違うっぽいですがわかりません。
0353b
02/09/24 15:43ID:PxGGzvM00354nobodyさん
02/09/24 15:45ID:???%giko = ( "1" => "1gorula", "2" => "2dorula", "3" => "itteyosi");
%mona = ( "2" => "2cher");
この2つのハッシュから
%abone = ( "1" => "1gorula", "2" => "2cher", "3" => "itteyosi");
を作ろうとしたら
while (($key, $value) = each(%giko)) {
if( defined($mona{"$key"}) ){
$giko{"$key"} = $mona{"$key"};
}
}
とかやるしかないんでしょうか?
これだと
%mona = ( "2" => "2cher", "4" => "sindeyosi");
のような形式に対応できないし、もっと簡潔な方法は無いかなと思うのですが・・・。
0356nobodyさん
02/09/24 16:03ID:???ありがとうございます。
Cygwin 上でしたが、できました!
もし、よろしければ、\r について教えて下さい。
Unix 上では \n の変わりに \r を使うのでしょうか?
で、chomp は \n は取り除けても \r は無理ってことですか?
0357355
02/09/24 16:13ID:???Unix 上なら普通 \r なんか使わない (\n しか使わない) ので、
問題は起きない。
DOS (Windows) 上だと、自動的に \r が入力から取り除かれるのかな?
Cygwin はよく分らない。
詳しい人の解説キボンヌ。
0358nobodyさん
02/09/24 16:19ID:aoR+W3Ks>>**,***,***,***,**,***
>>**,***,***,***,**,***
>>**,***,***,***,**,***
>>とデータ(データは動的)が入っています。
>>これを配列data[][]
>>にいれるのどうしたらいいのでしょうか
if(!open IN,'< Q1.dat'){
print "オープンエラー";
}
@list=<IN>;$row=0;
foreach $rec(@list){
@data=split("/,/",$rec);
for($j=0;$j<8;$j++){
$mondai[$i][$j]=$data[$j];
print "($i)(($j)$mondai[$i][$j]\n";
print "$mondai[$i][$j]\n";
}
$row++;
}
これじゃだめなのですか?
わかりません PERLの超初心者
0366nobodyさん
02/09/24 22:39ID:???undef $b;
undef $x;
これを1行にまとめられますか
0367nobodyさん
02/09/24 22:52ID:???0368nobodyさん
02/09/24 23:03ID:???036969
02/09/24 23:32ID:???0370nobodyさん
02/09/25 01:11ID:???最初から10文字無いものは後ろに空白で(10-title文字数)を入れて揃えるとして
どうしたらいいのでしょうか?
$title = substr($title,0,10);
if(length($title) < 10){$title = sprintf(???????,$title)};
多分こんな感じでしょうか?
御教授願います〜
0371nobodyさん
02/09/25 01:19ID:???0373nobodyさん
02/09/25 02:18ID:???open ( IN, "$file" ) ;
foreach ( 1 .. $x ) {
$data = <IN>;
print "$data\n" ;
}
close (IN) ;
1行づつデータを読み込み表示しているのですが、
たとえばこれだとデータのもともとの行数が100行以下ですと
データが無い行は空白がprintされてしまいます。
データがある最後の行が終わったら読み込みをやめるには
どうしたらいいのでしょうか?
0374373
02/09/25 02:21ID:???if ( $data ){ print "$data\n" ; }
にすればいいのか
0375nobodyさん
02/09/25 02:22ID:???while(<IN>){
print;
}
close(IN);
0376nobodyさん
02/09/25 02:27ID:???while (<IN>){
print;
last if $. == 100;
}
0377nobodyさん
02/09/25 02:28ID:???0378nobodyさん
02/09/25 02:29ID:???大丈夫なのか?
0379nobodyさん
02/09/25 02:32ID:???まぁ100回くらい繰り返しときゃ大丈夫だろって事だったり
もしそうなら一番スマートなのは
open(IN, "$file");
print while (<IN>);
close(IN);
0380nobodyさん
02/09/25 02:36ID:???jcode.pl の h2z_euc って使えます?
&jcode::h2z_ecu( \$str ); ってしてもスペースしか出ないんです。
&jcode::tr( \$str, '0-9A-Za-z', '0-9A-Za-z' );
は、ちゃんと置換してくれるんですけど。
0381380
02/09/25 02:38ID:???ecuはeucね。
ソースの中では間違ってない。
0382nobodyさん
02/09/25 02:44ID:???質問とは関係ないけどforeachは配列操作で回数指定ならforかと
どっちでも動くのを承知で使うにしてもやっぱforかと
0384373
02/09/25 02:48ID:???そうなんです。
>>375-379
よくわからないのは、openされた$fileから
何の変数に入れていることになるんですか?
print; はprint "$_"; ということですか?
0385nobodyさん
02/09/25 02:52ID:???>print; はprint "$_"; ということですか?
そう。
print; = print STDOUT "$_";
0387373
02/09/25 02:55ID:???while (<IN>);
は
while ($_ = <IN>);
ですか?
0389nobodyさん
02/09/25 03:07ID:???0390nobodyさん
02/09/25 03:13ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0391nobodyさん
02/09/25 04:52ID:???は
if ($a eq "xxx" or "yyy") {
と同じ意味?
0392nobodyさん
02/09/25 05:10ID:???全然違う。
0393nobodyさん
02/09/25 05:23ID:???というような記述があって、サブルーチンに飛んでいるのですが
これは⊂と全く同じ意味なのでしょうか
\の意味がわかりません
前者はサブルーチンfooのリファレンスを取得して$barに代入。fooは呼ばない。
後者はサブルーチンfooを呼んでその戻り値のリファレンスを$barに代入。
STDOUTじゃなくてselectされてるハンドルだし
print;≠print STDOUT "$_";
print;≒print STDOUT $_;
print;=print $_;
じゃない?
0399nobodyさん
02/09/26 01:48ID:???「if (($a eq "xxx") or ($a eq "yyy"))」は
$aの内容が「xxx」または「yyy」の時だけ真(true)だが
「if ($a eq "xxx" or "yyy")」は
「yyy」の結果が必ず真(true)になるから常に真(true)になってしまう。
0400.....
02/09/26 02:39ID:???log2.dat
log3.dat
・
・
・
log100.dat
という名前のファイル群を次々開いてすべての行を一個の配列にさせることって可能でしょうか?
自分でサブルーチンに挑戦してみたけどうまくいかなかった…
0401nobodyさん
02/09/26 02:41ID:???0402nobodyさん
02/09/26 05:46ID:???for(0 .. 100){
$hoge++;
open(IN,"log$hoge.dat");
$numo. = <IN>;
close (IN);
}
print "$numo";
0403nobodyさん
02/09/26 05:54ID:???------------------------------------------------------------------------
CGIWrap encountered an error while attempting to execute this script:
Error Message: Exec format error
Error Number: 8
This message usually indicates there is a problem with the script itself. The owner of the script needs to check the #! line for correctness.
↑こんなエラーが出てしまって一向にBBS設置できないんですが
どーしてなんでしょうか?
0404nobodyさん
02/09/26 06:41ID:???CGIの話はこちらへ。
http://pc.2ch.net/test/read.cgi/php/1032704121/l50
0405nobody
02/09/26 11:41ID:???$hoge = 'mona giko morara';
$piyo = ( $hoge =~ /mona/ ); #1
@foo = ( $hoge =~ /mona/ ); #2
@bar = ( $hoge =~ /(mona)/ ); #3
print $piyo @foo @bar;
は、
1 1 mona
なんですが、#1,#2 はマッチした数、@barはマッチした文字列が入る
のですか?
あと、配列の要素数は @foo や $#foo で分かりますが、
ハッシュの要素数はどうやって調べますか?
0406nobodyさん
02/09/26 12:00ID:???requireされたライブラリの中のサブルーチンはrequireしたプログラムに関係なくても
全部ロードされますか?
0407nobodyさん
02/09/26 12:09ID:???#1 はスカラーコンテキストで評価しているので、マッチしたかどうかが
真偽値 (1 か "") で返される。
#2 はリストコンテキストで評価し、且つパターン中にカッコが含まれない
ので、マッチした場合は (1) というリストが返される。
#3 はリストコンテキストで評価し、且つパターン中にカッコが含まれる
ので、カッコにマッチした部分から成るリスト値 (この場合は ("mona"))
が返される。
…と、駱駝本に全てハッキリ書いてある。
ハッシュの要素数は keys をスカラーコンテキストで評価。
$foo = keys %foo;
>>406
Yes.
0409nobodyさん
02/09/26 12:29ID:???ライブラリには使わないサブルーチンも入っているものだと思うのですが、
極論すると動作を早くするには呼び出すサブルーチンだけのファイルを作って
requireするか、全部1つのファイルに書けってことになりますか?
0412nobodyさん
02/09/26 17:06ID:???スカラー変数のデータをバイト単位で操作するにはどうすれば良いのでしょうか?
例えば$aのデータが16進で01 02 03 04 05 06 07 08 09の9バイトの場合に
0x03を0xddで置き換えたり、任意のバイトを削ったりということです。
substrを使って置き換えようとしたら、置き換え文字が10進数換算の文字列に
なってしまい(0xdd なら"221"で0x32 0x32 0x31へ)上手くいきませんでした。
■ このスレッドは過去ログ倉庫に格納されています