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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
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 と同じ内容...);
0109nobodyさん2005/10/20(木) 17:31:51ID:jR9yJZEc
質問です。
linuxサーバでパスワードの変更の際(passwdコマンド)に、
推測されやすいと判断をした場合、再入力を求めるようにするプログラムをperlで作る事は可能でしょうか?
可能な場合はどのような設置をすればよいのでしょうか?
0110nobodyさん2005/10/20(木) 19:47:09ID:???
>>109
単なる興味で聞くが、推測されやすいかどうかという判断を、どんな内容にする予定なの?
0111nobodyさん2005/10/20(木) 19:53:12ID:???
>>109
passwdコマンドにそのチェックをする機能を追加した
ようなものをperlで書いてもとのpasswdコマンドを
置き換えてしまうのが一番楽じゃないかと思われ。
0112nobodyさん2005/10/20(木) 20:01:43ID:???
>>111
そのようなものを >>109 が書けるか甚だ疑問な件。
0113nobodyさん2005/10/20(木) 20:31:40ID:???
>>109
可能。だが、その質問をしている時点で現在の>>109には敷居が高いだろう。

また、いくらシステム側で対処しても、
その手の脆弱性の根本部分はユーザーのセキュリティー意識にある。
「推測されにくいパスワードを使う」ことと教えてあげる方がよい。
0114nobodyさん2005/10/20(木) 20:45:15ID:jR9yJZEc
>>110
例えば、4桁未満は駄目とか、数字のみは駄目等です

>>112
それはpasswdコマンドを書き換えるのはどこを操作すればよいのでしょうか?
また、perlで無くてもっと簡単にかける方法は無いものでしょうか
(どのファイルをどのように書き換えたらよいか等)

>>113
全くその通りなんですけど、自分の今後の為にと思いまして。
01151102005/10/20(木) 20:59:52ID:???
>>114
> 例えば、4桁未満は駄目とか、数字のみは駄目等です

これって既に、生の passwd コマンドが実装している機能では?
同じ機能を Perl で再実装したいって思うのは自由だけどね。

とりあえず、passwd のマニュアルページとソースコードを読んでみることをお勧めします。
0116nobodyさん2005/10/20(木) 21:03:16ID:???
関係ないけど、 getpass() が欲しいことがよくある。
0117nobodyさん2005/10/20(木) 22:05:06ID:???
>>114
その質問レベルを見る限りではpasswdコマンドをどうこうしようとか
思う前に基本を勉強した方がよさそうだな...
0118nobodyさん2005/10/20(木) 22:29:24ID:???
>>117
同感
rootで動くためにはパーミッションに細工した上で実行時にIDを変えてやる必要があるが、
この方法を知らないようなレベルで作ろうとしてもセキュリティホールを作ってしまう危険の方が高いと思う…
0119992005/10/21(金) 00:50:33ID:???
質問なのですが>>107さんのソースを実行してみたところ
4つめのキーの部分が出てこないのはどうしてでしょうか?
少しソースを変えていますが、
スカラーで確かめてみるとハッシュのキーは4つ確保されているのにADDRESSの項目だけが
表示されません。よろしくお願いします。
0120nobodyさん2005/10/21(金) 01:18:14ID:???
>>119
>ハッシュのキーは4つ確保されているのに
じゃあそのキー名出してみ
01211192005/10/21(金) 01:28:01ID:???
表示は
print $data[3]->{ID};
print $data[3]->{NAME};
print $data[3]->{TEL};
print $data[3]->{ADDRESS};
のようにやっています。

4つ目のキーがうまくついていないのでしょうか。
0122nobodyさん2005/10/21(金) 01:35:25ID:???
>>121
たぶん改行コード。shift_jisで書いてない?
0123nobodyさん2005/10/21(金) 01:41:21ID:???
>>116
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_do_I_ask_the_user_for_a_pass

>>119-122
改行コードが原因なら

- (my $key = <IN>) =~ s/^#\s*|\n//g;
+ (my $key = <IN>) =~ s/^#\s*|\s*\z//g;

ASCII 互換なら文字コードは関係無い。
0124nobodyさん2005/10/21(金) 01:47:44ID:???
>>107のコードは>>99には難し過ぎやしないか?
結果を出すことよりも動作を理解するほうが先だと思うのだが。
0125nobodyさん2005/10/21(金) 01:59:13ID:???
いろいろありがとうございます。
改行コードかも知れません。最初の読み込みではずしてしまっているみたいなので。
いろいろ試してみます。
これとは別なcsvなのですがこちらの値は"yamada" のように"とタブでで区切っていていてこれを
=~ s/" //g;
ではずそうといろいろいじてるうちになってしまったみたいです。
こちらは今何とか自分で試行錯誤しています。
ありがとうございました。
0126nobodyさん2005/10/21(金) 02:39:27ID:???
>>123
修正サンクス。

あと、細かいけどこっちの方がよかった。展開が減るので。

-  push( @data, { %_ } );
+  push( @data, \%_ );

>>125
改行の取り扱い不足でした。sorry。

> これとは別なcsvなのですがこちらの値は"yamada" のように"とタブでで区切っていていてこれを
> =~ s/" //g;

tab 文字も \s でマッチするので

s/"\s*//g;

