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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0756nobodyさん2006/02/18(土) 02:56:52ID:Hc0+hkLt
>>755
記述忘れでした
ありがとうございました
0757nobodyさん2006/02/18(土) 05:25:34ID:???
まだおみくじやってんのか(;´Д`)
0758nobodyさん2006/02/18(土) 07:46:55ID:???
リスト1
1139355934
1139301779
1139325935
1139231627
1139409916
リスト2
1139231627
1139301779
1139355934
1139325935
のようにリスト1とリスト2があって、それぞれ$list1[連番]$list2[連番]のようになっています。
リスト1の上から順に読み込んで、読み込んだ内容がリスト2のどれかと一致したとき
$check[$list1の内容]を1にしたいと考えています。下のようにやってみましたがうまくいきませんでした。
どのようにしたら実現できるのでしょうか。ご教唆お願いします。
   $num=-1;
   until($list1dir_filenum==$num){
   $num++;
   print "$list1name[$num]\n";
      $list2num=-1;
      until($list2dir_filenum==$list2num){
      $list2num++;
      print "$list2name[$list2num]\n";
         if ($list1name[$num]eq$list2name[$list2num]){
         $val=$list1name[$num];
         $namecheck[$val]="1";
         }
      }
   }
0759nobodyさん2006/02/18(土) 08:16:20ID:???
>>758
一ついえることは
× 教唆
○ 教示
0760nobodyさん2006/02/18(土) 08:27:09ID:???
>>758
言ってる事とやってる事が違うような、、
07617582006/02/18(土) 08:29:29ID:???
>>759
すいません。goo辞書で確認してみたら自分が間違いでした。教示ですね。ありがとうございます。
で、質問のほうはどのようにしたらうまくいくのでしょうか。お願いします。
0762nobodyさん2006/02/18(土) 08:38:48ID:???
>>758
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#data__arrays

my @list1 = (0..9, 5..9);
my @list2 = (1, 5, 10, 10);
my %check;
{
  my(%saw1, %saw2, %count);
  # ++$count{$_} == 2 && ++$check{$_} for # 要素が多い時
  # %check = map ++$count{$_} == 2 ? ($_, 1) : (), # map で一気に
  %check = map +($_, 1), grep ++$count{$_} == 2, # 段階を踏んで
    grep(!$saw1{$_}++, @list1), # それぞれのリストが既に
    grep(!$saw2{$_}++, @list2), # ユニークなら必要無し
  ;
}
print map "$_\n", sort { $a <=> $b } keys %check;
0763nobodyさん2006/02/18(土) 08:39:26ID:???
確認してないけど、だいたいこんな感じかな?
for $i (0 .. $#list1){
$check[$i]= grep($list1[$i] eq $_, @list2);
}
0764nobodyさん2006/02/18(土) 08:42:47ID:???
>>758
> $check[$list1の内容]
早まるなっそんな馬鹿でかい数を配列の添え字に使ったら
すごい量のメモリが確保されるぞ
0765nobodyさん2006/02/18(土) 11:31:58ID:???
俺さあ、エルピーダの仕事してるんだよね。
世の中こういうヘボだらけになって、メモリをガンガン使って欲しい。
0766nobodyさん2006/02/18(土) 11:49:24ID:???
>>764
・・・・マジで?
0767nobodyさん2006/02/18(土) 12:34:04ID:???
もし1要素1バイトとしたら理論的には約1ギガだけど、実際にはどれぐらいになるんだろう??
0768nobodyさん2006/02/18(土) 12:58:01ID:???
入れる値によって可変するからLONGなら8GB
テキスト入れた日にゃ・・・Perl落ちw
0769nobodyさん2006/02/18(土) 13:01:05ID:???
ってか Stringであつかえばいいんちゃうの・・?
0770nobodyさん2006/02/18(土) 13:02:07ID:???
・・・・ ごめ! ハッシュかと思ってた! 配列かYO!!
0771nobodyさん2006/02/18(土) 13:09:37ID:???
実際にはそんな事にならないから。
嘘だと思うならやってみれ。
0772nobodyさん2006/02/18(土) 13:11:23ID:???
Out of memory っていわれるね
07737652006/02/18(土) 13:21:35ID:???
Out of memoryといわれたらデータ構造考え直さずに、64ビット化しろ。
頭使わず、メモリ使え。
0774nobodyさん2006/02/18(土) 13:35:07ID:???
>>773がなんていうか、かわいそうとうか…
0775nobodyさん2006/02/18(土) 16:14:55ID:???
数年前に通ったPerl教室じゃ
おみくじこそPerlの真こっちゅおって言ってたなぁ・・・
この前通りかかったら別の教室になってた
0776nobodyさん2006/02/18(土) 17:47:39ID:???
いいじゃん、randの使い方の勉強にはなるぜ
0777 ◆TWARamEjuA NGNG
お神籤は、また戻しちゃうからなぁ。。。
くじ引きみたいなのがよろしいかと@randの使い方?(って好きなように使えばいいけれども)
0778nobodyさん2006/02/19(日) 00:53:45ID:???
Larryはおみくじ引かせるためにPerlつくったんですかそーですか
0779nobodyさん2006/02/19(日) 01:32:35ID:xuHW0Wkn
一行目にカウンターを入れたいので、二行目からforeachでまわしたいのですけど、
どんな風に書いたらよいですか?

データファイル

4234                 ←一行目(カウンター)
さいたま市<>県庁<>アリーナ<>レッズ  ←二行目以降はループで
川越市<>時の鐘<>古都
秩父市<>祭り<>花の街



プログラム

open(FILE, "<hogehoge.dat");
eval{ flock(FILE, 1) };
@log = <FILE>;

一行目の読み込み
@logの一行目

二行目以降はこの処理
@logの二行目以降
0780nobodyさん2006/02/19(日) 01:47:56ID:???
>>779
カウンタと次からのデータは切っても切れないものなの?
違うファイルにしてもいい希ガス。
で、foreachじゃなくて、for (my $i = 1; $i ++; @log) {}
で、いい希ガス。
0781nobodyさん2006/02/19(日) 01:49:33ID:???
shiftしなさい。
0782nobodyさんNGNG
my($readline) = <FILE>;
$readline =~ s/\x0D\x0A|\x0D|\x0A/;
my($cnt) = int($readline);

while($readline = <FILE>){
  〜処理〜
}
0783nobodyさん2006/02/19(日) 01:50:09ID:???
>>779
配列に読み込んでforeachするのが良いかどうかは置いといて。
一行最初に読めば良いじゃん。

open(FILE, "<hogehoge.dat");
eval{ flock(FILE, 1) };
$counter = <FILE>;
@log = <FILE>;
0784nobodyさん2006/02/19(日) 02:08:39ID:???
>>778
え?知らなかったの?
0785nobodyさん2006/02/19(日) 14:03:52ID:???


┌→┐
↑話↓
└←┘

0786nobodyさん2006/02/19(日) 15:17:40ID:???
>785
しょうがねぇじゃん
過去ログ読まねぇんだもんorz
0787nobodyさん2006/02/19(日) 17:04:46ID:???
┌←┐  ┌→┐
↓  ↑  ↑  ↓
└→┘  └←┘
    ↑↑
───────
  低  気  圧
0788nobodyさん2006/02/19(日) 19:19:24ID:sHmg7IfX
質問させてもらいます
今Z-Z BOARDをレンタルしているのですが、こんど自前の掲示板を設置したいと思っています
どうしても利用者のトリップを引き継ぎたいのですが設置しようと考えている掲示板は
暗号化の部分がこのようになっています
sub tripmake{
my($key,$salt,$trip);
$_[0]=~s/◆/◇/g;
if($_[0]=~/#(.+)/){
$key=$1;
$salt=substr($key."H.",1,2);
$salt=~s/[^\.-z]/\./go;
$salt=~tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;
$trip=substr(crypt($key,$salt),-10);
$_[0]=~s/#(.+)/◆<\/B>$trip/;
}
return $_[0];
}
Z-Z BOARDのトリップにすることは可能でしょうか?
皆様よろしくお願いいたします
0789nobodyさん2006/02/19(日) 19:33:27ID:???
>可能でしょうか?
可能です



終了、次の質問どうぞ
0790nobodyさん2006/02/19(日) 20:25:14ID:???
文字コードで困っています。
LWPのgetメソッドでページの情報を取ってきたのですが
その取ってきたページで使われている文字コードが何であるかを
知る方法は無いでしょうか?
0791nobodyさん2006/02/19(日) 20:40:05ID:???
jcode.pl の getcode
0792nobodyさん2006/02/19(日) 21:41:24ID:???
Jcode.pm の getcode
0793nobodyさん2006/02/19(日) 22:05:53ID:???
Encode::Guess
0794nobodyさん2006/02/19(日) 22:34:29ID:???
utf-8のために、Encodeのがいいかもね。
0795nobodyさん2006/02/19(日) 22:52:30ID:???
NKF の・・・、無理か・・・
07967882006/02/19(日) 22:58:25ID:???
数値をどのようにしたら実現できるのでしょうか。ご教唆お願いします。
0797nobodyさん2006/02/19(日) 23:03:51ID:???
もしかしてトリップ盗聴
0798nobodyさん2006/02/20(月) 00:26:00ID:ppD/ecqF
m/$x/;
とかしたときに、$xのなかにある正規表現の特殊文字を普通の文字として扱う場合はどうしたらいいですか
0799 ◆TWARamEjuA NGNG
quotemeta $x しておくとか /\G$x\E/ しちゃうとか。
0800nobodyさん2006/02/20(月) 00:46:50ID:???
>>799
thanks.
0801nobodyさん2006/02/20(月) 08:03:48ID:???
文字コードに答えて頂いた方、ありがとうございました
jcodeのgetcodeを使いました。>>793も調べてみようと思います。
0802nobodyさん2006/02/20(月) 10:55:25ID:???
>>801
>>794
0803nobodyさん2006/02/20(月) 15:30:11ID:???
>>799
\Q$x\E じゃねーの?
08048012006/02/21(火) 02:29:14ID:???
>>801です。
jcodeを利用したのですが、まだ文字化けが起こります。

$ua = LWP::UserAgent->new();
$res = $ua->get( $inurl );
if($res->is_success)
{
   $title = $res->title;
   &jcode::convert( $title , "euc", "", "z");
}
else
{
  #異常終了処理
}

ページ取得、タイトル取得には成功しているのですが。
jcodeの使い方は合ってますか?
私の使い方が正しくないのでしょうか?
jcodeでは希望の処理はできないのでしょうか?
Encodeを使えば回避できますか?
0805nobodyさん2006/02/21(火) 02:54:00ID:???
取得のページがutf-8とかじゃ?
0806nobodyさん2006/02/21(火) 03:14:58ID:???
>>804
渡すのは型グロブかリファレンス
&jcode::convert( \$title , "euc", "", "z");
0807nobodyさん2006/02/21(火) 17:43:45ID:???
ヒアドキュメントで書かれたものなら、変数に収めてlengthできるんですけど、
普通のプリント文をlengthするにはどうしたらいいんでしょうか?

sub hoge{
  print 'momoko';
  return;
}

この、サブルーチンhogeで出力される'momoko'の長さ(6文字)を計りたいのです。

$a = length(&unko);
print $a;

だとうまくいきせん。どうやればいいんでしょうか。
0808nobodyさん2006/02/21(火) 17:50:42ID:???
>>807
&unko がどこから出てきたのかわからないけど
サブルーチンの戻り値にセットすればどう
0809nobodyさん2006/02/21(火) 17:51:46ID:???
>>807
どうしてもprintを使いたいならIO::ScalarなりIO::Stringなり、
さらに必要ならIO::Teeなりを使う必要がある。
08108072006/02/21(火) 17:54:07ID:???
unkoじゃなくてhogeでした。
>>808
戻り値にセットしてもうまくいきません・・・
0811nobodyさん2006/02/21(火) 18:56:43ID:???
>>810
釣れますか?
0812nobodyさん2006/02/21(火) 23:48:30ID:???
>>806
できました。ありがとう。
0813nobodyさん2006/02/22(水) 05:44:07ID:???
おはようございます。
サイトに来てくれた人のHTTP_REFERERを保存していて
どんな単語で検索して来たのかを表示しようと思ったんですけど
うまく表示されない場合があります。

$value =~ tr/+/ / ;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("H2", $1)/eg ;
jcode::convert( *value, 'euc' );

調べたんですけど、だいたいどこもこのくらいしか書いてないんです。
他に何か必要なことがあるんでしょうか?
0814nobodyさん2006/02/22(水) 06:10:09ID:???
GoogleなんかはUTF-8だからJcode.pmとか使え
0815nobodyさん2006/02/22(水) 07:48:55ID:???
おぉ!化けなくなりました。
ありがとうございましたmm()__
0816nobodyさん2006/02/22(水) 15:01:17ID:???
ゲットの方法でポストすることって出来ますか?
詳しく言うとボタンをつかわいで変数にデータを入れる方法とかなんですが・・・
その場合後ろのタイトルとかに?をつけてポストとか書けばいいんでしょうか?
なんとかしてボタンじゃなくてリンクだけで送信されるようにしたいのですが。
宜しくお願いします。
0817nobodyさん2006/02/22(水) 15:12:46ID:???
複数の呼び出し元からアクセスできて、呼び出し元の環境変数を参照して、
それぞれ対応したページを生成する掲示板を作っています。
その掲示板に’ホームへ戻る’のリンクをつけて、その呼び出した元のページへ帰るようにしたいのですが、
どのような方法があるでしょうか?
最初はリファラーをクッキーに保存しておけばいいかなと思ったんですが、
imodeはクッキー使えないみたいなので困っています。
他の方法があれば教えてください。
0818nobodyさん2006/02/22(水) 15:21:39ID:???
>816
クリック保証型の詐欺ですか (; ̄^ ̄)
0819nobodyさん2006/02/22(水) 15:23:17ID:???
>818
面倒くさいだろうけど、<input type="hidden"〜 を使うしかないんじゃないかな
0820nobodyさん2006/02/22(水) 17:49:13ID:???
ハッシュのハッシュの配列の値を取る記述がうまくいきません。
'KKK'をプリントしたいんですが・・・
どうやればいいんでしょうか。

$a = {
  1 => 'aaa',
  2 => 'bbb',
  3 => 'ccc',
  4 => $b->{test}[0]
};

$b = {
  test => ['kkk','yyy']
};

print $a->{4};   # KKKをプリントしたいけどうまくいかないorz
0821nobodyさん2006/02/22(水) 18:13:58ID:???
$bを$aより先に定義。
それと$a,$bはsortで使う特殊変数だから、テストでも使わないのが吉。

08228202006/02/22(水) 18:36:33ID:???
>>821
順番の問題でしたか。トホホ・・・
サンクスです。
0823nobodyさん2006/02/22(水) 18:40:23ID:???
レンタルサーバを使用しています。
Jcodeを使用しようと思い
Jcode一式をドキュメントルートのlibフォルダ下へコピーしました。
続いて、test.cgiに
use lib './lib';
use Jcode;
と記述しました。ですが、エラーになります。
ttp://www.aglabo.com/agl/proevo/perl/install/jcode-user.html
ここを見るとこれだけで使えるようなのですが
何が悪いのでしょうか。
0824nobodyさん2006/02/22(水) 19:00:54ID:???
>>823
エラーメッセージをコピペしないところが悪いんじゃないかなと思った

最近はEncodeもJcodeも入ってる貸し鯖が増えてると思ってたんだけど
そうでもないのかな?
0825nobodyさん2006/02/22(水) 19:13:05ID:???
みんなEncodeって使ってる?
utfフラグとかめんどくさくて結局Jcode使ってる。
0826nobodyさん2006/02/22(水) 19:34:27ID:???
>>824
すいません。
エラーは 500 Internal Server Error です。
use Jcodeをevalでくくってもだめでした。
0827nobodyさん2006/02/22(水) 19:37:27ID:???
>>826
うう。そっちじゃなくて、

use CGI::Carp qw(fatalsToBrowser);

を仕込んでおいたら吐いてくれそうなほうのエラーメッセージ。
0828nobodyさん2006/02/22(水) 20:13:43ID:???
うう、すいません。
CGI::Carp使ってみました。
でも500エラーのままかわりません。
use Jcode;をコメントにするとエラーはなくなります。

use Jcode or die("asdf");は無理なんでしょうか?
0829nobodyさん2006/02/22(水) 20:14:51ID:???
>>825
Encodeのある今、Jcodeなんてキモくて使えない。
utfフラグが面倒だったら常にfrom_to使えばいい。
0830nobodyさん2006/02/22(水) 20:22:10ID:???
〜が?になる問題は解決したのか?
0831nobodyさん2006/02/22(水) 20:43:49ID:???
>>830
それは Encode じゃなくて >>830 の側の問題だろ。
0832nobodyさん2006/02/22(水) 21:00:05ID:???
>>831
どう解決するの?
ググり方がよくわからん
答え教えて
0833nobodyさん2006/02/22(水) 21:20:26ID:???
問題の起こるコードを見せれ。
0834nobodyさん2006/02/22(水) 21:37:54ID:???
use lib してないに一票
0835nobodyさんNGNG
>>828
evalして$@でキャッチしろ
0836nobodyさん2006/02/22(水) 22:47:51ID:???
>>823
use lib 'ドキュメントルート/lib;
ってすればいいんじゃないの?
0837nobodyさん2006/02/23(木) 00:36:17ID:???
>>835
山田家の逆襲を参考にファイルごとevalしてみたらこんなのが出ました。

Can't locate auto/Jcode/Unicode/utf8_euc.al in @INC
( (@INC contains:
./lib
/usr/lib/perl5/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/5.8.0
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.0
/usr/lib/perl5/site_perl
/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.0
/usr/lib/perl5/vendor_perl .) at lib/Jcode/Unicode.pm line 64

このline64ってのはコメント除いた行数なんですかね?

>>836
やったけどだめだったんです。
0838nobodyさん2006/02/23(木) 01:12:06ID:???
そりゃ間違った文法だもん
動いたら、それのほうが問題
0839nobodyさん2006/02/23(木) 06:14:00ID:???
eval しろというのは、以下のようにすることをいいまつ。

eval {
require Encode;
};
if ($@) {
print $@;
}

eval 使う時って、use でなくて、require しないと止まるんやね。
あと、eval ブロックは、; セミコロン付けないといけないので、きをつけるべし。
0840nobodyさん2006/02/23(木) 07:29:23ID:???
eval("use Omaemona");
print $@;
…じゃダメなの?

拙い自分用に拙く作ってみました。% hoge.pl Net::SMTP したりして遊ぶ。

#!/usr/local/bin/perl -w

use strict;

if (!$ARGV[0]) {
  die("まじめにトラップする気がない。\n");
}

eval("use $ARGV[0]");

if ($@) {
  print $@, "\n↑読め。\n";
} else {
  print "$ARGV[0]が使える気配。\n";
}
0841 ◆TWARamEjuA NGNG
(´-`).。oO(perl -e 'use Hoge' で十分な気がする。。。)
0842nobodyさんNGNG
>>841
そんな事言ったら perl -MHoge で十分
0843nobodyさん2006/02/23(木) 11:25:13ID:???
お世話になります。
eval("use Jcode");
ではエラなしの様子です。
eval{ Jcode::convert($hoge,"utf8","euc-jp"); };
だと>>837と同じエラがでます。
間違えて
eval{"use Jcode"};
としたときは
Undefined subroutine &Jcode::convert called
とでました。
0844nobodyさん2006/02/23(木) 11:33:40ID:???
perl -e 'eval("use unko");'
これだけ実行すると何もエラー吐かないわけだけど。
0845nobodyさん2006/02/23(木) 12:06:11ID:???
evalしたなら$@で補足しないと意味ないだろ。
perl -e "eval('use unko'); print $@"
0846nobodyさん2006/02/23(木) 12:08:49ID:???
ttp://www.ellinikonblue.com/blosxom/UNIX/20050816Jcode_pm.html
ここみて同じ今年たら解決しました。
お世話になりました。
evalの件は勉強になりました。ありがとうございました。
0847nobodyさん2006/02/23(木) 16:06:00ID:???
>>845
それで、藻前が書いた unko は本当に拾えるんか?
0848nobodyさん2006/02/23(木) 20:01:33ID:???
例に下ネタがある時点で答える気0
0849nobodyさん2006/02/23(木) 23:51:28ID:???
「埼玉県蕨市ヘロ」というバイナリ文字が入力されたらしく、
SQL発行(insert)時に止まってエラーになったみたいなの
ですが、この現象を回避する方法をご教示いただけますと
幸いです。

