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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/10/17(月) 00:47:17ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
00097662005/10/17(月) 00:55:59ID:???
>>997
すいません。。ほんとに。おいらが悪いんです。ごめんなさいです。
0010nobodyさん2005/10/17(月) 01:08:17ID:???
前スレ999ワラタ
0011nobodyさん2005/10/17(月) 01:42:22ID:???
全然勉強してないうえ仕事でわかんなくて悩むんだったら、
誰か (ちゃんとしたスクリプトを書いてくれるとこ) に依頼した方が会社もお前もいい判断だろうに。
1〜2週間やそこら悩んでできないくらいだったらそのほうがはるかにコストパフォーマンスがよいハズ。
つかそんなことで雇ってもらえてるのが、何ていうか、うらやましい。
0012nobodyさん2005/10/17(月) 01:48:57ID:???
同じく、前スレ999ワラタ
00137662005/10/17(月) 01:57:00ID:???
>>11

おっしゃるとおりです。おいらもできるってゆっちゃったのがいけなかったんです。ほんとに前スレの999ですね。。。情けないです。
00147662005/10/17(月) 01:59:05ID:???
色々調べて何回もいろんなソース試したりしてここまでやったんですが、、もうだめぽ。。泣

今回だけマジで助けてほしい。。お願いします。
0015nobodyさんNGNG
めずらしくこのスレ盛り上がってるじゃん。 うれしいよ。。
0016nobodyさん2005/10/17(月) 02:20:21ID:???
まだ766はいるのかな?
まだ出来てないなら要点まとめて頂戴。

まずは、送信したフォームの情報が正しく所得できているのか。

POSTでなく、GETで値をみられるようにする。

データを保存する方法はわかっているのか。

変数に入れた文字が保存できたのか調べる。
0017nobodyさん2005/10/17(月) 02:43:10ID:???
すみません、教えていただきたいのですが。
買い物などのWEBで、検索や完了まで時間がかかるとき、「ただいま検索(登録)中です」のような一時的画面を表示させたいのですが、
perlではどのような方法があるでしょうか?
一定時間(例えば1分とか)は、特定の一時ページを表示して、
完了した時に完了ページを表示するものをイメージしています。
javaなどでは時々このようなページを使っているとこがあるのですが。。。。

一応、小枝とかその他有名なサイトは見たんですが、
こういう点での会報がわからなくて。。。。
00187662005/10/17(月) 02:50:52ID:???
>>16

すいません。ありがとうございますです。

・送信したフォームの情報はexcelで開いたとき、名前が文字化け(EUCでやってるからだと思いますが、解決策わからず。。)

・変数にいれた文字(回答番号 1とか2とか)はcsvに数字で保存できています。

【お手上げ】

・前スレ >>981 に書いたような並びでexcelに保存ができなし。。
・名前をいれてなかったらエラー(送信できない)ようにしたい。

です。何卒ご指導お願いいたします。。まじですいません。
0019162005/10/17(月) 03:04:21ID:???
まず、先にこれだけいっておきます。
「エクセルは関係ない」。
エクセルで読める表示形式で保存したいって言うのは最後の手段で、今はそこまでいってないので頭から忘れてください。

送信する

データを受け取る

ファイルに保存する

第一段階でHTMLのメソッドをgetに・・・

って現段階のコード、どっかにアップしてもらったほうが早そうね。
もうちょっと常駐しとく。
0020162005/10/17(月) 03:21:03ID:???
納期遅れのいいわけ考えながら寝ちゃったのかな?
0021nobodyさん2005/10/17(月) 03:41:01ID:???
>>19
現段階のコードは前スレに。
参考にやり取りを列挙すると
前スレ http://pc8.2ch.net/test/read.cgi/php/1123777607/
Q >>922-925
A >>931,932
Q >>936-938
A >>950
Q >>954-956
A >>958
Q >>981,982-986 (現状の全ソース)

