Perlコーディング初心者質問スレ Part 59
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/02/16(月) 11:42:29ID:gvPTpodw【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
while行から上に向かって
exit;
を入れてみてデバグしてみるとか。
あと~の文字コードとかとか。
0702681
2009/06/18(木) 23:16:28ID:???>>699さんの教えてくれた
$data2 =~ s/\bred\t//g;
が僕自身も一番わかりやすかったので使わせてもらってるんですが
エラーはこの文に対してだけ出てまして、その内容が
Use of uninitialized value in substitution (s///) at data_split line 13, <IN1> line 5788.
Use of uninitialized value in concatenation (.) or string at data_split line 15, <IN1> line 5788.
てな感じになってるんです。
ちなみに、line15は
print OUT1 "$data\n";
です。
文字コードも大丈夫なはずなんですが、、、
0703nobodyさん
2009/06/19(金) 00:34:12ID:???スクリプト全部晒せばいいのに。
0704nobodyさん
2009/06/19(金) 00:36:23ID:???0706nobodyさん
2009/06/19(金) 09:11:31ID:???0707nobodyさん
2009/06/19(金) 11:07:46ID:???0708nobodyさん
2009/06/19(金) 14:19:21ID:???威張ってはいない。
しょせんは他人事だがそれでも、いつまでも問題が解決しないことに
焦りと苛立ちと好奇心を感じている。
0709nobodyさん
2009/06/19(金) 14:48:13ID:???今、会員限定のサイトに電話番号 (ハイフン無し) によるログインをさせています。
家電話が無い人は携帯番号というふうにさせています。
認証自体は Basic 認証を使い、サイトの中で 「○○さん、こんにちわ」 といった具合で名前を表示させています。
(パスワードファイルは Shift_JIS、HTML は euc-jp です)
my $username; my $userid; my $usertel; my $userktai;
open(INFH, '<', $config->{'file_passwd'});
while(my $line = <INFH>){
my $utf8 = decode('shiftjis', $line);
my $eucjp = encode('euc-jp', $utf8);
chomp $line;
($userid, $username, undef, $usertel, $userktai) = split(/\t/, $eucjp);
$usertel = $userktai if !$usertel; # 家電話が無ければ携帯番号がユーザー名
last if $ENV{'REMOTE_USER'} eq $usertel;
}
close(INFH);
上記でスクリプトを書くと、家の電話番号がある人はちゃんと名前が表示されますが、携帯しか無い人を $usertel に代入させると判定できません。
ユーザー名がパスワード一覧のファイルに記述されているのは確認しています。
last if $ENV{'REMOTE_USER'} eq $usertel;
の行を
last if $ENV{'REMOTE_USER'} == $usertel;
にすると判定は上手くいき、理想どおりの動作はします。
しかしパスワードが 「数値」 というのになんか気持ち悪い感じがしますし、なぜ eq で判別できなくて == で判別できるのでしょうか?
書き方が悪いというのがあれば指摘していただきたく書き込みしました。
print によるデバッグでパスワードを出力させてみたところ、$ENV{'REMOTE_USER'} と $usertel が一致する行を目視で確認しました。
0710nobodyさん
2009/06/19(金) 15:03:10ID:???末尾に改行がある
きみは目視で改行が見えるか?
0711nobodyさん
2009/06/19(金) 15:17:48ID:???0712nobodyさん
2009/06/19(金) 15:21:58ID:???0713nobodyさん
2009/06/19(金) 15:44:33ID:???ありがとうございました m(._.)m
0714nobodyさん
2009/06/19(金) 16:29:20ID:???読み込むデータには
"animal"と"plant"と"food"の3種類がランダムに並んでます。
「animal
plant
food
food
animal」
というようなのが5000個近く並んでいます。
ここから、animalについては"n"、
他の2つについては"m"という文字を出力を出したいんですが、
perlを最近始めたばかりなので、全然できません。
助けてください。
のせるのも恥ずかしいぐらいですが、
とりあえず、稚拙ながらも作ったプログラムを置いておきます。
while($line = <IN1>){
chomp;
if($_ eq "animal"){
print OUT1 "n\n"
} else {
print OUT1 "m\n"
}
}
0715nobodyさん
2009/06/19(金) 16:41:44ID:???0716nobodyさん
2009/06/19(金) 16:43:49ID:???0717nobodyさん
2009/06/19(金) 16:45:21ID:???にしてみたらどう?
IN1 とか OUT1 を見て思うんだけど>>681や>>702に心当たりはないか?
0718nobodyさん
2009/06/19(金) 16:53:48ID:???いっけね。これだから初心者わw
>>716
いろんなことやってたらごっちゃになっちゃって
直すの忘れてました。
$lineに直してもムリポでした、、、
>>717
うまくいきませんでした。
て言うてもエラーではなく、出力は最初のデータがfoodなのにも関わらず"m"と出て糸冬了。
心当たり?はわかんないす。
0719nobodyさん
2009/06/19(金) 17:12:43ID:???food なら m であってるんじゃないの?
それだけで終了するのはなぜかわからないけど。
修正後のスクリプトを見てみたい。
0720nobodyさん
2009/06/19(金) 17:16:51ID:???> $lineに直してもムリポでした、、、
おおかたchompを直し忘れたんじゃないか。
$lineで統一するんなら明示的に引数書かないと。
> て言うてもエラーではなく、出力は最初のデータがfoodなのにも関わらず"m"と出て糸冬了。
> 心当たり?はわかんないす。
animalのときn,他のときはmだからfoodでmがでて
終了なら正しい動作なんじゃねーの?
0721713
2009/06/19(金) 17:17:06ID:???while(my $line = <DATA>){
chomp $line;
if($line eq "animal"){
print "n\n";
}else{
print "m\n";
}
}
exit;
__DATA__
animal
plant
food
food
animal
原因は、$line に入れてるのに、chomp は $_ 対して行ってるから。
自分と似たようなミスですねww
0722714
2009/06/19(金) 17:26:50ID:???>>718での報告は完全に間違ってたので、もう一度チャンスをください。
望ましい出力が
animalからのn と
plant, foodからのmです。
>>721さんのやつでやってみると
5000行ほどあるうちの最初がanimalなのにnが出てきまして、
その1つで出力が終わってしまってます。
ご教授、よろしくお願いします。
>>719
>>721さんのをまんま使わせてもらったところ
上に書いたような出力になっちゃいました。
0723714
2009/06/19(金) 17:28:42ID:???foodlなのにnが出ちゃったんですw
ほんますいません。
0724713
2009/06/19(金) 17:35:12ID:???while(my $line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
0725nobodyさん
2009/06/19(金) 17:36:48ID:???原因はきっとキミがパニクってるからだと思う
0727714
2009/06/19(金) 17:46:28ID:???あ、大丈夫です。そこは消したんですが
>>722みたいな感じになっちゃったんです・・
>>725
確かにw
今日中にこれを何とか片付けないとだめなんで若干の焦りがありますよねw
0728nobodyさん
2009/06/19(金) 17:54:53ID:???0729714
2009/06/19(金) 17:56:40ID:???while($line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
て感じです。
出力は、nが1つ出ているだけです。
しかも、データの1行目はfoodなのでmが出てほしいんですが。。
0730nobodyさん
2009/06/19(金) 18:02:04ID:???print OUT1 "n: $line\n";
print OUT1 "m: $line\n";
0731nobodyさん
2009/06/19(金) 18:03:50ID:???とりあえず、chompを外して
条件を
$line =~ /animal/
に変えて試してみれば?
あと、chompの後でも前でもいいけど、$lineをダンプ
0732719
2009/06/19(金) 18:06:13ID:???ファイルの open, close がうまくいってないとか?
# test.pl
use strict;
open IN1, '<', 'data_in.txt' or die $!;
open OUT1, '>', 'data_out.txt' or die $!;
while(my $line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
close OUT1;
close IN1;
# data_in.txt
food
animal
plant
food
animal
#data_out.txt
m
n
m
m
n
0733nobodyさん
2009/06/19(金) 18:13:59ID:???animal
なのか?
animal
とかじゃないよね?
0734nobodyさん
2009/06/19(金) 18:16:17ID:???その前後が間違えてるとしか思えない
スクリプトデータを頂戴
記述間違いから何から何まで直してやる
0735nobodyさん
2009/06/19(金) 18:28:26ID:???use warnings;
open IN1, '<', 'testdata.txt';
open OUT1, '>', 'results.txt';
while(my $line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
close OUT1;
close IN1;
5000個のデータ作ってやってみたけど、ちゃんと動くし、簡単なチェックスクリプトで確認したけど、
animal なのに m になってしまうなんてのは無かった。
キミの組み方の問題かと思われ。
0736714
2009/06/19(金) 18:30:29ID:???はい、一番処理しないといけないデータはanimalとかじゃなくて別の言葉です。
このanimalとかは、練習用で使ってたデータです。
下に生のデータを掲載させてもらいます。
>>734
スクリプトデータって読み込んだデータのことですよね?
animalとかじゃなくて、実際に処理したいデータはこんなのです。
NonWord
NonWord
NonScriptWord
NonScriptWord
NonWord
NonWord
NonWord
NonWord
ScriptA
ScriptC
こんなのが5000ほどあります。
この中のNonWordについてのみ"n"と返してほしいんです。
書いたプログラムは>>729から進歩してません。
0738714
2009/06/19(金) 18:56:47ID:???use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use open IN => ":utf8";
use open OUT => ":utf8";
open(IN1, "<data_in.txt");
open(OUT1, ">data_out.txt");
while(my $line = <IN1>){
chomp $line;
if($line eq "NonWord"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
close(IN1);
close(OUT1);
これが全貌です。
やはり、生のデータの方を扱っても1行目のNonWordに対してmと出るだけです。
つまり出力はm一文字しか出てない状態です
0739nobodyさん
2009/06/19(金) 18:59:34ID:???まずUTF-8のBOM付きファイルかどうか確認しろよ
0740714
2009/06/19(金) 19:08:30ID:???今ツレに言われたんですが
「その作業、エクセルでできんじゃね?」て言われて、やってみたらできちゃいました。
たくさん協力してもらったのに、ほんと、すいません。
0741nobodyさん
2009/06/19(金) 19:10:25ID:???隠された部分が無ければの話だが。
0742nobodyさん
2009/06/20(土) 04:13:04ID:???全員初心者を自称しているわけだが(初心者質問スレだから当たり前ではあるが)、
すると恐らく、参考にした入門書・入門サイトも一緒なのだろう。
いったいどこが出自なんだろうな?
0743nobodyさん
2009/06/20(土) 08:57:48ID:???0744nobodyさん
2009/06/20(土) 09:08:58ID:???IN1 は5000行ばかしのファイルらしいしコードを見せたがらない
という入門サイトを参考にしてるんだろう
0745nobodyさん
2009/06/20(土) 22:26:45ID:???0746nobodyさん
2009/06/23(火) 11:24:34ID:???それをコピペして動かしたけど、ちゃんと動くよ
まだ隠してるトコあんじゃね?
それかデータファイルそのものを、どこかにアップしてみてよ
データファイルを見ないと、もう解決できんよ
0747nobodyさん
2009/06/24(水) 05:36:20ID:???もう終わった話なんだよ
落第すりゃいいのにね
0748nobodyさん
2009/06/24(水) 09:31:28ID:???0749nobodyさん
2009/06/24(水) 17:47:13ID:???以下のコードをApache2.2のlocalhostで実行すると
一度起動するたびに「てすと」と2回書き込みされてしまいます。
どうしてもコーディングにミスが見当たらないんですが
環境が悪いんでしょうか?
対処法ありましたら教えてください
#!/usr/bin/perl
use strict;
use encoding 'utf8',STDOUT=>'shift_jis';
open(ADD,">>",'./txt.txt') or die;
print ADD 'てすと'."\n";
close(ADD);
0750nobodyさん
2009/06/24(水) 17:59:03ID:???0751nobodyさん
2009/06/24(水) 18:01:30ID:???open(ADD,">./txt.txt") or die;
これでもだめ?
0752nobodyさん
2009/06/24(水) 18:07:19ID:???そうすると何度実行しても一行だけになります。
普通ですねw
ブラウザのキャッシュ消したり、プロクシ見直したりしてもだめでした。
httpd.confにも異常なしです。
最近デュアルディスプレイにしたんですけど関係ないですよねぇ
0753nobodyさん
2009/06/24(水) 18:22:10ID:???2回リクエストされてればブラウザが悪さしてる
そうやって可能性を推測していけ、サルじゃなければできる
0754nobodyさん
2009/06/24(水) 18:30:03ID:???0755nobodyさん
2009/06/24(水) 18:48:09ID:???Apacheのアクセスログも2重になってましたorz
3種類のブラウザで試しましたが同じでした。
どこら辺が悪いかわかるでしょうか?
>>754
そこら辺は省略してますが問題ない内容です。
ヘッダと少しのテキストをprintしてます。
0756nobodyさん
2009/06/24(水) 18:49:50ID:???0757nobodyさん
2009/06/24(水) 19:02:18ID:???ab -n 1 -c 1 http...
'ab'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
o...rz
今更ですがerror.log見たら
utf8フラグをprintしてるとか書いてありました。
ダメなんですか
0758nobodyさん
2009/06/24(水) 19:15:43ID:???ab の Path をフルで指定しれ
0759nobodyさん
2009/06/24(水) 19:16:47ID:???use open ':encoding(utf8)';
lwp-requestはある?
バージョンが古いと別の名前だったような気がするけど。
lwp-request -USe http://localhost/
こんな感じで。
0760nobodyさん
2009/06/24(水) 20:09:02ID:???やってみたら理想通り動きました。
>>759
こちらも理想通り動きました。
それと、よくわかりませんが
200 ok
だそうです。
apacheとPerl,Ruby,PHP入ってたんですが一度全部消してみました。
で、同じバージョンで再インストールして
Perlの事だけ考えて設定してみましたが変化なしです。
何度もすいませんがどうすればいいんでしょうか?
0761nobodyさん
2009/06/24(水) 20:37:38ID:???レスポンスヘッダの時刻に注目して。オプション付けると出てくるから。
スクリプトに warn('hoehoe'); とか書いといて。実行される度にエラーログに載るから。
それと、apacheのアクセスログ。
どのリクエストが、どうスクリプトを動かして、どのレスポンス出してるのか、
タイムスタンプで照らし合わせて見て。
一致するならapacheに問題ないから。
0762nobodyさん
2009/06/24(水) 20:39:58ID:???原因はその後のコードにありました。
全く関係ないと思ってたんですが
ヒアドキュメントで
print <<EOM;
ほにゃらら
<link rel="stylesheet" href="" type="text/css" />
ほげほげ
EOM
としてたんですが
上記のタグを削除したら直りました。
たぶんスタイルシートが読み込めなかったから
ブラウザが自動的にリロードしたんだとおもいます。
くだらないエラーですいません。ありがとうございました
0763nobodyさん
2009/06/24(水) 21:01:10ID:???0764nobodyさん
2009/06/24(水) 21:05:39ID:???0765nobodyさん
2009/06/24(水) 21:21:36ID:???0766nobodyさん
2009/06/24(水) 22:00:29ID:???プロ仕様
IE,Firefox
Fiddler Web Debugger - A free web debugging tool
http://www.fiddler2.com/fiddler2/
Firefoxのみ簡単仕様
Live HTTP Headers :: Firefox Add-ons
https://addons.mozilla.org/ja/firefox/addon/3829
ニコニコなど趣味に(
Proxomitron-J
http://www.pluto.dti.ne.jp/~tengu/proxomitron/
0769nobodyさん
2009/06/25(木) 02:01:15ID:???そこから全てのリクエスト(ヘッダやPOSTの中身、Javascript絡みの通信も)を
監視してるオレは、マイノリティなのかな・・・。
0770nobodyさん
2009/06/25(木) 03:30:59ID:???5.10以降、Windowsで使えるHTTP::Proxyが無いのが困り物。
CPANから拾ってもテストが通らないし。
0771nobodyさん
2009/06/25(木) 09:04:35ID:???0772nobodyさん
2009/06/25(木) 12:37:23ID:???6が出るまで5.8でいいわ
0773nobodyさん
2009/06/25(木) 12:45:53ID:???0774nobodyさん
2009/06/25(木) 14:05:24ID:???ところで // ってどんなときに使うん?
0775nobodyさん
2009/06/25(木) 14:38:37ID:???↓
my $d = $v || '';
↓
$v = 0 でも$d = '' になっちゃうじゃん
↓
my $d = $v // '';
0776nobodyさん
2009/06/25(木) 15:32:19ID:???値をリファレンスにして、サブルーチンに渡す。
あるいはサブルーチンで処理したデータをリファレンスで受け取った後に、
そのリファレンスの値が参照できない・・・ということはありますか?
0777nobodyさん
2009/06/25(木) 15:55:12ID:???0779nobodyさん
2009/06/25(木) 20:28:45ID:???フォームから「テストあいうえお日本語」等と送っても正常に処理出来るんですが
「テスト&」と送ると
Wide character in subroutine entry at C:/usr/lib/Encode.pm line 162
となりエラーになります。
「&」だけでは大丈夫なんですが「ト&」ではエラーになります。
デコード前に処理が必要なんでしょうか?
0780nobodyさん
2009/06/25(木) 21:15:06ID:???エスパーすると、decodeした文字列をもう一回decodeしてる。
0781nobodyさん
2009/06/25(木) 21:59:58ID:???見苦しいですが思いあたるとこはこの辺りです。
use Encode qw(from_to decode encode encode_utf8);
use open ':utf8';
use encoding 'utf8',STDOUT=>'shiftjis';
my %param = parse_form();
my $query;
if (exists $param{'query'}) {
$query = decode('shiftjis',$param{'query'});
#$query = $param{'query'};
}
0782nobodyさん
2009/06/25(木) 22:01:15ID:???my $buffer;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
my %param;
foreach (split(/&/,$buffer)) {
my ($name,$value) = split(/=/);
#form要素のname属性が/^[A-Za-z]+$/でなければ無視する
$name = uri_decode($name);
next unless $name =~ /^[A-Za-z]+$/;
$value = escape_string(uri_decode($value));
if (defined $param{$name}) {
my @values = sort((split(/\t/,$param{$name}),$value));
$param{$name} = join("\t",@values);
} else {
$param{$name} = $value;
}
}
0783nobodyさん
2009/06/25(木) 22:03:33ID:???my $string = shift;
$string =~ tr/+/ /;
$string = encode_utf8($string);
$string =~ s/%([0-9A-Fa-f]{2})/pack("H2",$1)/eg;
return $string;
}
sub escape_string {
my $string = shift;
$string =~ s/&/\&\;/g;
$string =~ s/"/\"\;/g;
$string =~ s/$string =~ s/>/\>\;/g;
$string =~ s/\t/\ /g;
$string =~ s/\r\n/\n/g;
$string =~ s/\r/\n/g;
return $string;
}
return %param;
}
0784nobodyさん
2009/06/25(木) 22:29:49ID:???0785nobodyさん
2009/06/25(木) 22:39:23ID:???ふだんはuse CGIしてるんですけど、
URIデコードの途中でutf8フラグを落とさないと
上手くいかなかったんで試行錯誤してます
具体的にやり方教えてもらえるならお願いします
0786nobodyさん
2009/06/26(金) 00:38:52ID:???use open ':utf8';
binmode(STDIN => ':raw');
binmode(STDOUT => ':encoding(Shift_JIS)');
use CGI qw(-utf8 :cgi);
my $cgi = CGI->new;
my $query = $cgi->param('query');
0788nobodyさん
2009/06/26(金) 02:22:48ID:???0789nobodyさん
2009/06/26(金) 08:18:46ID:???おお!ありがとうございます。
と思ってprintしてみたらデコードされてなかったorz
もうやだ文字コードめんどくさい。
もうutf-8駄目な環境は無視していいのかな?
0790nobodyさん
2009/06/26(金) 14:05:30ID:???0791nobodyさん
2009/06/26(金) 15:26:54ID:???STDINがutf8で、STDOUTがShift_JISで、コードがutf8なんだよね?
デコードされてなかったってのは、\x{0081}とかで表示される?
うーん、分からん。
でも、CGI.pmとencodingの相性が最悪なのは分かった。
0792nobodyさん
2009/06/26(金) 16:44:17ID:???使うのが今のところ確実かな。
0793nobodyさん
2009/06/26(金) 17:55:34ID:???>デコード
例えば「テスト&」と送ると
\x{fffd}e\x{fffd}X\x{fffd}g&
となりutf8::is_utf8はtrueになります。
まだ勉強しなきゃいけない部分が多く出て来たんで
対処のしようが無いorz
>>792
CGI.pmはインスタンス作った時点でデコードされてるんではないんですか?
てことは、paramを自前でデコードしても2重デコードになったりしないんですよね?
あれ?俺なんか変?
0794nobodyさん
2009/06/26(金) 18:07:24ID:???0795nobodyさん
2009/06/26(金) 18:21:09ID:???お勉強してきますw
いちおう全文ぅpしときます。
少なくともなにがしたいのかは分かると思います
お願いします
http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=2167
0796nobodyさん
2009/06/26(金) 19:11:15ID:???use utf8;
use open ':utf8';
binmode(STDIN=>':raw');
binmode(STDOUT=>':encoding(Shift_JIS)');
use CGI qw(:cgi);
my $cgi = CGI->new;
my $query = decode 'Shift_JIS' => $cgi->param('query');
0797796
2009/06/26(金) 19:27:16ID:???ソース見て気になったけど、サブルーチン内でサブルーチンの定義はPerlではやめた方がいいよ。
0798nobodyさん
2009/06/26(金) 19:38:40ID:???ぅわぁぁぁぁ完璧です。
いままで何度も挫折したんですが初めて解決しました。
まじで感謝してもしきれないですw
>サブルーチン内でサブルーチン サブルーチンからサブルーチン呼ぶ場合はいつもそうしてました(汗
0799nobodyさん
2009/06/30(火) 17:03:31ID:???スクリプトを書こうと思ったんですが,mp4に格納されている
動画(コーデックはh.264)のサイズ(幅×高さ)を取得する方法って
ありますか?
MP4::Infoでイケルかと思ったら,これは動画サイズを取得できない
みたいなんですよ・・
ttp://search.cpan.org/~jhar/MP4-Info-1.12/Info.pm
0800nobodyさん
2009/06/30(火) 23:13:29ID:???0801799
2009/07/01(水) 02:27:40ID:???>mplayer
なるほど.一度外部のアプリを使って画像を生成して
それの大きさを取得するってことですかね?
ちょっとやってみます.
アドバイスありがとうございます.
パッケージマネージャーのほうはよくわかりませんでした.
■ このスレッドは過去ログ倉庫に格納されています