DBはPgモジュールを使用し、Postgresで管理しております。

たしかにコマンド直打ちでSQLを実行してみると、ターミナルが
停止してしまいます。。
0850nobodyさん2006/02/23(木) 23:52:30ID:???
MySQL で UTF-8 を使うようにして解決。
0851nobodyさん2006/02/23(木) 23:53:17ID:???
>>849
漢字コードとかも書きましょう。DBのテーブル側も。
0852nobodyさん2006/02/23(木) 23:56:18ID:???
CDBI とか DBIC とか使うとどうだろう。
ちゃんとエスケープしてくれるんじゃないかな。
0853nobodyさん2006/02/23(木) 23:57:35ID:???
すみません。
肝心のバイナリが貼り付けられませんでした。

「蕨市」と「ヘロ」の間には、エディタで開いて「SV」という
反転文字が入っております。
コードはSJIS→EUCに変換したものです。
0854nobodyさん2006/02/23(木) 23:58:36ID:???
> 「埼玉県蕨市ヘロ」というバイナリ文字が入力されたらしく、

元の文字列って何だろう?
そういうことも示せないってのは馬鹿かなにか?
08558492006/02/24(金) 00:22:49ID:???
皆様の早急なご返答、誠に感謝しております。
本当にありがたいです。。

もう少し具体的に説明させていただきますと、フォームはSJIS
ですので、入力があった文字はプログラムの先頭でEUCに
変換されます。

それをSQLにいれてinsertするのですが、その際に

「蕨市 〒ヘロ1-5-15」
    ↑
血管が浮き出るようなマーク

このような文字列でSQLが止まってしまっていることが発覚し、
改修していたのですが、どうしてもこのバイナリを処理すること
ができず困り果て質問させていただきました。

バイナリ文字は秀丸エディタで開くと、「SV」という反転文字が
入っております。

説明不足で申し訳ありません。
■ このスレッドは過去ログ倉庫に格納されています