その要件を実装するのはすぐにできるけれど、
完成物を渡してしまっても766のためにはならないしな…
0022nobodyさん2005/10/17(月) 03:51:17ID:???
というかまず766は出来ないことは「できない」と言う事を学ぶべきだと思う
じゃないとまた同じ事繰り返す羽目になる
0023162005/10/17(月) 04:19:43ID:???
暇でネタもないので、とりあえず作ってみてる。
0024nobodyさん2005/10/17(月) 04:40:35ID:???
>>23
おまい、いいやつだな
00257662005/10/17(月) 04:40:42ID:???
>>21

レス有難うございます。
ヒントだけでも結構です。。後はもちろん自分でなんとか完成させるつもりです。

何卒宜しくお願いいたします。
0026nobodyさん2005/10/17(月) 04:45:09ID:???
>>17
それ、perlとは関係ないだろう。
meta refresh か JavaScript 使いなされ。
00277662005/10/17(月) 04:54:56ID:???
現状のソースをアップしますた。

http://www.nextftp.com/sentobeat/

皆さんに頼りっぱなしなのもわかっております。
ヒントだけでもいただければもちろん自分でもなんとかするようにします。

なんとか宜しくお願いいたします。。マジ泣
0028162005/10/17(月) 05:03:25ID:???
最初のファイルを編集してるので。
希望動作は最初のとおりでいいのよね?
0029162005/10/17(月) 05:12:34ID:???
アプロダの指定よろ
00307662005/10/17(月) 05:13:39ID:???
>>28

まじですか ほんとに有難うございます。。

はい。希望動作は >>18 に書いたものです。

今なんとか自分でもとりあえずエラー機能をつけようと思って
#入力チェック
if ($in{name} eq '') { &error('名前を入力してください',''); }

を頭につけてみたんですが、動きませんでした。。orz

何卒宜しくお願いいたします。
00317662005/10/17(月) 05:16:11ID:???
>>29

ありがとうございます。

http://other.free-uploader.com/up/ 

でお願いしますです。
0032162005/10/17(月) 05:30:28ID:???
とりあえずあぷ
ソース汚いままだけど保存はちゃんとされるはず。
読みにくかったfont size=2はスタイルに勝手に変えちゃったままですが。
0033162005/10/17(月) 05:32:40ID:???
やばっ、フォントの閉じたぐ全部消しちゃってるw
0034162005/10/17(月) 05:41:52ID:???
Lintで怒られまくったので、最低限もとのHTMLになるように戻しておきますた。
00357662005/10/17(月) 05:42:40ID:???
>>16

有難うございますです。マジで感謝です。

今試してみたんでうが、動かない。。泣
パーミッションもなおしますた。

はじめのはquestion_1.inc っていうふぁいると連動してたんですが、
作っていただいたものは関係ありますか?

question_1.cgiにいきなりアクセスですよね?
0036162005/10/17(月) 05:44:24ID:???
あ、1行目戻してないです。
usestrictでエラー追いやすいように一つにまとめました。
00377662005/10/17(月) 05:53:08ID:???
>>16

!!!!

でけてるー!!! 感謝です!

こんな朝方まで付き合ってくださって本当にありがとうございます。大泣
ソースみたらやっぱり全然違いますた。。


これは質問をquestion_1.tsvから読み込まなくても、index.html → post でquestion.cgiでももしかしていけますか?
0038162005/10/17(月) 05:57:15ID:???
質問を表示したソースをHTMLとして保存すれば出来ます。
perlの中の変数はかなり弄ったけど、フォームの部分は触ってません。
00397662005/10/17(月) 06:04:44ID:???
>>16

わかりましたです!やってみますです。
本当に有難うございます。

あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。)

あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか?

これで最後の質問です。。ご指導おねがいできませんでしょうか?
00407662005/10/17(月) 06:16:25ID:???
>>16

