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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0611nobodyさん2005/11/23(水) 17:32:10ID:???
半角カタカナだと、文字コード判別(getcode)で誤判別をしてしまう。
0612nobodyさん2005/11/23(水) 17:34:05ID:???
>>610
Shift-Jisをやめればいいと思います
0613nobodyさん2005/11/23(水) 17:40:21ID:???
モジュールは確かに便利なんだけど、infoseekで使うときに困るんだよな。
0614nobodyさん2005/11/23(水) 17:49:16ID:???
>>610
どうやって使ったのか言うてみい。
0615nobodyさん2005/11/23(水) 18:22:04ID:???
>>609
糞な本が糞なプログラマを養う。
0616nobodyさん2005/11/23(水) 18:34:04ID:???
泥の中に蓮の花を開く
0617nobodyさん2005/11/23(水) 19:20:27ID:???
kent見本にしたコードはひどいよな。
0618nobodyさん2005/11/23(水) 20:04:36ID:???
>>617
はいはいKENTを超えてから言ってね
0619nobodyさん2005/11/23(水) 20:09:38ID:???
それはギャグて言っているのか?(AA略
0620nobodyさん2005/11/23(水) 20:10:39ID:???
妬み乙
0621nobodyさん2005/11/23(水) 20:21:18ID:???
ちょっと調べものをするのに設置したのですが
良かったらどうぞです

http://user.ftth100.com/mirrorhenkan/perl/
0622nobodyさん2005/11/23(水) 20:57:03ID:???
>>608
俺様専用スクリプトだって、Unix環境専用スクリプトだってアリなんだし、
必ず使えってことも無いでしょ。

必要要件を満たさないものを自作するよりは、
素直に使った方がいいけどさ。
0623nobodyさん2005/11/23(水) 22:28:38ID:5cxNyXSu
質問させて下さい。
windowsXPSP2
ActivePerl-5.8.7.813-MSWin32-x86-148120.msi

を使っています。
plファイル自体の文字コード EUC
内部で扱う文字コード EUC
標準出力 Shift-JIS
標準入力 EUC

POSTデータ等で受け取ったデータはshift-jisであれば内部処理用にEUCに変換する。

という構成でプログラムを書きたく、検索した結果、下記の他いろいろ試してみた
のですがうまくいきません。
文字化けで出力されたり、
"\x{fffd}" does not map to shiftjis at〜〜
と出力されたりします。
↓
#STDIN と STDOUT を別々にコード変換する
use encoding 'euc-jp', STDOUT=>'shift_jis';

どうかお力添えをして頂けないでしょうか。
よろしくお願い致します。
0624nobodyさん2005/11/23(水) 22:34:46ID:???
>>623
いろいろやったんなら試したこと全部書かないと
レスしても 「それはやってみましたがダメでしたとかいわれて」殴ってやりたくなるからな〜
レスつきにくいぞ

とりあえず jcode.pl でも使っとけ


0625nobodyさん2005/11/23(水) 22:48:30ID:???
utf8フラグ
0626nobodyさん2005/11/23(水) 23:04:32ID:???
標準出力をEUCにすればええがな。
携帯?
0627nobodyさん2005/11/23(水) 23:07:42ID:???
>>623
>>8 の [Perl5.8Unicodeメモ] のページを読むべし。
06286232005/11/23(水) 23:46:19ID:???
>>624
>>625
>>626
>>627
みなさんアドバイスありがとうございます。

携帯からの入出力を想定しているためこのような仕様で書きたいと思いました。
Perl5.8Unicodeメモのページを読み、記載されてあった
簡単なところから
まず、
use encoding "euc-jp";
print "こんにちわ\n";
としてDOSで実行してみたのですが
「、ウ、ヒ、チ、・」
と表示されてしまいます。

自分なりに
use encoding "euc-jp";
use Encode qw/ encode decode /;
use Encode qw(from_to);

print from_to("あああ", "shift_jis", "euc-jp");
ともしてみたのですが、
Wide character in subroutine entry at C:/Perl/lib/Encode.pm line 186.
と出てしまいます。
おそらくこれはutf8フラグを切り落としていないからだと
思いますが、euc-jpでソースを書いて出力する際には
一つ一つ文字コードを変換していかないといけないのでしょうか?

0629nobodyさん2005/11/24(木) 00:02:56ID:???
>>628
> 「、ウ、ヒ、チ、・」 と表示されてしまいます。
君が自分で EUC-JP の文字列を Shift_JIS のコンソールへ
出力しているのだから化けて当然。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html

> 自分なりに(略)ともしてみたのですが、
from_to() の使い方を間違えている。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encode.html
0630nobodyさん2005/11/24(木) 00:46:53ID:???
>>628
>>623に書かれている
> use encoding 'euc-jp', STDOUT=>'shift_jis';
これでだめなん?
0631nobodyさん2005/11/24(木) 04:22:56ID:QV+2W1Ju
$hogeを加工;
&sub1;
sub sub1{$hogeをさらに加工;&sub2;return}
sub sub2{$hogeをさらにさらに加工;return}

というようなことをしたいんですが、sub2になるとせっかく加工した$hogeが初期化されてしまってるようなんですが、どう対処すればいいでしょうか?
0632nobodyさん2005/11/24(木) 04:35:08ID:???
>>631
my宣言でもしてない限り、その書き方なら$hogeは初期化されないけど。
何か間違ってない? つかuse strictやれと小一時間(ry
0633nobodyさん2005/11/24(木) 04:57:27ID:QV+2W1Ju
ありがとうございます。
よく見てみたら意味もわからずmy宣言してました。
これをとったらうまくうごきました。
これからも御鞭撻のほど宜しくお願いします。
0634nobodyさん2005/11/24(木) 09:21:02ID:???
>>633
グローバルの$hogeをそのまま複数のサブルーチンからいじるのは一般的にいうとあまり行儀のいい
プログラムではないな。変な癖をつけると大きいプログラム書くようになると苦労するよ。
0635nobodyさん2005/11/24(木) 10:41:05ID:???
要するに値を渡したり戻したりが全然わかってないと。
0636nobodyさん2005/11/24(木) 11:40:57ID:???
今期のテーマ:脱KENT"2005"冬の陣
0637nobodyさん2005/11/24(木) 20:39:28ID:???
変数のアドレスを渡すのら
0638nobodyさん2005/11/24(木) 21:50:23ID:EJIyCJlG
戻り値を受け取るのら!
0639nobodyさん2005/11/24(木) 22:02:42ID:???
$hoge = ¥$hoge;
0640nobodyさん2005/11/25(金) 00:36:53ID:???
sendmail串万歳
0641nobodyさん2005/11/25(金) 06:48:37ID:s5kWftCO
use strict;
my %data = check('hoge');
if(%data) {print "OK";} else {print "NG";}
exit;
sub check
{
 my ($text)=@_;
 if($text ne 'hoge') {my %data={'text'=>$text}; return %data;}
 return undef;
}
2行目の位置で正常なハッシュ返ってくればエラーが出ないのですが、
undefが返ってくると「Odd number of elements in hash assignment」と
出てしまいます。
こういう、正常ならハッシュ値、異常ならundefみたいな事をしたい
場合には、どういう感じでコーディングすれば良いのでしょうか?
0642nobodyさん2005/11/25(金) 06:53:16ID:???
>>641
my %data = check('hoge') or ();
0643nobodyさん2005/11/25(金) 07:18:43ID:???
>>642
ありがとうございます。
それでやってみたのですが、やはり
「Odd number of elements in hash assignment」と
出てしまいます。

「return undef;」の所を「my %data; return %data」にしたら
エラーが出なくなったのですが、なんか書き方が
すっきりしないような気もします…。
0644nobodyさん2005/11/25(金) 07:22:13ID:???
「my %data = check('hoge') || ();」で解決しました。
'or'と'||'で違うんですね。勉強になりました。
0645nobodyさん2005/11/25(金) 07:34:50ID:???
>>644
あ、ほんとだ。|| でなければダメだった。
or だと評価が遅すぎたね。
06466412005/11/25(金) 07:57:32ID:s5kWftCO
…と思ったら、「my %data = check('hoge') || ();」だと
正常なハッシュ値が返ってきた時に
「Odd number of elements in hash assignment」と
出てしまいます。

もう、何が何だかわからなくなってきました…onz
0647ヽ(´ー`)ノ ◆.ogCuANUcE 2005/11/25(金) 08:25:17ID:???
先に結論だけ書いておくけど、入門書か何かでリストやハッシュについて
理解を深めた方がいいかもしれない。

my %data={'text'=>$text};
↓ こう
my %data=('text'=>$text);

return undef;
↓ こう
return ();
0648nobodyさん2005/11/25(金) 08:35:56ID:???
>>647
>return undef;
>↓ こう
>return ();
これで解決しました。

>my %data={'text'=>$text};
>↓ こう
>my %data=('text'=>$text);
これについては、最初は()の方で書いていたのですが
http://pc8.2ch.net/test/read.cgi/tech/1131286411/223
ここで、正しくは{}と掲示されたのですが…。
どちらにしても、リストやハッシュについて、理解を深めようと思います。
ありがとうございました。
0649nobodyさん2005/11/25(金) 11:39:19ID:???
>>648
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
0650nobodyさん2005/11/25(金) 13:21:18ID:???
>>648
それはスカラ変数に無名ハッシュとしてリファレンスを代入する時だけ
0651nobodyさん2005/11/25(金) 15:44:43ID:63zT9z2i
よろしくオナガイシマス
半角英数字、英字は大文字、小文字も含めて
10桁の乱数を生成しようと思い以下のプログラムを書いてみたのですが
数字の乱数しか生成出来ません、どこを直したらいいでしょうか、ご指摘お願いします。@array = (0..9,'A'..'Z','a'..'z');
foreach (1..10) {
my $bar = (rand scalar(@array));
print qq|"$bar"\n|;
}
0652nobodyさん2005/11/25(金) 15:46:10ID:63zT9z2i
651です改行を間違えてました
@array = (0..9,'A'..'Z','a'..'z');
foreach (1..10) {
my $bar = (rand scalar(@array));
print qq|"$bar"\n|;
}
ご勘弁です
0653nobodyさん2005/11/25(金) 15:56:15ID:???
my $bar = (rand scalar(@array));
        ↑  ↑

scalar(@array)の戻り値は@arrayの要素数
randの引数にそれを渡してるんだから、当然数値しか戻ってこない罠
0654ヽ(´ー`)ノ ◆.ogCuANUcE 2005/11/25(金) 15:56:26ID:???
- my $bar = (rand scalar(@array));
+ my $bar = $array[rand scalar(@array)];
0655nobodyさん2005/11/25(金) 16:24:41ID:???
↑分かっててintを略してる?
0656nobodyさん2005/11/25(金) 16:35:51ID:1cmYWuzn
質問、Encode 使ってUTF8→EUCにすると
「〜」が「?」になるんですが何とかならないでしょうか
0657nobodyさん2005/11/25(金) 16:39:31ID:???

あなたが無知なだけですね
0658ヽ(´ー`)ノ ◆.ogCuANUcE 2005/11/25(金) 16:52:52ID:???
>>655
略してるも何も、必要ないじゃん。わざわざ int() しろと?
0659nobodyさん2005/11/25(金) 16:54:46ID:???
654
652です
デキマスタ、ありがとう
0660nobodyさん2005/11/25(金) 17:26:20ID:???
>>656
この辺の絡みなので個別対処。
http://www.opengroup.or.jp/jvc/cde/ucs-conv.html

>>658
じゃあ scalar も外せよ、半端君。
0661nobodyさん2005/11/25(金) 18:02:46ID:???
>>660
そのまま $array[] 足しただけだろ。
なんでそんなに必死なんだ。
0662nobodyさん2005/11/25(金) 18:10:22ID:1cmYWuzn
>>660
有難うございますー
これを参考になんとかやってみますです。
0663nobodyさん2005/11/25(金) 18:15:31ID:???
>>641
>>647

>return undef;
>↓ こう
>return ();

つまり return; だよね

search.cpan.org: Perl::Critic::Policy::Subroutines::ProhibitExplicitReturnUndef
http://search.cpan.org/~thaljef/Perl-Critic-0.13/lib/Perl/Critic/Policy/Subroutines/ProhibitExplicitReturnUndef.pm
0664nobodyさん2005/11/25(金) 18:45:52ID:???
use strictのメリットって何ですか?
スクリプトが速くなったりするんでしょうか
0665nobodyさん2005/11/25(金) 18:51:59ID:ykRqgxjm
すいません
asciiファイルに\r\nが含まれることはあっても
バイナリファイルに\rのない\nが含まれていることはありえない、
と考えてバイナリファイルを選別していくやり方は問題ありますか?
0666age2005/11/25(金) 18:55:49ID:PaUDYDn8
>>665
バイナリーファイルは何でもありだからだめだよ
0667nobodyさん2005/11/25(金) 19:09:11ID:???
>>664
http://perldoc.jp/docs/perl/5.8.0/strict.pod
http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod
0668nobodyさん2005/11/25(金) 19:18:35ID:???
>>665
> バイナリファイルに\rのない\nが含まれていることはありえない、

扱うバイナリファイルがその前提なら、
その方法でもいいと思うよ。
0669nobodyさん2005/11/25(金) 19:49:39ID:???
バイナリかアスキーかなんて、拡張子で判断すればいいんでないの
0670nobodyさん2005/11/25(金) 19:54:43ID:???
なぜファイルテスト演算子を使わないのかと
0671nobodyさん2005/11/25(金) 19:55:27ID:???
(´・д・)エー
0672nobodyさん2005/11/25(金) 20:19:10ID:???
ファイルテスト演算子って\0が含まれてるかどうかだけじゃなかったっけ?
0673nobodyさん2005/11/25(金) 20:21:34ID:???
すまん、違ったようだ。
0674nobodyさん2005/11/25(金) 20:51:44ID:???
x0D x0Aで改行ってのはWindows限定だから他のOSじゃ通用しないよ。
自前でチェックするならx00のあり/なしだな。手抜きの場合は。
0675nobodyさん2005/11/25(金) 20:55:26ID:???
>>664
使用者感想

use strictで肩こりが解消しました。(茨城県 I.・Y様)
もうuse strict無しではコーヒーは飲めません。(北海道 H・N様)
use strictのお陰で宝くじが当り、彼女もできました。(東京都 A・J様)
0676nobodyさん2005/11/25(金) 21:22:52ID:???
>>664
>>675みたいなおちゃらけじゃなくマジレス

use strictでkentの呪縛から逃れることが出来ますた。(京都府 M・N)
0677nobodyさん2005/11/25(金) 21:31:13ID:???
問い)xxxのCGIを改造したいのですが。
答え)use strict;の一文を削除してからどうぞ。
0678nobodyさん2005/11/25(金) 21:32:34ID:???
>>664
残尿感もなく、スッキリです!(東京都 W・C)
0679nobodyさん2005/11/25(金) 21:41:37ID:???
ヒント:グローバル変数
0680nobodyさん2005/11/25(金) 21:47:22ID:???
ヒント:グローバル経済
0681nobodyさん2005/11/25(金) 21:48:38ID:???
バイナリかどうかのチェックとはちょっと違うかも知れないけど File::MMagic とか。
0682nobodyさん2005/11/26(土) 00:24:41ID:???
>>664
use strictを使う理由は、use strict 'vars';が一番大きいかな。
完全に修飾されてない、宣言の無い変数を使うとエラーになる。
つまり、タイプミスなどで間違った変数名を使うとエラーで教えてくれる。
0683nobodyさん2005/11/26(土) 02:02:52ID:???
でも use strict; 使っておいて、一番上に my $変数; をずら〜って書いてるひともいるけど、それは文法上 strict だけど、本質的に strict じゃないんじゃないかなー、って思う。
0684nobodyさん2005/11/26(土) 02:32:09ID:???
strictって名前だけど、機能を若干制限するだけで、
スタイルを強制するわけじゃないからね。
0685nobodyさん2005/11/26(土) 08:54:19ID:???
>>683
いるいる
その人おっさんじゃない?
0686nobodyさん2005/11/26(土) 09:02:53ID:???
でも、解って使っていればOKかなと思う。
例えば、上のほうに設定系の変数をわかりやすくまとめておいて、ここまでが
設定ですよ〜、、、みたいな。。
0687nobodyさん2005/11/26(土) 09:07:23ID:???
極力そんな変数は減らすべきだよ
0688ゆーき2005/11/26(土) 09:27:08ID:yGTXOsFB
print "Location: mailto:〜でメーラーを開いて、本文に改行交じりの文字を入れることが出来ません。なぜでしょうか? 
print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目%0D%0A2行目\n\n";
「%0D%0A」を入れてみましたがだめでした。文字コードや、URLエンコード関係が原因なんでしょうか???
ちなみにPERLのスクリプト自体はShift-jisで書いています。
0689愛とゆーきだけが友達さ2005/11/26(土) 09:33:48ID:???
もっとスマートなやり方でできないのか?
bodyなんてメーラー依存度が高いわけだし。。
0690ゆーき2005/11/26(土) 09:42:03ID:yGTXOsFB
メルマガを一斉配信する前に、一旦Outlook Expressでプレビューしたいわけなんですが、他にいい方法ご存知ですか?
0691nobodyさん2005/11/26(土) 11:46:44ID:???
>>690
一度、自分だけに同じ内容のメールを送ってみる。
0692ゆーき2005/11/26(土) 11:51:53ID:yGTXOsFB
>>691
それも、最終手段としては考えていますが、
ユーザのひと手間が増えますので、なるべく他の方法を使いたいと思っているのですが...
0693nobodyさん2005/11/26(土) 12:00:07ID:???
>>692
Outlook を使ってない人、プレビューしたく無い人もいるわけだけど、
そういう人の手間が増えたり、ウザいと感じるのはいいわけ?
0694Perl初心者2005/11/26(土) 12:13:53ID:???
>>688
”%”の前に”\”がいるとか
0695ゆーき2005/11/26(土) 12:29:09ID:yGTXOsFB
>>693
今回は、1人のクライアント専用に作っていまして、こちらの要望なんです。
0696ゆーき2005/11/26(土) 12:49:51ID:yGTXOsFB
>>694
print "Location: mailto:aaa\@aaa.com?subject=件名\&body=1行目\%0D\%0A2行目\n\n";
としてみましたが、だめでした。
0697nobodyさん2005/11/26(土) 13:18:09ID:???
<head>
<meta http-equiv="refresh" content="0; url=mailto:[email protected]?subject=件名&body=1行目%0d%0a21行目">
</head>

HTMLタグで飛ばしてやるのはだめなの?
0698nobodyさん2005/11/26(土) 13:49:44ID:???
Perlコーディング
0699ゆーき2005/11/26(土) 13:51:51ID:yGTXOsFB
>>697
完璧です!!!(^^)!
上手くいきました!ありがとうございましたm(_ _)m。
とても丁寧にアドバイス頂きまして、本当にありがとうございました。
おかげさまでクライアントにも顔がたちます。感謝!感謝!感謝!感謝!感謝!
07002892005/11/26(土) 14:52:54ID:EqqUKm3R
perl5.8、FreeBSDの環境です。
連想配列をファイルやDBのカラムに保存したいのですが、
可能でしょうか?
可能であれば方法をご教授お願いいたします。
0701nobodyさん2005/11/26(土) 15:26:01ID:???
>>700
もちろん可能だけどどのあたりがわからないの?
連想配列にどんなキーがあるのか知る方法がわからないとか→keys, each
ファイルへの記録方法がわからないとか→open, print, close
PerlからDBを使う方法がわからないとか→http://search.cpan.org/modlist/Database_Interfaces
それを連想配列に戻す方法がわからないとか→それぞれのキーに対して値を代入
0702nobodyさん2005/11/26(土) 15:35:34ID:???
そういうモジュールを探してるって事じゃない蟹
0703nobodyさん2005/11/26(土) 16:18:41ID:???
シリアライズして放り込めば…と思ったけど、
ハッシュをそのままDBのテーブルにマッピングしたいってこと?
0704nobodyさん2005/11/26(土) 16:33:28ID:???
ああ、一つのカラムの中に連想配列を丸ごと押し込みたい、とも取れるのか…
それならStorableだよな
07057002005/11/26(土) 17:02:03ID:EqqUKm3R
>>703
>>704
そういう事です。説明足りなくてすいません。
普通に連想配列をファイルやカラムにinsertしても
読み取りにに失敗したので(当然)。
Storableとはなんでしょうか?ググってみます。
0706nobodyさん2005/11/26(土) 20:35:13ID:zmLMleB6
Javaのプロパティファイルと同じことをperlでもやりたいのですが、できますか?
2chのSETTING.TXTみたいなのです。
2chってどうやってるんだろう・・・。
0707nobodyさん2005/11/26(土) 20:38:46ID:???
出来ます
と言うか物凄く初歩です
0708nobodyさん2005/11/26(土) 20:42:51ID:???
現在CGI経由で画像を表示させる簡単なCGIスクリプトをテストしています。
こんな感じで・・・

open IMAGE, "<:raw", "img.gif";
print "Content-type: image/gif\n\n";
print <IMAGE>;
close IMAGE;

しかしこれを実際にテストしてみると、ブラウザには
画像がシュレッダかけられたみたいなへんてこりんな
画像で、しかも縦の長さが押しつぶされてしまった
感じの画像が表示されます。要は、正しく表示されません。
jpeg画像にしてやってみると、今度はバッテンのアイコンが
でてしまいます。

なぜうまく表示できないのでしょうか?
0709nobodyさん2005/11/26(土) 20:49:30ID:???
binmode
0710nobodyさん2005/11/26(土) 20:51:22ID:???
>709
:rawだから違うんじゃね?
■ このスレッドは過去ログ倉庫に格納されています