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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0175nobodyさん04/12/06 06:14:11ID:???
10000倍では?
0176nobodyさん04/12/06 08:28:17ID:???
>>175は既に100倍(r
0177nobodyさん04/12/06 10:08:16ID:???
MLDBMを使ってデータの書込みを行っているのですが、データを書き込んでも
ファイルが生成されません。
サーバはRedhat9+Apacheで構成されているようなのですが
環境に依存して生成・書込みが出来ないことがあるのでしょうか。

以下のようなルーチンを使用しています。(パスは合っています。)

use MLDBM qw(DB_File Storable);

sub DbmWrite {
 my($data, $filename) = @_;
 my(%writehash);
  tie %writehash, MLDBM, $ini::path.$filename, O_CREAT|O_RDWR, 0666;
  %writehash = (%writehash, %$data);
  untie %writehash;
}
0178nobodyさん04/12/06 11:27:02ID:???
>>177
とりあえず、tieに or die $!つけてどうなるかみるのが基本じゃないかな
0179nobodyさん04/12/06 12:35:45ID:???
再帰処理でディレクトリ一覧を表示する処理について質問です。

# とりあえずお気に入りの一覧ということで
&showdir("C:\/Documents and Settings\/Administrator\/Favorites");
sub showdir {
  my($dir) = @_;
  opendir(DIR, $dir) || die $!;
  my(@files) = readdir(DIR);
  closedir(DIR);
  foreach (@files){
    if($_ ne '.' && $_ ne '..'){
      $path = $indir . "/" . $_;
      for($i=0; $i<$level; $i++){
       print " ";
      }
      print $_ . ((-d $path) ? "/" : "") . "\n";
      if(-d $path){
        $level++;
        &showdir($path);
      }
    }
  }
  $level--;
}

現在はこのように書いているのですが、このように書くとディレクトリやファイルなど関係なく、
名前順でソートされてしまうようです(Win2K SP4 ActivePerl 5.6.1)。
2レスに分けます、
0180nobodyさん04/12/06 12:36:24ID:???
要するに、

aaa.txt
bbb
 bbb.txt
ccc
 ccc.txt
ddd.txt

このように表示されてしまいます。
これを、まずはディレクトリとファイルでソートして、
そこからファイル名でソートさせたいと思っているのですが、
ディレクトリかファイルかでソートするにはどのように記述したらいいでしょうか。
上の例で言いますと、

bbb
 bbb.txt
ccc
 ccc.txt
aaa.txt
ddd.txt

このような表示順序にしたいと思っています。
0181nobodyさん04/12/06 13:04:43ID:???
>>178
有難うございます。
どうやらtieが死んでいるみたいです。
エラー内容はサーバ管理者不在で見れませんが、、、、
0182nobodyさん04/12/06 13:21:50ID:???
>>181
CGIならCGI::CarpのfatalsToBrowser使うとかいろいろやりようあるだろ
0183nobodyさん04/12/06 13:36:20ID:???
FILE::find使った方が楽そうな気が・・・
0184JAPU04/12/06 13:51:45ID:???
はにゃーん

>>171
無関係の文字コードで送ってくるブラウザもあるようなので注意。古い例で恐縮ですが,たとえばBSD/386版Mozilla/3.xではJIS固定で送信していました。

INPUTはHTMLの文字コードで送られるが,HIDDENは別のコードで送られるという実装もあるようです。(何となく内部処理が想像つきますが…)

いまどきの主要なブラウザをターゲットにするのであれば,HTMLの文字コードがそのまま利用されるという仮定でも問題無いようです。

(FYI) HTMLでは送信されるエンコードを指定することができるが,現状まともに利用されてはいない模様。
cf. http://www.w3.org/TR/html401/interact/forms.html#h-17.3
0185nobodyさん04/12/06 13:54:44ID:???
foreachの手前でそうなるようにソートしときゃいいんでねーの?
例えば:

my %file_or_dir;
@file_or_dir{@files} = map { (-d "$dir/$_")? 0: 1 } @files;
@files = sort { $file_or_dir{$a} <=> $file_or_dir{$b} || $a cmp $b } @files;



0186JAPU04/12/06 14:10:52ID:???
はにゃーん
>>132 で既に回答出てたの気づかずに >>82 用のコード書いてしまったよ… 悔しいのでとりあえず貼り付けておきます。(インデントずれるので http://www.japu.org/tmp/ayumoesort.pl にも置きました…) あ,手抜きなので注意して。
#! /usr/bin/perl -w
# This code is public domain; I never assert any rights.
# This code is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
use strict;
use constant COND_DTYPE_STR => 0;
use constant COND_DTYPE_NUM => 1;
use constant COND_ORDER_ASC => 0;
use constant COND_ORDER_DESC => 1;
MAIN: {
my @data = ("foo,bar,2,3,4",
"foo,bar,3,4,5",
"fog,bar,2,2,2",
"fgh,bar,3,4,2",
"foo,bar,4,5,6");
my @ordered = ayumoesort(\@data,
{dtype => COND_DTYPE_NUM,
order => COND_ORDER_ASC,
keyno => 2},
{dtype => COND_DTYPE_STR,
order => COND_ORDER_DESC,
keyno => 0});
print "$_\n" foreach @ordered
}
# つづく
0187JAPU04/12/06 14:11:27ID:???
# This code is public domain; I never assert any rights.
# This code is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sub ayumoesort
{
my $dref = shift;
my @cond = @_;
my @sgn = map { -($_->{order}*2 - 1) } @cond; # ASC: +1, DESC: -1
# Schwartz Transform; cf. Effective Perl or ask Google
# equivalent to:
# @tmp = map { ... } @$dref;
# @tmp = sort { ... } @tmp;
# @$dref = map { ... } @tmp;
@$dref = (map { $_->[-1] }
sort {
foreach my $i (0..$#cond) {
my $r;
if($cond[$i]{dtype} == COND_DTYPE_STR) {
$r = $sgn[$i]*($a->[$i] cmp $b->[$i]) and return $r;
} elsif($cond[$i]{dtype} == COND_DTYPE_NUM) {
$r = $sgn[$i]*($a->[$i] <=> $b->[$i]) and return $r;
} else {
die;
}
}
}
map { my $x = $_;
[(map { (split /,/, $x)[$cond[$_]{keyno}] } (0..$#cond)),
$_] } @$dref);
}
0188nobodyさん04/12/06 14:14:23ID:???
>>179-180
# コードは試してないけど、

まとめてソート
sort { (-d "$dir/$a" <=> -d "$dir/$b") or ($a cmp $b) } @files

ループをディレクトリとファイルに分ける
grep {-d"$dir/$_"}@files
grep {-f"$dir/$_"}@files

>>183
File::Find はソートしてくれないよ。
0189nobodyさん04/12/06 16:21:10ID:???
>>188
>>179-180です。<OPTION>で選択するファイル一覧を作っていました。
@files = sort { (-d "$dir/$b" <=> -d "$dir/$a") or ($a cmp $b) } @files; でやりたいことが出来ました。ありがとうございます。
0190nobodyさん04/12/06 16:57:38ID:kMJjfrXb
ぬるぽ
0191nobodyさん04/12/06 16:58:07ID:kMJjfrXb
誤爆ですた
0192nobodyさん04/12/06 17:03:05ID:adgUx9sV

ほれ。
http://himatsubu.fc2web.com/22/fir/ かなりシュールな心理テストでオモロイ。

0193nobodyさん04/12/06 17:26:45ID:???
>>190-192
スレタイ読めない文盲はお帰り下さい。
0194nobodyさん04/12/06 19:43:19ID:???
>>193の発言中に、一部不穏当な表現のあったことをお詫びいたします。
0195nobodyさん04/12/06 19:44:56ID:???
>>193の発言中に、一部不穏当な表現のあったことをお詫びいたします。
0196nobodyさん04/12/06 20:43:45ID:???
>>194-195
連稿はお帰り下さい。
0197nobodyさん04/12/06 21:59:43ID:???
>>194-196
援交はご遠慮下さい。
0198nobodyさん04/12/06 22:54:57ID:???
漏れが「phpがでたらビターーーン」スレと間違えたせいだ
正直スマンカッタ
今は反省している
0199nobodyさん04/12/06 23:45:58ID:PVGalzLM
テキストファイルをopenして表示させるのと
Socketにより他サーバーから読み込み表示させるのとでは
どの程度サーバー負荷は高まるものなのでしょうか?
0200nobodyさん04/12/07 00:27:16ID:J98ZOjsq
perlでプログラミングをしたときのデバッグの方法はコメントアウトして
実行して・・という風な方法しかないのでしょうか

一度perlでcgiの短いプログラム(50行ぐらい)を作ったことがあるんですが、
こんな短いのでもバグをとるのにすごく骨を折りました。
0201nobodyさん04/12/07 00:31:29ID:???
>>200
好きなのを選べ

っ【Google】
っ【検索ワード】
っ【Perl】
っ【デバッグ】
0202nobodyさん04/12/07 00:36:00ID:???
>200
二分検索法って知ってるかい?
アルゴリズムってのは、なにもプログラムを組む時にしか使えないものじゃないぞ。
0203nobodyさん04/12/07 05:39:36ID:???
>>200
そうか?エラーメッセージを読めばどこが悪いかなんてすぐ分かるが。
まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
020420004/12/07 15:33:29ID:???
>>201
文法チェックはブラウザ上でソースを入力するとやってくれる
サイトがあったんで、それを使っていました
(cygwin?がうまくインストールできなかったってのもあります)
コマンドでデバッグをするのと違いはあるんでしょうか

>>202
どんどんせばめていけばいいんですね

>>203
>まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
そのとおりです。なんで500エラーがでるのかが分からなくて
どこも修正してないに、何回も実行してみたりして・・
結局原因のひとつはcgiのファイルのパスをフルパスで書いてたのが
いけなかったんだと思います。ほかにもあったけど少し前なんで忘れてしまった。
0205nobodyさん04/12/07 15:51:02ID:???
>>204
マジレスしてやるから帰ってな。
Perlいれてローカルで動かせ
0206nobodyさん04/12/07 15:51:19ID:9tRllW3i
みなさん、唐突ではありますが、
きれいなコード書いて公開してる人のURL教えてください!
0207nobodyさん04/12/07 16:09:37ID:???
>>206
「perl excellent source code」でググった。
ttp://www.perl.com/pub/q/documentation
0208nobodyさん04/12/07 16:27:59ID:9tRllW3i
>206
んーと、コードが載ってませんね。
きれいなコード見て、学びたいので、
そういう感じでお願いします。
0209nobodyさん04/12/07 16:29:33ID:???
>>206
www.cpan.org。どれがきれいかは知らんがたくさんあるので
いくつかはあるだろ。
0210nobodyさん04/12/07 17:04:28ID:???
私もどれが綺麗か分からないのでご質問させて頂いているんです。。
021120004/12/07 17:38:09ID:???
>>205
コードはインフォシークの無料HPスペースにアップロードして
実行しています。最終的には動作させることができました。

>Perlいれてローカルで動かせ
意図がわからないのですが、これをするとどんな利点があるんでしょうか?
アップロードして実行するのも慣れてくると短時間でできるので。。。
0212nobodyさん04/12/07 17:49:02ID:???
>>211
ボケ防止
0213nobodyさん04/12/07 18:08:01ID:???
>>211
Perl の吐くエラーメッセージを読める

ひょっとして、Perl が行番号入りでエラーメッセージを吐いてくれる
ということを知らなかったりする?
0214nobodyさん04/12/07 18:11:19ID:???
>>211
もし仮に

while (@hoge) {
    処理
}

と書こうとして @hoge を $hoge と書き間違い、さらに $hoge に何かしら文字列やら入ってたら
無限ループ作っちゃうでしょう。

それを鯖にUPして実行したら鯖に負荷がかかりっぱなしになる。
鯖が落ちたら君の責任。共有鯖なら鯖会社だけでなく他の鯖利用者にも迷惑がかかる。

ローカルなら君のPCに負担かかる。君だけが被害を受けるが全て君の責任。

どっちがいいよ?
0215nobodyさん04/12/07 18:29:20ID:Oi1PFFsC
現在進行してるのとは違う話題になりますが、
フォームから受け取ったメールアドレスが携帯電話のメールアドレスかどうか
を判断したいのですが

$nb = $FORM{mail};

if($nb ne $nb !~ /(.*)\@docomo\.ne\.jp/
and $nb ne $nb !~ /(.*)\@ezweb\.ne\.jp/
and $nb ne $nb !~ /(.*)\@(.*)\.vodafone\.ne\.jp/){
   "携帯電話メールアドレスとして処理"
}else{
   "携帯電話以外のメールアドレスとして処理"
}

としてみたのですが、どうも上手くいきません。
(何のアドレスを入れても携帯以外のアドレスとして処理されてしまいます。)
何が間違っているかどなたか教えていただけますでしょうか。
よろしくお願いします。
021621504/12/07 18:41:14ID:???
すいません、215です。
処理が逆になってました。
(携帯外メルアドでも携帯メルアドでも同じ処理になってしまうので大差ないんですが。)

よろしくお願いします。
0217JAPU04/12/07 18:44:27ID:???
はにゃーん

$nb ne $nb !~ /(.*)\@docomo\.ne\.jp/
これを,演算子の優先順位をもとに括ると
$nb ne ($nb !~ /(.*)\@docomo\.ne\.jp/)

ここで,() 内は "" (偽) または "1" (真) を返す。これを $nb と(文字列として)比較しているため,多くの場合はこの式全体として「偽」となる。

これを踏まえて,書き直すと

if($nb =~ /\@docomo\.ne\.jp$/i or $nb =~ /\@ezweb\.ne\.jp$/i or $nb =~ /\@\w+\.vodafone\.ne\.jp$/i) {
# 携帯電話のアドレス
} else {
# NG
}

もしくは,

if($nb =~ /\@(?:docomo\.ne\.jp|ezweb\.ne\.jp|\w+\.vodafone\.ne\.jp)$/i) {
# 携帯電話のアドレス
} else {
# NG
}

入門書は「はじめてのPerl」をおすすめする。
i 修飾子については Perl のマニュアル等で熟知すべし。(「プログラミングPerl」または http://www.perldoc.com/)
021821504/12/07 18:56:42ID:???
>>217 JAPUさん
迅速で的確なレスありがとうございました。
希望道理のCGIが実行できました。

入門書や教えていただいたURLにも早速行って勉強します。
本当にありがとうございました。
0219nobodyさん04/12/07 20:20:42ID:???
パーラーなら
$nb=~ m!\@(?:docomo|ezweb|vodafone)\.ne\.jp$!i
0220nobodyさん04/12/07 20:58:48ID:???
…などと書くのは恥と思え
0221JAPU04/12/07 21:17:03ID:???
あ,書名微妙に違ってました。
「初めてのPerl」が正解。
どうも最近「はじめての」と平仮名で書く習慣が…

# There's more than one way to do it.
0222nobodyさん04/12/08 04:01:02ID:CFZe8E7O
@{+shift} の処理内容がどうしても分かりません。
記号ばっかで検索もできない…
0223nobodyさん04/12/08 07:01:35ID:???
>>222
@{shift};
ソフトリファレンスと解釈される。
# use warningsで曖昧と指摘される。

@{+shift};
+は変数名に使えないから、@{+shift()}と解釈される。
@{shift()}と等価。
0224nobodyさん04/12/08 07:14:20ID:???
訂正
×ソフトリファレンスと解釈される。
○@shiftと解釈される。
0225nobodyさん04/12/08 10:38:37ID:???
まぁ@{+shift}はワケワカランわな。

@{shift()}または@{shift(@_)}が無難。
022622204/12/08 20:32:23ID:???
>>223-225
ありがとうございます。

+{ hash_ref } とか {; block } とかと同じような原理だとは思ったんですが、
どうしても探し出せなかったので助かりました。
0227nobodyさん04/12/08 23:28:15ID:???
UTF-8の文字列処理で躓いてます。

1: getメソッドで送信されてきた文字列$wordの文字コードを判定して、
  utf-8だったらsjisに変換して以後の処理に使いたいです。

2: 使ってるサーバー(arenaのsuite2)がPerl5.6.1です。Perl5.8ならなんとかなりそうだとか、
  5.6.1でもjcode.pmが入っていればいけそうだというのはグーグルで発見したんですが、
  jcode.plしか入っていないようですhttp://web.arena.ne.jp/suite2/support/manual/hp/script.html#cgi

3: sjis,jis,euc-jpに関しての処理の説明は多く発見できるんですが、jcode.plはutf-8は対応していない?ようです。

本当にちょっとしたことなんですが、jcode.plで色々やってもダメだったです。
jcode.pmをインストールしないと無理でしょうか?
0228nobodyさん04/12/08 23:31:38ID:???
>>227
勝手にインスコロールして use lib しる!ってレスが返ってくる悪寒。
0229nobodyさん04/12/08 23:38:50ID:???
>jcode.pmをインストールしないと無理でしょうか?

この時点で、まだ何もやってないのに質問してる教えて君ってのが丸出しだな
0230nobodyさん04/12/09 01:34:56ID:???
Jcode.pmってpure perlだっけ。
0231nobodyさん04/12/09 01:35:08ID:???
そりゃ共用鯖で実験するのはヤバいだろ。
0232JAPU04/12/09 03:19:09ID:???
はにゃーん

Unicode 絡みは XS でかかれていますが,Pure Perl の環境でも動作するよう Jcode::Unicode::NoXS が用意されています。
実際にはユーザが意識することは無く,自動的に Jcode::Unicode or Jcode::Unicode::NoXS が読み込まれるので安心です。
0233nobodyさん04/12/09 11:37:19ID:???
Unicodeと日本語は歴史的経緯で問題ありまくりなのではまらないように
注意しろよ。この辺がまとまってると思う。

ttp://www.debian.or.jp/~kubota/unicode-symbols.html.ja

Jcode.pmはこの辺の問題どう扱ってるんだろうか。$Jcode::Unicode::PEDANTIC
関係以外を除くとマニュアルには

Unicode conversion table used here are based uponon files at
ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/, Copyright (c)
1991-1994 Unicode, Inc.

としか書いてないのでJISの変換表決めうちと読めるけれども。
0234nobodyさん04/12/09 19:33:11ID:???
LWPのPurePerlが欲しいのは俺だけじゃないはず
0235nobodyさん04/12/09 20:07:53ID:???
>>234
車輪の再発明は感心できないが、今回はそれに該当しないので許可する。
君が書きたまえ
0236nobodyさん04/12/09 20:26:49ID:???
以下のようなファイルからdtの部分とdlの部分だけ切出したいのですが、
複数行にわたっており正規表現のやり方がわからなくて困っています。
どのようにしたら、取り出せるでしょうか?

<dl>
<dt>title1
<dd>aaa<br>
bbb
ccc
<dt>title2
<dd>aaa<br>
bbb<br>
ccc
</dl>

023723604/12/09 20:30:31ID:???
こんな感じでやりたいのですが、複数行が取り込めません...
よろしくお願いします。

$i = 0;
while(<>){

if(m/<dt>(*.)$/){
push($dt[$i]);
}
if(m/<dd>(*.)$/){
push($dd[$i]);
}
}
0238nobodyさん04/12/09 20:58:18ID:???
フラグ立てれ
023923604/12/09 21:41:05ID:???
フラグを立てればできそうな気がするのですが、具体的には
どのようにすればいいかが浮かばないです...

2個目の<dt>または</dl>がくるまで読み込んで、そこでフラグを
立てて...
すると一組目の<dt><dd>セットまでしか読めないし...

??




0240nobodyさん04/12/09 21:45:54ID:???
こう?
push(@{$1}, $2) while m#<(d[td])>((?:(?!<d[td]>|</dl).)+)#gsi;
024123604/12/09 22:21:16ID:???
>>240
ありがとうございます。1行でできるなんて思いませんでした。

<dt>aaa
bbb
ccc
<dd>ddd
eee
fff

となってる場合、行にまたがってる部分、bbb,ccc,eee,fffが取り込まれ
ないようです...

この一行を理解しようと頑張ってみましたがムズカシすぎました。
複数行にわたるのでやっぱりフラグが必要ですかねぇ...

0242nobodyさん04/12/09 23:14:04ID:???
>>233
JIS   0208   SJIS   CP932 APPLE 0213   IBMGLY IBMIRV JCODE
0x005C ------ U+00A5 U+005C U+00A5 ------ U+00A5 U+005C ------
0x007E ------ U+203E U+007E U+007E ------ U+203E U+007E ------
0x2131 U+FFE3 U+FFE3 U+FFE3 U+FFE3 U+203E U+FFE3 U+FFE3 U+FFE3
0x213D U+2015 U+2015 U+2015 U+2014 U+2014 U+2014 U+2014 U+2015
0x2140 U+005C U+005C U+FF3C U+FF3C U+FF3C U+FF3C U+FF3C U+FF3C
0x2141 U+301C U+301C U+FF5E U+301C U+301C U+301C U+301C U+301C
0x2142 U+2016 U+2016 U+2225 U+2016 U+2016 U+2016 U+2016 U+2016
0x215D U+2212 U+2212 U+FF0D U+2212 U+2212 U+2212 U+2212 U+2212
0x216F U+FFE5 U+FFE5 U+FFE5 U+FFE5 U+00A5 U+FFE5 U+FFE5 U+FFE5
0x2171 U+00A2 U+00A2 U+FFE0 U+00A2 U+00A2 U+FFE0 U+FFE0 U+00A2
0x2172 U+00A3 U+00A3 U+FFE1 U+00A3 U+00A3 U+FFE1 U+FFE1 U+00A3
0x224C U+00AC U+00AC U+FFE2 U+00AC U+00AC U+FFE2 U+FFE2 U+00AC
そのページのスクリプトをいじってテストしてみた。
JIS-0208.TXTをそのまま実装してるみたいだね。
0243nobodyさん04/12/09 23:26:10ID:???
と、思ったら、0x2140 (\)は U+FF3C (FULLWIDTH REVERSE SOLIDUS, \) になってるなぁ。
0244nobodyさん04/12/10 00:28:10ID:???
>>242
おお、なるほど。ASCIIの範囲はそのままになるように
してる関係で0x2140(\)を0x5cにしちゃうと、もとから
0x5cだった場合と区別つかなくなって不便だからあえて
変えてるんだろうね。

世の中この変換表だけだったらすっきりしたんだろうけど
なぁ。
0245JAPU04/12/10 03:47:06ID:???
>>241

$_ にすべての行を取り込んでいます?
{ local $/ = undef; $_ = <> }

んで,>>240 のスクリプトはシンボリックリファレンス使用しているので,あまり初心者にお勧めできません。
私ならこう書くという例。(考え方はほとんど同じですが。)
while(m{(?:<dt>(.*?)(?=</d[tl]>|<d[td]>)) |
(?:<dd>(.*?)(?=</d[dl]>|<d[td]>))}gixs) {
push @dt, $1 if(defined $1);
push @dd, $2 if(defined $2);
}
それぞれの修飾子についてはマニュアル等にて熟知すべし。
0246nobodyさん04/12/10 08:38:33ID:???
Perlは書けるが、正規表現が苦手な第三者からすると、
>>240や>>245を見て、俺もまだまだだなって思った。
詳説読むか
0247nobodyさん04/12/10 08:58:58ID:???
正規表現は奥が深い。
深すぎるけどね。
0248nobodyさん04/12/10 09:37:21ID:???
ttp://www.din.or.jp/~ohzaki/perl.htm#Tag_Remove
Perlメモのタグの削除について質問です。
こちらのページでは「$str には HTML文書全体を入れておきます」と書かれていますが、
open (DATA, "<index.html");
@line = <DATA>;
このようにして読み込んだ場合、一行ごとに分けられて配列に入れられますよね。
どのようにして$hensuにHTML全体を格納するのでしょうか。
現状では、HTMLを配列に入れた後で
$data = join ("", @lines);
などとして、一行にまとめているのですが。
0249nobodyさん04/12/10 09:39:49ID:???
{
local $/;
$data = <IN>;
}
0250nobodyさん04/12/10 09:57:15ID:???
>>248
read DATA, my $data, -s DATA;
0251nobodyさん04/12/10 10:05:09ID:???
>>250
レス感謝です。ファイルハンドルに対してもreadや-sが使えるのですね。
試してみたところ、期待通りの動きをしてくれました。
0252nobodyさん04/12/10 10:08:09ID:???
248への回答と思ってもらえなかった249が哀れだな...

0253nobodyさん04/12/10 10:19:42ID:???
やべ、ワロタw
0254nobodyさん04/12/10 13:16:03ID:???
コーディングとは違うので、微妙にスレ違いかもしれませんが失礼します。標準モジュールが一切利用不可のサーバーを使ってます。
BBSに書き込みがあった場合にNet::SMTPでメール送信を行おうと思っているのですが、この場合に使われるモジュールはSMTP.pmですよね。
use Net::SMTP;と書くとエラーで蹴られるので、require "SMTP.pm";と記述しようと思います。
まだコーディング中で実際には動かしていないのですが。SMTP.pmの中を見てみると、
use strict;
use vars qw($VERSION @ISA);
use Socket 1.3;
use Carp;
use IO::Socket;
use Net::Cmd;
use Net::Config;
などと書かれています。これらの全てのuse宣言を取り払ってrequire "******.pm";などと書き換えて、
該当する.pmのファイルをアップしていけば、使えるものなのでしょうか。
0255nobodyさん04/12/10 13:28:42ID:???
>>254
そもそもファイルを置けるのなら置いた場所を適切にuse libして
やればあとはそのままいけそうなものだが。それともuse機能自体を
つぶすような改造入ったperlなのか?
0256nobodyさん04/12/10 13:33:14ID:???
>標準モジュールが一切利用不可のサーバー
鯖変えれ
0257nobodyさん04/12/10 14:21:04ID:???
useが使えないって事は無いだろ。
Net::SMTPに関連する.pm全てそろえてからuse libすればいいんじゃね?
0258nobodyさん04/12/10 15:01:04ID:???
>>254
use libとかはプラグマなはずだけど。
lib.pmもなくて使えないとしたら @INC で代用。
pathさえ通せばrequireにする必要ないよ。(requireする場合だとimportも必要)
0259nobodyさん04/12/10 15:21:53ID:???
多重代入ってできないですか?
($a,$b,$c)=@hoge[1,3,5]
とかやってもだめでした
0260nobodyさん04/12/10 15:45:23ID:???
% perl -e '@hoge=qw(a b c d e f); ($a,$b,$c)=@hoge[1,3,5]; print "\$a=$a \$b=$b \$c=$c\n";'
$a=b $b=d $c=f

できるけど?
026125904/12/10 16:04:27ID:???
すいません、ホントは多重配列でした
($a,$b,$c)=@hoge[0][1,3,5]
ができず
0262nobodyさん04/12/10 16:17:39ID:tDYU+a6s
今までずっとソースのコードはEUCで統一していたのですが、
プロジェクトマネージャが変わった関係で、ソースは全てSJIS
に統一しなければならなくなってしまいました。

今までは、出力はSJISに変換してSJISのページを出し、そこからの
入力はまず全てEUCに変換し、処理を行っていたわけですが、
SJISに変更となると、一見変換処理は必要なくなって楽になるかとも
思えますが、SJIS特有の問題(「表」の文字等の)もあるので、入出力
時にこれだけは必ずやっておけということがあればご教授いただきたい
次第です。

個人的対策としましては、フォームからの入力を全てハッシュに入れる
段階で、今までは $form{name} = 入力値 としていたものを、
$form{name} = quotemeta(入力値) にすることによってなんとかなるん
じゃないかと安易に考えております。
0263nobodyさん04/12/10 16:45:53ID:???
ここはコーディングスレだよな。
0264nobodyさん04/12/10 16:57:05ID:???
$ perl
@fuga = qw(a b c d e f);
$hoge[0] = \@fuga;
($a,$b,$c)=@{$hoge[0]}[1,3,5];
print "\$a=$a \$b=$b \$c=$c\n";
$a=b $b=d $c=f

リファレンス、デリファレンスがわかってないだけ
026525904/12/10 17:08:40ID:???
ありがとう
精進します
0266nobodyさん04/12/10 17:18:07ID:???
>>262
入力をquotometaしてもほとんどどうにもならない。ソースコードの中に
出てくる「表」とかがやばい。というあたりを理解してないあたりで、
たぶんはまるだろうな。合掌。

まあperlのソースをSJISにしようというあたりで終わってるので、不運だ
と思ってあきらめなされ。

いっそ5.8以降にしてuse encoding 'Shift_JIS'で内部処理は全部unicode
にするのがいいかも?

0267nobodyさん04/12/10 17:25:03ID:???
quotemetaしてもあまり意味内ような。
0268nobodyさん04/12/10 21:00:25ID:???
>>262
EUC-JPのコードに依存した処理を探した方がいいかも。
案外ありそう。
0269nobodyさん04/12/10 21:11:53ID:???
正規表現とかでマッチ対象にする場合はquotemetaした方がいいと思うけど、
それがSJISに起因する問題の根本じゃないし。
0270nobodyさん04/12/10 21:40:25ID:???
SJISに移行すること自体が間違い。
0271nobodyさん04/12/10 22:30:33ID:???
sjisからeucへ移行ってのは良く聞くが、逆は聞いた事無い。っつーか正気?
正直、問題がある部分個別に対応するってのがFAかと。
一発でこうすりゃ大丈夫なんて解決策があったら、そもそも問題にならない。
そのプロジェクトマネージャーはきっと馬鹿で、PCと同じエンコードにした方が
作業効率が上がると思ってるんだろう。
0272nobodyさん04/12/10 22:58:04ID:???
そんな馬鹿がよくPMやってられるもんだ。
プロジェクトの敵は文字コードでもなく、バグでもない。
馬鹿なマネージャーの無意味な口出し。
0273nobodyさん04/12/10 23:05:15ID:???
とはいえ馬鹿なマネージャを説得するよりはまだ
バグと格闘した方が楽だったり...
0274nobodyさん04/12/10 23:32:53ID:???
時間の無駄だね。
一生フリーター気分ならそれでもいいだろうけど。
■ このスレッドは過去ログ倉庫に格納されています