すませんです。。せっかく作っていただいたのですが、

1人目の名前: name1
その人の1〜3問目の回答番号: hoge1, hoge2, hoge3,
1〜3問目の正解番号: anser1,anser2,anser3

2人目の名前: name2

とすると

name1、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)
name2、hoge1, hoge2, hoge3,(改行)
”空欄”,anser1,anser2,anser3(改行)

になってませんでした。。。泣

hoge1,anser1(改行)
hoge2,anser2(改行)


になってました。。もう一度みてもらえませんでしょうか、、再度大泣
0041162005/10/17(月) 06:23:47ID:???
40をみてないときの39への回答
いつのまにか名前入力とか増えてたのね。

>あと名前をcsvに書き出したいんですが、$in{name}で書き出せるのでしょうか?(配列は自力でやりますです。)
フォームで<input type="text" name="name" value="">としていれば$in{name}に入る。

>あとその名前が入っていなかったら、エラーにしたいんですが、さっき入れた if ($in{name} eq '') { &error('名前を入力してください',''); } じゃだめでしょうか?
cgi-lib.plでのエラー表示用はCgiDie。CgiErrorでもいいけどどっちがいいとかは忘れた。
unless ($in{name}) { &CgiDie('名前を入力してください');}

とりあえず、ヒキなおいらに頼るような仕事は今後受けないようしましょうね。
昔、友達に頼まれたCGIが、これによく似てたから作ってみただけですので。
↑これも、ただ働きだったけど。
00427662005/10/17(月) 06:36:14ID:???
>>16さん

レス有難うございます。やってみますです。
はいです。今後出来ない仕事は請けないです。(絶対)

>>40 の内容をいただいたソースもとにいじってみたんですけど
やぱりエラーでした。。

# CSVへの書き出し
open (CSV , '>>file.csv');
flock (CSV,2);
print CSV join(',', $in{name}, $in{'Q'.$i}), "\n";
print CSV join(',', '', $array[1]), "\n";
flock (CSV,8);
close (CSV);


0043162005/10/17(月) 06:36:39ID:???
>>40
こゆこと?

my$data;
my@q1;
my@q2;
for (my$i = 1; $i <= @question; $i ++) {
my@array = split("\t", $question[$i - 1]);
push(@q1, $in{'Q'.$i});
push(@q2, $array[1]);
}
$data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n";

正解を保存する理由もよく分からないままなんですが。