がおすすめ。
0127nobodyさん2005/10/21(金) 04:21:29ID:???
>>126
\%_ にするんだったら local %_; じゃないほうがよいのでわ。
Excelなら、クオーテーションは Perlメモ の CSV の項を読むといいと思う。
0128nobodyさん2005/10/21(金) 04:30:43ID:???
>>127
local $_ は単に global な %_ を壊さないようにしている
のだけど(このコードだと不要だけど)、
それ以外にデメリットってあります?
0129nobodyさん2005/10/21(金) 04:32:11ID:???
正:local %_ は
01301282005/10/21(金) 04:40:25ID:???
というか、>>107 の場合、local をつけないと、以前 push した
値を上書きしまいますね。


まぎらわしいので my 変数の方がいいのでは、ってことですね。
0131nobodyさん2005/10/21(金) 15:03:57ID:???
sousou
0132nobodyさん2005/10/21(金) 15:24:58ID:???
local %_ って名前を考えるのが面倒だっただけだろ?
0133nobodyさん2005/10/21(金) 17:35:12ID:???
しつもんです。
アンケイートをつくっているのですが、

【hoge.html1】
<FORM ACTION="hoge1.cgi" METHOD="post">→送信→log1
【hoge.html2】
<FORM ACTION="hoge2.cgi" METHOD="post">→送信→log2

↓
【hoge.html1】
<FORM ACTION="hoge.cgi" METHOD="post">→次へ→この分をまずlog3へ
【hoge.html2】
<FORM ACTION="hoge.cgi" METHOD="post">→送信→log3→おわり

てしたいんだけど、(2つのフォームの内容繋げて一気に送ってlog残したい)
どんなソース書けばいいですか?




0134nobodyさん2005/10/21(金) 17:38:17ID:???
そこはかとなくスレ違いのような気がするがいかがか?

javascript でも勉強したら?
0135nobodyさん2005/10/21(金) 20:29:51ID:???
>>133
一意のIDをcookieか何かで発行する、いわゆる「セッション」を使うのが普通だが、
htmlで、と言われると困る。mod_rewriteでも使って誤魔化すか。
で、言語は何よ?
0136nobodyさん2005/10/21(金) 20:33:21ID:???
ああ、ここにいるからperlに決まってるのかorz 最後の一文はスルーしておいて
0137nobodyさん2005/10/21(金) 20:49:56ID:???

=~s/\Eアンケ(イ|ー)ト\Q/アンケ$1ト/g;
0138nobodyさん2005/10/21(金) 20:55:34ID:???
QとE逆だろw
0139nobodyさん2005/10/21(金) 21:01:40ID:???
それ以前にマッチしないじゃんw

>>133
元のhoge1.cgiとhoge2.cgiはコピーして2つにしただけでしょ?
1のクエリはすぐに処理せず
2のフォームのhiddenにでも入れておいたら?
0140nobodyさん2005/10/21(金) 21:03:44ID:???
たしか JSスレの最近の過去スレにあったぞ
0141nobodyさん2005/10/22(土) 15:11:53ID:m3HcshJv

フォームで入力後、WEBに以下のような感じでフィルに書き出すんですが


if(open(FILE,">>hogehoge.log")) {

$record .= $in{'name'}."\t";
$record .= $in{'kana'}."\t";

                     jcode::convert(\$record,'sjis');

print OFILE $record;
close(OFILE);

 

 name が空白でないかを書き込み前にチェックしたいのですが、うまく動きません。

以下の記述を入れるかと思いますが、どの行に入れたら動作するでしょう?

if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください"); }

以下のエラーが出ます。

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, [no address given] and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

よろしくお願いします。<(_ _)>
0142nobodyさん2005/10/22(土) 15:15:32ID:???
>>141
>>87
0143nobodyさん2005/10/22(土) 15:27:16ID:G1Q0Ugqh
OFILE なのか FILE なのかはっきりさせよう。
0144nobodyさん2005/10/22(土) 15:33:15ID:m3HcshJv
>>142

エラー行が表示されました。ありがとうございます。<(_ _)>

>>143

OFILE と FILE の違いがよくわかっておりません。 ご教授下さい <(_ _)>
0145nobodyさん2005/10/22(土) 15:35:19ID:m3HcshJv
>>142

Undefined subroutine &main::errexit called at /virtual/hogehoge.cgi line 18.


追記した↓この行があかんみたいです 
if ($FORM{'name'} eq "") { &errexit("お名前は必ず入力してください"); }


0146nobodyさん2005/10/22(土) 15:43:00ID:???
perlによるプログラミングを始めたところです。
知識レベルとしては、Cで普通にプログラムは書けますが、
perlは本当に始めたばかりです。

<質問事項>
基本の基本ということで以下のコードを書いたのですが
画面上に何も表示されません。(エラー等も表示されません)
printは画面(標準出力)に文字列を表示させると思っています。
コードもしくは認識に誤りがあるのでしょうか?

<コード>
■test.cgi
#!/usr/bin/perl

print "Program start\n";
print "Program end\n";

■実行方法
./test.cgi
■ファイルの属性
-rwxrwxrwx 1 root www 129 10月 22 15:37 test.cgi
■whichの結果
which perl
/usr/bin/perl
0147nobodyさん2005/10/22(土) 15:54:11ID:???
> 知識レベルとしては、Cで普通にプログラムは書けますが、
・・・
■ このスレッドは過去ログ倉庫に格納されています