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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0256nobodyさん2006/12/11(月) 18:27:02ID:???
はい、林檎さんの正妻です
0257nobodyさん2006/12/11(月) 18:44:20ID:???
マジカルっつーか、Safariを始めとするOS Xの一部ブラウザでは
Shift_JISのHTMLで書かれたフォームから送信すると
そういう不具合が起こることがある。
Shift_JISとユニコードの変換を厳密にやりすぎるからとか
どこかで読んだような気もするがどこだったかは忘れた。

まあ「safari チルダ」あたりでググると対処法とか色々出てくるよ。
0258 ◆TWARamEjuA 2006/12/11(月) 19:51:49ID:????BRZ(6677)
んじゃ妾ってとこか?@FireFox(lzyc)
0259nobodyさん2006/12/11(月) 19:58:53ID:???
くぐりました、今のところ良い方法が見あたりません
また探してはみます
利用者にあれこれさせるのは難しいので、置換部分の
アドバイスがありましたら宜しくお願いします
0260nobodyさん2006/12/11(月) 21:26:03ID:???
ググれば置換に関する情報も出てくるはずだけどな。

ていうかShift_JISでフォームを書かなきゃいいんじゃね?
0261nobodyさん2006/12/11(月) 23:07:25ID:???
検索文字列で 〜 にマッチするようにして、
置換文字列を make_link みたいな関数にして /e で評価する。
その関数の中で 〜 → ~ の変換を行う。とか。

sub make_link {
  my $url = shift;
  $url =~ s/〜/~/;
  return qq{<A HREF="$url" TARGET="_blank">$url</A>};
}

$tmp_data =~ s/(https?\:\/\/[^\s|\:|\<]+)\.(\/?)([\-_\.\!\~〜\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]*)/ make_link("$1.$2$3$4") /ieg;
0262nobodyさん2006/12/11(月) 23:27:08ID:???
>>260
だめでした
>>261
いろいろ考えましたが、私とは次元が違いますね
凄い
有り難うございます
0263nobodyさん2006/12/12(火) 03:31:20ID:???
multipleの受け取り方教えてください。
$name=$FORM{'name'};
のように、nameを受け取ったとして、
複数選択されてるときhogeは、
どんな風に受け取ればよいでしょうか。
$hoge=$FORM{'hoge'};
ってすると、$hogeの値はhoge2になっているみたいなんです。
hoge1も受け取りたいのですが。

<INPUT type="text" size="20" name="name" value="">
<select size="〜" name="hoge" multiple>
<option value="hoge1" selected>hoge1</option>
<option value="hoge2" selected>hoge2</option>
</select>

よろしくお願いします。
0264nobodyさん2006/12/12(火) 05:19:33ID:???
CGI.pm使えば配列で取得できる
0265nobodyさん2006/12/12(火) 05:50:23ID:???
>>264
ありがとうございます。
先ほど、CGI.pmで取得の仕方を解説してる
ページ見つけました。
動きが全然想像できないです。

CGI.pm使ってない方法検索しております。
よろしくお願いします。

0266nobodyさん2006/12/12(火) 09:42:44ID:???
$forms{$name} = $val;
って感じで入れてると思うけど、簡単に書いちゃうと