あと、選択する問題が4つ目とか増えるなら36行めを
for (my$s = 1; $s <= (@array - 2); $s ++) {
にしないとだめです。
00447662005/10/17(月) 06:46:20ID:???
>>43

はっ!! できてる!
有難うございますー!! (泣きっぱなし)

名前は今EUCなので、excel開けたときに文字化けすてるんですが、
こいつをcsvに書き出すときに直すソースってありますでしょうか?
(ほんとにこれで最後でございます。。)
00457662005/10/17(月) 06:53:52ID:???
unless ($in{name}) { &CgiDie('名前を入力してください');}

をrequire "cgi-lib.pl";の後に挿入したら、名前しれているのに
でっかく 名前を入力してください て出ます。。

いれるとこ間違ってるのかな?
0046162005/10/17(月) 06:56:07ID:???
CSV 【カンマ区切り】
読み方 : シーエスブイ
フルスペル : Comma Separated Values
別名 : コンマ区切り

データの保存形式のこと。文字コードの指定はない。
エクセルはShift_jis限定だっけ?
メモ帳じゃないテキストエディターで変換保存すれば読めるはず。
保存時からShift_jisにしたいのならコード変換の処理が必要。

というか、ラジオボタンで値が数字だけだからいらなかったのに、テキストフォームつけるなら、Jcodeとか必要よ?

>>45
&ReadParse;の後
00477662005/10/17(月) 07:08:46ID:???
>>46

jcode.pl 入れますた。

下のコードをどっかにいれたりしたらokだったりしますか?


# jcode.plを用いたコード変換
require 'jcode.pl';

open READ, '<sjis.txt';
open WRITE, '>euc.txt';
while(my $data = <READ>){
jcode::convert(*data, 'euc');
print WRITE $data; }
close WRITE; close READ; exit;
0048162005/10/17(月) 07:17:18ID:???
なんかもう設計とかあってないようなので、
先頭で
require 'jcode.pl';

さっき変えたところで
$data = $in{name}.','.join(',', @q1)."\n".','.join(',', @q2)."\n";
jcode::convert(\$data、'sjis');
# CSVへの書き出し

というかエクセルは文字コード固定なの?
OOoしか使ってないからエクセルのことは知らないよ。
0049nobodyさん2005/10/17(月) 07:31:39ID:???
なんていうか…
2ch外でやってもらえません?
00507662005/10/17(月) 07:49:53ID:???
>>16さん

長い間ほんとにお手数おかけしました。
無事完成いたしましたです。

本当に感謝です。たすけていただいて本当にうれしくて泣きそうでした。

有難うございました。

これから教えていただいたことを無駄にしないように自分で勉強かさねていきますです。



>>49

すいませんでしたです。
0051nobodyさんNGNG
めずらしくスレ進行が速いから、荒らしかと思いきや、、、、ある意味荒らしだった。。
0052162005/10/17(月) 07:53:59ID:???
お疲れさん。

次の質問どぞー
0053nobodyさん2005/10/17(月) 08:09:02ID:???
766と16のおんぱれ・・・初めてこんな個人スレ見ました。
0054nobodyさん2005/10/17(月) 08:39:52ID:???
結局766って仕事がどーとか言うより何一つ知らない上に検索すら出来ない池沼じゃねぇか
0055nobodyさん2005/10/17(月) 09:18:14ID:???
次の仕事がきたらまた愛の交換日記がはじまるんだろうか...
0056nobodyさん2005/10/17(月) 10:19:11ID:???
丸投げスレかと思った。
0057nobodyさん2005/10/17(月) 10:41:45ID:???
>>16は乙だが、正直放置して欲しかった
今後766みたいなのが増えると思うとウンザリする
0058nobodyさん2005/10/17(月) 13:09:39ID:???
>766だけでなく>16もウザ。
二度と来ないでくれ。
0059nobodyさん2005/10/17(月) 17:49:53ID:???
戦いは終わった……だが…それは勝利ではなかった……
0060nobodyさん2005/10/17(月) 18:40:37ID:???
「仕事請負スレ」でも作って、766みたいなのは
そこに誘導(隔離?)するのがいいかもね。
0061nobodyさん2005/10/17(月) 19:11:36ID:???
■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/

ここに誘導しとけばよかったね
0062nobodyさん2005/10/18(火) 00:10:47ID:aW0OtyWy
質問です。現在FreeBSD上で、マニュアルページをHTMLに変換するCGIを書いていて、文字化けに困っています。
プログラム名は test.cgi です。手元で、% ./test.cgi > log として、出力されたログを見ると、きちんと
EUC-JPで出力されているのですが、ブラウザでアクセスしたり、fetch コマンドでアクセスしたり、telnet で
直接WebServerと話したり、とにかくApache を通すと、日本語の部分が、&xxx; と、文字実体参照の形に
なってしまいます。どうすれば文字化けを無くせるでしょうか。

(余計な部分を切り詰めた)プログラムを貼ります。

#! /usr/local/bin/perl -w
binmode(STDOUT, ":encoding(euc-jp)");
$filename= "/usr/local/man/ja/man3/strlen.3.gz";
$command = "gzcat $filename | /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP";
open(PIPE, "-|:encoding(euc-jp)", "$command") or die;
@html = <PIPE>;
close(PIPE);
print "Content-type: text/html; charset=euc-jp\n\n";
for $text (@html) {
  print $text;
}
0063622005/10/18(火) 00:12:05ID:aW0OtyWy
>>62 の続き。

コマンドライン上で ./test.cgi > log とした時の、ファイル log の中の一部分。
<a href="#名称">名称</a><br>

WebServer にCGIを起動させて結果を得た場合の、上と同じ部分。(アンド記号はわざと全角にした。)
<a href="#&Igrave;&frac34;&frac34;&Icirc;">&Igrave;&frac34;&frac34;&Icirc;</a><br>

環境。
OS: FreeBSD 5.4-RELEASE i386
WebServer: Server version: Apache/1.3.33 (Unix)
Perl: This is perl, v5.8.7 built for i386-freebsd-64int
0064nobodyさんNGNG
http://www.jp.freebsd.org/QandA/HTML/1544.html
0065nobodyさん2005/10/18(火) 00:27:48ID:aW0OtyWy
>>64
HTMLにするのはあきらめて、Plain text で我慢しろ、っていう意味ですか?
0066nobodyさん2005/10/18(火) 03:27:49ID:???
>>65
ちゃんと読めよ。
0067nobodyさん2005/10/18(火) 03:43:48ID:???
>>62
いちいちCGIで出力するより、htmlで吐いてアップした方が良いとは思うが・・・。

コマンドラインとApacheで動作が異なる場合はまず環境変数を疑う。
とりあえず2行目あたりに

$ENV{'LANG'} = 'ja_JP.eucJP';

を挿入。これで大丈夫だと思う。確かめてないけど。
0068672005/10/18(火) 03:47:18ID:???
>>65の件は今回の場合関係ない。
groffが吐いてる時点で実態参照になってると思われ。
0069nobodyさん2005/10/18(火) 13:57:42ID:???
PealでCGIのちょっとした掲示板を作っているんですが、
フォルダの中身を全て消す処理というのはどうすれば良いのでしょうか?
ファイルの場合は @Test=''; これだけで消せますが、
フォルダの中身全てを消去する方法が判らず製作が滞っています。
何方かお知恵をお貸し下さい。お願いします。
0070nobodyさん2005/10/18(火) 14:03:18ID:???
Pealで掲示板は作れまい
0071nobodyさん2005/10/18(火) 14:18:33ID:???
>>69
フォルダにあるファイル一覧を取得して消すとか、
シェルコマンド使うとかいろいろあるお。
0072nobodyさん2005/10/18(火) 14:29:41ID:???
> ファイルの場合は @Test=''; これだけで消せますが、

ここにツッコミを入れる奴はおらんのか?(笑)
0073nobodyさん2005/10/18(火) 14:48:42ID:???
フォルダを消すときは
@Test = `del c:\*.*`;
とするんじゃなかったっけ?
0074nobodyさん2005/10/18(火) 15:15:57ID:???
うーん・・・・・  何からツッコンでいいのかわからん
0075nobodyさん2005/10/18(火) 15:41:11ID:???
質問の内容からして、>>69が掲示板スクリプトを作れるとは思えん。
また>>16が降臨して、>>69の掲示板スクリプトを全部作ってやればいい。
但し、↓のスレでやってほしい。

■こんなCGI作ってください■
http://pc8.2ch.net/test/read.cgi/php/1102980903/
0076nobodyさん2005/10/18(火) 17:06:06ID:???
とりあえず rm -rf / でもしとけ。
0077nobodyさん2005/10/18(火) 17:11:13ID:???
Web サーバの権限だと初手からコケそうだが。
0078nobodyさん2005/10/18(火) 21:16:25ID:???
>>67 さん。
> とりあえず2行目あたりに
> $ENV{'LANG'} = 'ja_JP.eucJP';
> を挿入。

で、うまく行きました。

%gzcat /usr/local/man/ja/man3/strlen.3.gz \
  | env -i /usr/local/bin/groff -man -Thtml -dlang=ja_JP.eucJP

と、環境変数無しで実行すると、groff が実体参照を吐くことも確認できました。
ありがとうございました。
0079nobodyさん2005/10/18(火) 22:15:08ID:???
レンタル鯖がaaacafeでmySQLは使えるのですが、鯖にDBIがないようなのです。
レンタル鯖のCGIで接続したい場合、どういった方法を取ればいいのでしょうか。
CGI自体はローカル起動、ローカルのMySQL、ローカル起動、レンタル鯖のMySQLで正しく動くので、スクリプト上のエラーではないと思います。
0080nobodyさん2005/10/18(火) 22:25:23ID:???
PerlのCGIで、非常に簡単なコメント保存CGIをつくろうとしてます。

htmlの方で、

<form method="post" action="****.cgi">
コメント<Input Type="text" Name="com" Size="**" Maxlength="**">
<INPUT TYPE="image" SRC="img/send.jpg" align=right>
<form>

としておいてテキストを書込み、SENDボタンを押すと、CGIが動作しコメントがログに書込される、というものです。

でperlのCGIの方で(既存のCGIを自分で修正)

#!/usr/bin/perl -w
use CGI;
変数宣言
$form = new CGI;
$com = $form->param('com');
open (TEXTFILE,">>./log.txt")
print TEXTFILE $com;
print TEXTFILE "\n";
close (TEXTFILE);

としてるのですが、どうにもうまくいきません。
どうすればうまくいくかヒントでもいただけませんでしょうか?


0081nobodyさん2005/10/18(火) 22:27:43ID:???
>>80
「変数宣言」がコメントになってないとか
あと、何がうまくいかないのか不明。
500エラーなのかファイルに保存されないのか、詳しく書くように。
0082802005/10/18(火) 22:32:41ID:???
>81
すみません。
インターナルサーバエラーを起こして動かないという状況です。

ちなみに変数宣言は
my ($form, $com);
としています。
0083nobodyさん2005/10/18(火) 22:41:45ID:???
>80
ヒント:Content-type(たぶん)
0084792005/10/18(火) 23:10:34ID:???
すいません、ム板のほうがよさげなので移動します。
0085nobodyさん2005/10/18(火) 23:16:01ID:???
>>84
早速マルチポストかよ。

来ないで下さい。
0086nobodyさん2005/10/18(火) 23:42:22ID:???
マルチポストの意味ちげーよ
0087nobodyさん2005/10/19(水) 00:31:56ID:???
>>80
use CGI::Carp qw(fatalsToBrowser);
おまじないで二行目に貼って。
0088nobodyさん2005/10/19(水) 00:35:04ID:???
>>69

unlink(glob("dir/*"));

多分ね。
0089nobodyさん2005/10/19(水) 00:52:35ID:???
それより「ちょっとした掲示板」で「フォルダの中全消し」という仕様が
何に使われるのかが非常に気になるのだが・・・
0090nobodyさん2005/10/19(水) 01:16:52ID:???
>>89
スレまたはレス別にログファイルが分かれていて、ログのリセットとかじゃなかろうか
0091nobodyさん2005/10/19(水) 17:01:02ID:mMzWKjOm
先生質問です。
指定したディレクトリ内にある、ファイルとディレクトリの名前、
そしてそれらのパーミッションを取得して表示させるCGIを作成してます。
stat でファイルのパーミッションは上手く取得できるのですが、
ディレクトリのパーミッションは 000 が返ってきます。
どうやったらディレクトリのパーミッションも取得できますか?

該当部分の今のソースはこんな感じです。
$dir ="cgi-bin";

opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$permis";
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uha:$per<br>\n";
}
}
closedir(DIR);
0092nobodyさん2005/10/19(水) 17:13:00ID:mMzWKjOm
う、ソース訂正です。

opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$uhaha";
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uhaha:$per<br>\n";
}
}
closedir(DIR);
0093nobodyさん2005/10/19(水) 17:18:56ID:???
>>91-92
こちらの環境ではちゃんと表示されるよ
問題は他のところにあると思う

関係ないけれど、
> $per = substr((sprintf "%03o", $st[2]), -3);
ここは
$per = sprintf "%03o", $st[2] & 0700;
の方が良いんじゃないかと思ったり
0094932005/10/19(水) 17:20:55ID:???
うわ、全角スペースとマスクの値の二重ミスした・・・スマソ。正しくは
$per = sprintf "%03o", $st[2] & 0777;
0095nobodyさん2005/10/19(水) 17:36:12ID:???
>>91
パーミッションを000にすることは普通ないだろうから、
statに失敗している可能性があるな。

opendir(DIR, $dir);
while (defined($uhaha = readdir(DIR))) {
if ($uhaha ne '.' && $uhaha ne '..') {
@st = stat "$uhaha";
if (@st > 0) {
$per = substr((sprintf "%03o", $st[2]), -3);
print "$uhaha:$per<br>\n";
} else {
print "$uhaha:stat失敗($!)\n";
}
}
}
closedir(DIR);

とでもして試してみたらどうだろうか。
0096nobodyさん2005/10/19(水) 17:57:17ID:???
あれ、よく読んだらreaddirで返ってくるのはパスじゃなくてファイル名だから・・・
stat "$dir$uhaha"
じゃなかろうかカレントディレクトリでテストしちゃったから気づかなかった
0097912005/10/19(水) 17:57:31ID:mMzWKjOm
>>93-94
ありがとうございます。
後述しますが、こちらの環境のせいかもしれません.....
あと、$per = sprintf "%03o", $st[2] & 0777; の方が何故良いのか、
パッと見てまだわからないので、後で調べてみます。

>>95
やってみました。
全部「stat失敗(No such file or directory)」でした。

そして、なんらかの原因でうまく情報を取得できていないみたいだったんで、
情報を取得したいディレクトリの中に、このスクリプトを放り込んで実行した所、
完璧に表示されました。
上位でも下位でも、階層が違うディレクトリを指定すると、
上手く情報が取得出来ないようです。
なんでだ...
0098912005/10/19(水) 18:00:40ID:mMzWKjOm
>>96
全て謎がとけましたw
その通りですね。
テンパってるとダメですね.....ありがとうございました!
0099nobodyさん2005/10/19(水) 23:56:03ID:???
# ID,NAME,ADDRESS,TEL
0,yamada,A32,333
1,tanaka,B22,555

上記のようなCSVファイルから1行ずつ読み込んでハッシュに入れたいのですがどのように
すればいいのでしょうか。問題点がCSVの一行目をカンマごとにばらしたのをハッシュのキー名
にして2行目からをそれぞれの値として入れなくてはいけないのです。
モジュールも使えないのでよりどうしたらいいのかわかりません。
$filename="test.csv";
%arr2 = &COUNT($filename);
foreach $value (values %arr2) {
print "$value\n";
}
sub COUNT{
open (IN, $filename)or die "$!";
while(<IN>){
$buff = $_;
chomp($buff);
@buff = split(/,/, $buff);
%arr2 =();
$arr2[] = @buff[];
$arr2[] = @buff[];
$arr2[] = @buff[];
close IN;
return %arr2;
}
}
whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。
ずっと堂々巡りで悩んでしまいました。
0100nobodyさん2005/10/20(木) 00:29:03ID:???
>>99
>whileの前に先に一行だけ読み込んでキーを作ってしまうべき何でしょうか。