if(deinfed($forms{$name}){
  $forms{$name} .= "\0" . $val;
}else{
  $forms{$name} = $val;
}

のようにして、取り出すときは

my @tmpdata = split(/\0/, $forms{'hoge'});

とすれば複数選択したデータが @tmpdata に入ります。
ただしバイナリデータに対しては有効な技じゃないし、入力されたデータに対して \0 の存在をチェックし
エスケープしてやるなどの対策も考慮してください。

バイナリデータとか不正なデータをとりあえず無視して動作を確認したいなら上記可能。 なはずです
0267nobodyさん2006/12/12(火) 10:31:41ID:???
複数値を受け取るのは $FORM{'hoge'} だけと決まってるんだったら
配列に叩き込むほうが手っ取り早いしわかりやすいのかも。

if ($name eq 'hoge') {
  push @hoge, $value;
} else {
  $FORM{$name} = $value;
}

>>266 =~ s/deinfed/defined/ のcgi-lib.pl方式でもいいし、あとは質問者さんの好みで。
0268nobodyさん2006/12/12(火) 10:50:06ID:???
なかなか面白い間違いをしてたなorz
訂正thx
0269nobodyさん2006/12/12(火) 10:54:18ID:???
肝心なことが書き込まれてないが
hoge=hoge1とhoge=hoge2が順番に送られてくる
受け取ったものがhoge=hoge2になってるのは順番に同じ変数に入れてるから。
$hoge='hoge1';
$hoge='hoge2';
print $hoge;
こうなってるので後はどうするかは受け取り側で変えればいい。
0270nobodyさん2006/12/12(火) 20:02:31ID:???
関数の引数に配列を使った場合、配列のn番目ってどう指定すればいいんですか?
例えば
&func(@list1,@list2);

としたら、funcの中で$list1[4]とか$list2[6]とかを参照したいんです。
0271nobodyさん2006/12/12(火) 20:12:36ID:???
すればいいじゃない
0272nobodyさん2006/12/12(火) 20:48:08ID:???
ヒント:
&func(\@list1, \@list2);
0273nobodyさん2006/12/12(火) 21:16:11ID:???
>>270
&func( \@list1, \@list2 );

sub func {
  my( $list1, $list2 ) = @_;
  $$list1[4];
  $$list2[6];
}
0274nobodyさん2006/12/12(火) 21:23:56ID:???
考えることをさせるためにヒントだけにしたのに…
0275nobodyさん2006/12/12(火) 21:50:20ID:???
mkdir "foo/bar/baz"
ってやったときに、foo/barが存在しないとエラーで死ぬんだけど、再帰的に掘ってくれるような
モジュールってない?ないんなら自前で組んでもいいけど、あるんなら再発明したくないし。
0276nobodyさん2006/12/12(火) 22:12:56ID:???
sub mkdir2{
my @subdirs = split(/\/, shift);

my $curdir = curdir();

foreach my $subd (@subdirs){
  mkdir $subd if !-e $subd;
  chdir $subd;
}

chdir($curdir);
}
0277nobodyさん2006/12/12(火) 22:14:40ID:???
>>269
嘘こけ、順序は保証されてねーぞ。ブラウザの実装依存。
0278nobodyさん2006/12/12(火) 22:18:53ID:???
こんなモジュールしかねえや
ttp://search.cpan.org/~stevan/Tree-Simple-VisitorFactory-0.10/lib/Tree/Simple/Visitor/CreateDirectoryTree.pm
0279nobodyさん2006/12/12(火) 23:15:54ID:???
>>275
`mkdir -p foo/bar/baz`とかじゃ嫌?
0280nobodyさん2006/12/12(火) 23:16:19ID:???
>>275
File::Path
0281nobodyさん2006/12/13(水) 04:02:25ID:???
>>267
>>267
>>269
おかげさまで受け取り方良くわかりました。
ありがとうございました。
0282nobodyさん2006/12/13(水) 11:01:17ID:???
>>275
File::Pathはデフォで入ってないっけ?

>>277
順序が保証されてるなんて書いてないだろ
順序は知らんがひとつずつ順番に入ってくるってのは合ってるんじゃね?
02832752006/12/13(水) 15:21:34ID:???
>276,278
ありがと。

>279
それやるとシステム依存するかなと思ってさ。

>280,282
ごめん、探し方が足りなかったみたい。吊ってくるorz
0284nobodyさん2006/12/13(水) 16:44:36ID:???
数値を3バイト長でデータ化したいんですけど、packだけではできないんですか?

$n= 1000000;
if (($c1=chr(int($n / 256**2)))){
$n= $n % 256**2;
}
else { $c1= "\0"; }
if (($c2=chr(int($n / 256)))){
$n= $n % 256;
}
else { $c2= "\0"; }
$c= $c1 . $c2 . chr($n);
0285nobodyさん2006/12/13(水) 16:52:52ID:???
4バイトにpackして1バイト削るとかは?
0286 ◆TWARamEjuA 2006/12/13(水) 22:36:29ID:????BRZ(6677)
24ビットにして以下(ry
0287nobodyさん2006/12/14(木) 13:53:01ID:???
POSTでログインしてセッションが必要なサイトで
LWP::UserAgentなどを使用してCGIからアクセスするのは無理でしょうか?

一定時間経過するとセッションが切れて再ログインしないとダメだったり
サイト内での検索結果などをコピペするのがマンドクサイのです
0288nobodyさん2006/12/14(木) 16:20:40ID:???
逆に8バイト長のデータ化はどうやったらいいのやら
やっぱ256**4で割るっきゃないか
0289nobodyさん2006/12/14(木) 22:55:01ID:???
64bit整数が使えるのならpackのqやQも使えるのではないか?
0290nobodyさん2006/12/15(金) 03:08:09ID:???
rand関数って、ポケットリファレンスでは指定値"まで"の
ランダム数値を返すとなっていたので、7年間ずっと
rand(3)は0〜3までを返すと思っていたのですが、実際は
3未満(つまりは2.99999...)だったんですね。

上記の場合だと、3が出る確率は限りなく少ないことになる
ので今まで面倒なことをしてましたが、これから今まで
書いたプログラムの見直しをするようになるっぽいです。

一応同じように思い込んでた人のためになればと書き込
んでおきました。
0291nobodyさん2006/12/15(金) 03:15:41ID:???
>>290
ま、割と常識というかrand(3)で3は出ない
0292nobodyさん2006/12/15(金) 10:52:56ID:???
substrで文字数をカットした場合に発生する文字化けを回避する方法を教えて

$sex = substr(キーワード, カット開始位置, 文字数);
print "$sex<br>\n";

とするとたまに改行タグがおかしくなってしまう


print "$sex.<br>\n"
とすると改行タグはちゃんとされるけど・が$sexの後に表示されてしまう
0293nobodyさん2006/12/15(金) 10:59:38ID:???
文字コードがわからないとやりようがないし
0294nobodyさん2006/12/15(金) 10:59:58ID:???
2byte文字に対応してるわけないだろ・・・常識的に考えて・・・
「perl substr 日本語」でぐぐるといい
0295nobodyさん2006/12/15(金) 12:26:12ID:???
文字コードはシフトJIS
02962932006/12/15(金) 12:49:12ID:???
$from= 3;
$count= 5;
$s=~/(?:[\201-\237\340-\374]?.){$from}((?:[\201-\237\340-\374]?.){$count})/;
print $1,"\n";
02972932006/12/15(金) 12:56:47ID:???
あ、sオプションも要るか・・
0298nobodyさん2006/12/15(金) 13:54:29ID:???
ttp://akebi.jp/support/cyclamen.cgi?log=perl&tree=r20
0299nobodyさん2006/12/16(土) 14:00:26ID:???
urlデコードしたフォーム情報と、openしたテキストファイル(shift-jis)で
文字のマッチングしたいのですが、何をやってもうまくいきません。
どうか助けてください。

 <例>
 use CGI;
 use Encode;
 
 my $query = CGI->new;
 foreach ($query->param() ){
 $form{$_}=$query->param($_);
 }
 open (FILE,"<:encoding(shiftjis)","text.txt");
 @aaa = split(//,<AAA>);
 if ($form{bbb} eq $aaa[0]) {
  print "一致";
 }
 close(FILE);
0300nobodyさん2006/12/16(土) 14:02:20ID:???
split(//,<AAA>)はsplit(//,<FILE>)の間違いです。

<訂正>
 open (FILE,"<:encoding(shiftjis)","text.txt");
 @aaa = split(//,<FILE>);
 if ($form{bbb} eq $aaa[0]) {
  print "一致";
 }
0301nobodyさん2006/12/16(土) 14:49:58ID:???
>>299
なんか勘違いしてるっぽいので、
文章でどうしたいか説明して。
03022992006/12/16(土) 16:25:29ID:???
>>301
htmlのフォームに入力された文字と、txt(本当はcsv)のデータとが合致するときに、
なにかを表示するという簡易なデータベースを作っているところなんです。

 open (FILE,"<:encoding(shiftjis)","text.txt");
とかでtxtを開いて、クエリと合致するかどうかをみたいのですが、
cgi.pmでデコードした文字(クエリ)と、openで開いた文字の
デコード(?)が違うようで、他のコーディングとやらの
何をやっても一致しないという状態に陥ってます。

ものすごく初歩的・根本的な間違いをおかしているとは思います。
0303nobodyさん2006/12/16(土) 16:36:16ID:???
>>302
text.txtのカンマ区切りのデータとフォームが一致するかを見たいということかな?
text.txtは1行のみ?
改行は入っている?
split /,/, <FILE>; じゃだめ?

文字コード気にする前に、単純な英数字で確認してみて。
03042992006/12/16(土) 18:07:20ID:???
>>303さん、ありがとうございます。

>>299のようにクエリを受け取ってから、
自分のやりたいことをカンタンにしたのが下記のプログラムです。

 open (FILE,"<:encoding(shiftjis)","aaa.csv");
 while(<FILE>) {
  @aaa = split(/,/,$_);
  foreach(@aaa) {
   if ($form{namae} eq $aaa[$i]) {
    print encode("shiftjis","$aaa[$i]:match<br>");
   } else {
    print encode("shiftjis","$aaa[$i]:---<br>");
   }
   $i++;
  }
  $i =0;
 }
 close(FILE);

カンマ区切りのデータとフォームの一致をみるのが目的で、
csvは複数行に渡っています(改行入り)。
半角英数の場合はマッチングできるのですが、
平仮名・漢字は一致しません。
また、半角英数・仮名漢字に共通して、
open FILEで引っ張ってきた@aaa{$1}を表示しようとすると
文字化けが起こってしまいます。
0305nobodyさん2006/12/16(土) 18:35:53ID:???
>>304
ひとまず、エンコードの処理を忘れて、全てのファイルの文字コードを統一して保存して下さい。
次にコードをシンプルにして、試してみましょう。

open FILE, 'aaa.csv' or die;
while( <FILE> ){
 chomp;
 my @aaa = split /,/;
 for( my $i = 0; $i < @aaa; $i ){
  print $form{namae} eq $aaa[$i] ? 'true' : 'false';
 }
}
close FILE;

余計なお世話だけど、そんなforeachの使い方教えてるところは参考にしないほうがいいと思われ。
0306nobodyさん2006/12/16(土) 19:07:56ID:???
○ for( my $i = 0; $i < @aaa; $i ++ ){
0307nobodyさん2006/12/16(土) 20:54:54ID:???
for my $i ( 0..$#aaa )
こっちのが書くの楽だろ常識的に考えて
0308 ◆TWARamEjuA 2006/12/16(土) 21:59:41ID:????BRZ(6677)
>>307
楽と云うよりも効率が良くなったからこちらの方が良さそうな。
という思想で。

それはそうともう $i とはもう書かなくなったよなぁ。。。
ついでに回数を指定したループも書かなくなったよなぁ。。。
0309nobodyさん2006/12/16(土) 22:24:50ID:???
このスレでfor、foreach論争はやめてくれ
0310nobodyさん2006/12/16(土) 22:27:29ID:???
↑ どこが論争だよ
03112992006/12/16(土) 22:32:58ID:???
>>305-307
アドバイスの通りにしたら無事解決しました。
結局エンコード云々はいじらないでよかったようです。

ありがとうございました。
0312nobodyさん2006/12/16(土) 22:42:14ID:lMy9T+vR
(プログラム技術版で質問したところ、ここで質問した方がよいと言われたため、マルチポストしました)

perlに触れて2日目です。。かない痛いミスしてるかもしれませんが、何方か教えてください。

Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると
すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、

require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*name);
&jcode::convert(*name,'sjis');
print "$name";

としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。
どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。


0313nobodyさん2006/12/16(土) 22:55:56ID:???
for (keys %name){
&jcode::convert(\$name{$_},'sjis');
}
0314nobodyさん2006/12/16(土) 23:05:09ID:lMy9T+vR
それでも文字化けします…。どうしてだろう。。
0315nobodyさん2006/12/16(土) 23:10:28ID:???
>>314
ver6ぐらいからutfでないっけ
03162872006/12/17(日) 12:12:23ID:???
あーダメだ。Yahoo!JapanとかならOKだがログイン画面すら取ってこれない
java.lang.NullPointerException のみが出力されてくるのですが、御教示お願いします。


use LWP::UserAgent;
$url = "https://example.com/test.jsp";; #実際にはログイン画面のURLが入ってる
$ua = LWP::UserAgent->new;
$req = new HTTP::Request GET => $url;
$res = $ua->request($req);
print "Content-type: text/html\n\n";
print $res->content;
0317nobodyさん2006/12/17(日) 12:34:57ID:???
>>316
とりあえず普通にアクセスしたときの通信をトレースして
それを忠実に再現するしかないんじゃまいか
03182872006/12/17(日) 13:35:07ID:???
>>317さん
やっぱ皆さんこういう高度なのもサクっと作ってcron自動化とかしてたりするんでしょうか

ID・PASSなどをフォームに入れるログイン作業程度なら、
ローカルHTMLのformにhiddenで入れてしまって、jsで一発ログインとかしてるのですが、
一定時間ごとに自動ログイン→一連の作業→処理保存までするのは難しいですね。
もっと色々頑張ってみます
0319 ◆TWARamEjuA 2006/12/17(日) 15:50:40ID:????BRZ(6677)
>>318
その点、LWPモジュールも然りサンプルが必ずと言っていいほど掲載されているので、熟読すると良いかもしれませんです♪@CPAN
あっと、そのときには、解説の英文を1から10まで読むよりも、サンプルを1から10まできっちりと読むと判りやすいかと♪
0320nobodyさん2006/12/17(日) 15:56:53ID:8qXdAMYD
教えてください!
www.xxx.com/aaa.php?id=1&next=1
nextの1で処理を行っているのですが
リロードでも有効になってしまいます。
これを回避する方法などありますでしょうか。

submitからなら対策できるのですが、埋め込んだURLからは
どうしたら回避できるかわからず詰まっています。
0321nobodyさん2006/12/17(日) 15:58:27ID:8qXdAMYD
かくとこ間違えました。すいません。。
0322nobodyさん2006/12/17(日) 22:23:05ID:???
>>318
WWW::Mechanize とか
0323nobodyさん2006/12/18(月) 16:04:35ID:otF+VpE2
質問させてください。

POSTで$nameを送信($nameは日本語)
    ↓
cgi側が$nameを受け取って、namelist.datをオープンして、$nameを書き込んでクローズ。
    ↓
namelist.datを開くと、日本語が%83g%83%7D%83gといった感じで書き込まれている。

これを直したいのですが、namelist.datに書き込む前にjcodeで変換しても駄目でした。
文字コードはsjisで統一してあります。どのようにすれば文字化けせずに書き込めるのでしょうか。
0324nobodyさん2006/12/18(月) 16:09:24ID:???
受け取りと変換部分kwsk
0325nobodyさん2006/12/18(月) 16:27:36ID:otF+VpE2
323です。解決しました。。URLデコード&エンコードが原因でした。

>>324
お手数かけました。
0326nobodyさん2006/12/18(月) 20:56:29ID:???
sub disp_HTML {
print "Content-type: text/html\n\n";
print <<EOS;
<HTML lang="ja">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<TITLE>$_[0]</TITLE>
</HEAD><BODY>
$_[1]
</BODY></HTML>
EOS
exit;
}
POSTされた文字列が不正だった場合等に、ちょっとしたエラー出力をするのに、
こんな感じで単純な出力をするサブルーチンを作って実行するのと、
print "Content-type: text/html\n\n";
print <<EOS;
<HTML lang="ja">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<TITLE>エラー</TITLE>
</HEAD><BODY>
えらーです
</BODY></HTML>
EOS
exit;
}
そのままサブルーチンを作らずにHTMLを出力するのとではどれくらい速度に違いが出たりするのでしょうか。
0327nobodyさん2006/12/18(月) 21:00:45ID:???
エラー画面ということは、いろんな場所から呼び出される可能性があるので、サブルーチンにする。
またはテンプレート化する。
しかし、速度を気にするほど頻繁にエラー画面が出てしまう設計はどうかと。
0328nobodyさん2006/12/18(月) 21:03:25ID:???
content-type が出力されたかどうかのフラグは保持しておいた方がいいよ
0329nobodyさん2006/12/18(月) 21:14:08ID:???
>>327
どうもです。
エラーは極力でないように、悪意に対応できるようには作っているつもりなんですが
なんせ自分で一から作るのは初めてなもので、単純に速度が気になったのです。
それほどアクセスが掛かるようなものでもないですし、自分で使う分にはエラーなんて出さないように使うので
そんなに問題でもないんですが一応。

>>328
具体的にはどうすればよいのでしょうか。
print "Content-type: text/html\n\n";
はサブルーチンにせずに都度出力すると言うことでしょうか。
0330nobodyさん2006/12/18(月) 21:25:58ID:???
フラグなんて不要
いちいちフラグ確認しないとダメな書き方はよほどおかしい
0331nobodyさん2006/12/18(月) 21:39:31ID:???
>>329
処女作おめでとう。
速度なんか後回しで、まずは思うように作ってご覧。

そして、>>330が正解。
エラーチェックを全て終わらせてから出力をはじめよう。
0332nobodyさん2006/12/18(月) 21:57:14ID:???
>>331
そうですね。そうすることにします。

ありがとうございました。
0333nobodyさん2006/12/18(月) 23:22:23ID:???
サブルーチンが定義されているかどうかを調べるにはどうすればいいでしょうか。
条件として、サブルーチン自体にエラーがない保証というのがあり、
evalだと単純に$@の有無だけでサブルーチンの有無とすることができません。

シンボルテーブルを覗いたり、いろいろ調べてはいるのですが、よく分かりません。
シンボルのハッシュを参照したら、サブルーチンがないのに、参照したことによって
シンボルが追加されてしまうようです。
↑よく理解してないためか、そのように見えます。

ご助言いただければと思います。
0334nobodyさん2006/12/18(月) 23:23:54ID:???
エラーがない保証がない、でした
0335nobodyさん2006/12/19(火) 00:17:15ID:???
単純に defined(&subname) じゃダメ?
0336nobodyさん2006/12/19(火) 00:27:12ID:???
>サブルーチン自体にエラーがない保証がない

どんな設計だ
0337nobodyさん2006/12/19(火) 00:39:23ID:???
そういえばRailsスレはあるのにCatalystスレはないんだな。
やっぱ使ってる奴いないのか?
0338nobodyさん2006/12/19(火) 00:41:15ID:???
> 単純に defined(&subname) じゃダメ?

できちゃいました。すみません。そんな簡単だったんですね。
シンボルテーブル参照は、単純にパッケージ修飾の仕方で間違ってたようです。
ありがとうございました。
0339nobodyさん2006/12/19(火) 06:32:32ID:???
今北産業&流れを見ずにレス

>>316
LWPでhttpsはCrypt::SSLeayが要るんだけど、入ってないからダメって落ちじゃないよね?
0340nobodyさん2006/12/19(火) 09:33:57ID:???
すごく初歩的な質問ですが、行き詰っていますorz

$OLDには 0-6の数字または文字列が入ります。
数字の時には10〜60代を、文字列の場合はそのまま代入したいのですが、

if ( $OLD == 0 ){ $OLD = "10代"; }
elsif ( $OLD == 1 ){ $OLD = "20代"; }
.
.
.
elsif ( $OLD == 6 ){ $OLD = "60代"; }
else { $OLD = "$OLD"; }

このようにかいているんですが、最後のelseが反応せず、文字列はすべて10代と表示されてしまいます。
なにか書き方が間違っていると思うんですが、わかりませんorz 指摘してください。
0341nobodyさん2006/12/19(火) 10:25:25ID:???
数値以外が入るなら==じゃだめ。
つ eq、正規表現
03423402006/12/19(火) 10:34:36ID:???
Σ(゚Д゚|||)
試したら・・・できました。ありがとうございました! 勉強になりましたorz
0343nobodyさん2006/12/19(火) 10:44:06ID:???
プログラミング初心者です。

mod_perlは、
はじめの一回コンパイル→メモリ上に常駐
とネットで解説されていたんですが、
perlでもコンパイルしたものを配ったりってできるんでしょうか?
ソースを公開しないで、スクリプトが配布できたら
いいなと思いまして。
0344nobodyさん2006/12/19(火) 11:15:24ID:???
どこから突っ込んでほしい?
0345nobodyさん2006/12/19(火) 12:09:00ID:???
Perlで言うコンパイルはその場合意味が違うよ
あと、コンパイルは同じ環境でやらないといかんから配布向きじゃない
0346nobodyさん2006/12/19(火) 12:10:49ID:???
mod_perlがコンパイルしてmod_perlが常駐させるものでperlスクリプトが常駐できるものではない
(出来るには出来るがkillされるのがオチw)
0347nobodyさん2006/12/19(火) 15:31:43ID:???
>>345
>>346
なるほどです。ソースは公開しないといけないんですね。

>Perlで言うコンパイルはその場合意味が違うよ
・コンパイルって、コンピュータ用のオブジェクトコードに
することでよかったですよね?

・Perlでおいコンパイルは、機械語に直したオブジェクトコードを
メモリに保存しておいて2回目の起動以降は、ソースにアクセスしないで
メモリのオブジェクトコード読んで実行するということでよかったでしょうか。

・機械語は機械語でもC、Perl、JAVAでできたものは、全く別物なんでしょうか。
こういうのはどうやって勉強すれば。コンパイラの本読むとわかるでしょうか。

なんかネットに書いていることをそのまま質問していて、
ほんとアレなんですが、よろしくお願いします。
0348nobodyさん2006/12/19(火) 15:44:15ID:???
347です。
いろんなページさまよっているところなんですが。

JAVAは中間コードっていうのみたいですね。
C言語はexeファイルができます。
ちょっと手がかり見つかってきました。
JAVAマシーンが中間コードを読んで実行するみたいに、
mod_perlマシーンが、中間コードみたいなの動かすんでしょうか。
0349nobodyさん2006/12/19(火) 16:07:15ID:???
つ チラシの裏
0350nobodyさん2006/12/19(火) 16:08:29ID:???
mixiにでも書いとけ
0351nobodyさん2006/12/19(火) 18:18:58ID:???
配列とrand関数を組み合わせたいのですが表示できません。
どうしたらよいでしょう?
@nakami = (0, 8, 4, 12, 23, 55);
foreach $aaa(@nakami){
if(rand $aaa){
0352nobodyさん2006/12/19(火) 18:34:27ID:???
>>351
なにがしたいのでしょう?
0353nobodyさん2006/12/19(火) 18:54:33ID:???
>347
ラストね
コンパイルの解釈はまぁ OK

Perl でのその解釈は mod_perl の解釈
CGI で動く perl はその都度コンパイルされます
0354nobodyさん2006/12/19(火) 20:41:11ID:???
つ rand( @nakami );
0355nobodyさん2006/12/19(火) 23:24:08ID:???
教えていただけないでしょうか。
log.txtを開いてハッシュとしてセットの上、ペアごとにズラズラ並べたいのですが、

open(f,"log.txt");
%file = <f>;
while ( ($key, $val) = each (%file) ) {print "キー $key 値 $val\n";}
close(f);

これだと何も反応してくれません。
間違ってるでしょうか?

log.txtの中身は、
"●●","A組","◎◎","B組","■■","C組",

といった感じです。
0356nobodyさん2006/12/19(火) 23:37:17ID:???
>>355
ファイルから読み込んだ文字列は、そのままではリストとして扱われません。
文字列をハッシュ変数に代入しても意味がありません。

例えば、以下のような方法で、文字列をリストに変換する必要があります。

・split でカンマ区切りのリストに分解する(ただし二重引用符の除去が必要)
・Text::CSV_XS などのモジュールを利用する(二重引用符も考慮してくれるが少し大げさ)
・正規表現(http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values)を利用する
・eval で評価する(読み込むファイルが外部からの入力を記録している場合は危険)

この場合、正規表現が一番現実的でしょうか。
■ このスレッドは過去ログ倉庫に格納されています