それが一番ラクだと思うけど。むしろ何故ソレを実行しないのかわからん。
0101nobodyさん2005/10/20(木) 00:32:14ID:???
俺は

@buff = split(/,/, $buff);
%arr2 =();
$arr2[] = @buff[];
$arr2[] = @buff[];
$arr2[] = @buff[];

の意味が分からん。俺の知識不足。つまり

@buff = split(/,/, $buff);
%arr2 =();
$arr2[0] = @buff[0];
$arr2[1] = @buff[1];
$arr2[2] = @buff[2];

ってことなの?
0102nobodyさん2005/10/20(木) 00:36:48ID:???
いや、普通は

$arr2[0] = shift(@buff);
$arr2[1] = shift(@buff);
...

だろうな。そもそもハッシュ使いたいっぽいからこれでも違うけど。
てか今はどうしていいかわからなくなってる状態だと思われ。
0103nobodyさん2005/10/20(木) 00:36:51ID:???
>>99
これでいいのか分からんが。

count('test.csv' => \%data) or die 'Failed to count';
print "$_: ", join(' / ', @{$data{$_}}), "\n" for sort keys %data;

sub count {
  -f (my $file = shift) or warn('No such file'), return;
  open IN, '<' . $file or warn($!), return;

  my $hash = shift;
  my @key = <IN> =~ /\w+/g;

  while (<IN>) {
    chomp;
    my $i = 0;
    push @{ $hash->{$key[$i++]} }, $_ for split /,/;
  }

  close IN;
}
0104992005/10/20(木) 00:47:28ID:???
一行だけ先に読み込む案は書いてる途中で思いついたからです。
この次の段階としてCSVファイルの任意の部分だけを読み込み、書き換えよう
にしなくてはいけないので、できるだけ汎用性を持たせた関数を作るよう心がけるように
との事なので、悩んでいました。

配列のところはそのようにするつもりです。whileでまわして配列をハッシュに移すのに
途惑っていて流れが整理できなくなっていました。

家の環境ではすぐに試せないのですが皆さんいろいろアドバイスありがとうございます。
0105nobodyさん2005/10/20(木) 00:53:29ID:???
>>104
そんな時にはActivePerl+AnHTTPDのPerlCGI再現セットがお勧め。
0106992005/10/20(木) 01:20:15ID:???
ぐぐって試してみます。情報どうもです。
0107nobodyさん2005/10/20(木) 01:46:11ID:???
>>99
my @data;

open(IN, $file) or die $!;

(my $key = <IN>) =~ s/^#\s*|\n//g;
my @keys = split(/,/, $key);

for (<IN>) {
  chomp;
  local %_;
  @_{@keys} = split(/,/);
  push( @data, { %_ } );
}

close(IN);

---
結果、以下のように代入される。

@data = (
  { 'ID' => '0', 'NAME' => 'yamada', 'TEL' => '333', 'ADDRESS' => 'A32' },
  { 'ID' => '1', 'NAME' => 'tanaka', 'TEL' => '555', 'ADDRESS' => 'B22' }
);

アクセスは、
print $data[0]{NAME}; # yamada
print $data[1]{TEL}; # 555
0108nobodyさん2005/10/20(木) 02:51:02ID:???
> モジュールも使えないのでよりどうしたらいいのかわかりません。
と書いてあるのは分かってるが、あえてCPAN モジュール版を。CSVって、
カンマで区切ってるだけと思ってる人も多いけど、泥くさいフォーマットだよ。

use strict;
use warnings;

use IO::File;
use Text::CSV;

my $parser = Text::CSV->new();

my $in = IO::File->new('test.csv', 'r')
or die('test.csv: ' . $!);

(my $field_names_line = <$in>) =~ s/^#\s*//;
$parser->parse($field_names_line)
or die('field keys are not found');
my @field_names = $parser->fields();

my @list = ();

while (1) {
my $row = $parser->getline($in);
last unless 0 < @$row;

my %hash = ();
@hash{@field_names} = @$row;

push(@list, \%hash);
}
@list = (...>>107 と同じ内容...);
■ このスレッドは過去ログ倉庫に格納されています