Perlについての質問箱 29箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/12/21(木) 22:35:39"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3
前スレ
Perlについての質問箱 28箱目
http://pc8.2ch.net/test/read.cgi/tech/1162273941/
リンク集は>>2-3
過去スレは>>4
0232デフォルトの名無しさん
2007/01/08(月) 14:02:13Text::CSV_XSでbinaryオプションつけないとダメだ。
0233デフォルトの名無しさん
2007/01/08(月) 14:07:57返信ありがとうございます。おかげで解決することができました
ただ、「\Q」が「\Eまでのメタ文字をリテラルとして判断する」のは別ったのですが
「/$in{'test'}/」←これのどこにメタ文字があるのかが分らないです
解決はしたけど理解出来てない…
0234デフォルトの名無しさん
2007/01/08(月) 14:25:47「ー」はShiftJISで0x81 0x5Bと表される。この2バイト目が'[' = 0x5B
他にもソ('\')とか+('{')とか色々。
文字コードの割り当て参考資料
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html
ASCIIコード表
ttp://adlib.rsch.tuis.ac.jp/~akira/lect/softa/ascii.html
0235デフォルトの名無しさん
2007/01/08(月) 14:31:01「$in{'test'}」自体がメタ文字を含むってことじゃなくて、
実行時に変数$in{'test'}にメタ文字を含むShiftJIS文字が入る可能性があるってこと。
0236デフォルトの名無しさん
2007/01/08(月) 14:51:17かなり見当違いな考えをしてたみたいですね
「ー」以外にも注意しなければいけない文字が結構ありますね
ご丁寧にありがとうございました
0237デフォルトの名無しさん
2007/01/08(月) 16:52:091: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz <[email protected]>
Provide: Archive::Zip version 1.18
Require: File-Which
Require: PathTools
Repo: trouchelle
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
2: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Adam Kennedy ([email protected])
Provide: Archive::Zip version 1.18
Provide: Archive::Zip::BufferedFileHandle
Provide: Archive::Zip::MemberRead
Provide: Archive::Zip::MockFileHandle
Require: File-Which
Repo: ActiveState Package Repository
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
3: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz ([email protected])
Require: Compress-Zlib
Repo: bribes
CPAN: http://search.cpan.org/dist/Archive-Zip-1.18/
Installed: 1.18 (perl)
こんな感じです。
0238デフォルトの名無しさん
2007/01/08(月) 17:32:10おもったが、他の文字コードに変換してsplitするのはどうよ。
いちばんお手軽。
open(IN,"$file");
while(1) {
$line = <IN>;
$line=Jcode->new($line)->euc;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}
if ( $data[0] =~ /$in{'test'}/ ) {
print Jcode->new("$data[1]\n")->sjis;
}
}
close(IN);
0239デフォルトの名無しさん
2007/01/08(月) 17:41:21"$file" とかって、ダブルクォートで括って書くの無駄だよね。
全く同じ内容の、新しい文字列を生成してる訳でしょ?
だったら単に $file って書いた方が効率良いのに。
KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。
こういう書き方してる人が、どこで習ってくるのか知りたい。
0240デフォルトの名無しさん
2007/01/08(月) 17:51:09$in{'test'}が正規表現の場合の話か。
EUCにするくらいなら、変換に多少コストが掛かるがUTF-8にして処理したほうがいいと思う。
今度は>>176こういう問題が発生する。SJISでも率は低いが起こるけれどね。
ってもしかして元質問も正規表現を入力する質問だったんだろか…
indexの代わりにマッチングを行ってるだけかと思って\Q\Eで答えちゃったけれども
>>239
最近は見ないけれど
print "@hoge";
とやっておいてなんか表示が変だと質問してくる人までいるから困る。
ついでにperlfaq
ttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#What_s_wrong_with_always_quoting
0241デフォルトの名無しさん
2007/01/09(火) 00:43:01あ、それ昔やってた。
なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。
0242デフォルトの名無しさん
2007/01/09(火) 00:46:26print $a, $b; #とすればいいところを
print $a . %b; #としていた時代や
print "$a$b"; #としていた時代があったなあ
0243デフォルトの名無しさん
2007/01/09(火) 01:05:55そっちの方が速いんだけどね。
0244デフォルトの名無しさん
2007/01/09(火) 01:39:08オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。
0245244
2007/01/09(火) 01:46:320246デフォルトの名無しさん
2007/01/09(火) 12:09:24散々既出だが、一応突っ込んどく。カンマの方が遲い
use Benchmark ;
my ( $hoge, $moge ) = ( 'hoge', 'moge' ) ;
sub dot { print STDERR $hoge . $moge . "\n" ; }
sub dq { print STDERR "$hoge$moge\n" ; }
sub comma{ print STDERR $hoge , $moge , "\n" ; }
timethese ( 1000000, { op1 => 'dot', op2 => 'dq', op3 => 'comma' } ) ;
$ perl Bench.pl 2> /dev/null
Benchmark: timing 1000000 iterations of op1, op2, op3...
op1: 15 wallclock secs ( 7.67 usr + 4.81 sys = 12.48 CPU) @ 80128.21/s (n=1000000)
op2: 12 wallclock secs ( 7.37 usr + 4.67 sys = 12.04 CPU) @ 83056.48/s (n=1000000)
op3: 22 wallclock secs ( 9.13 usr + 11.23 sys = 20.36 CPU) @ 49115.91/s (n=1000000)
0247243
2007/01/09(火) 13:10:54初心者でゴメン。Windowsだから、nulに出力して実行してみた。
(Windows XP SP2 ActivePerl5.8)
Benchmark: timing 10000000 iterations of op1, op2, op3...
op1: 12 wallclock secs (11.02 usr + -0.02 sys = 11.00 CPU) @ 909173.56/s
(n=10000000)
op2: 12 wallclock secs (10.87 usr + 0.00 sys = 10.87 CPU) @ 919540.23/s
(n=10000000)
op3: 8 wallclock secs ( 7.02 usr + 0.00 sys = 7.02 CPU) @ 1425516.75/s
(n=10000000)
あれ?最初自分の考えでは関数を二回使ってるカンマの方が遅いと思ってたんだけど、
ベンチしたらドットの方が速いんで>>243を書いた。
なんで結果違くなっちゃうのか誰か教えて〜。
0248243
2007/01/09(火) 13:29:23systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。>>246
Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。
ここらへんはLinuxとWindowsで違うんだろうね。
0249デフォルトの名無しさん
2007/01/09(火) 14:06:58うんにゃ。
8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。
$hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。
0250デフォルトの名無しさん
2007/01/10(水) 01:42:28いや、>>246はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。
STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。
なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。
他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。
0251デフォルトの名無しさん
2007/01/10(水) 04:22:120252デフォルトの名無しさん
2007/01/10(水) 15:25:22多いように感じるんだけど、これってどうなんだろう。
掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。
意見求みまする。
0253デフォルトの名無しさん
2007/01/10(水) 15:43:02インスコするファイルがたくさんあるとお子様が混乱してしょうもない
質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル
では得らしい。
0254デフォルトの名無しさん
2007/01/10(水) 15:51:55今、plファイルのwindows向けのアイコンを何となく作っていますが、
真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?
0255デフォルトの名無しさん
2007/01/10(水) 16:07:310256デフォルトの名無しさん
2007/01/10(水) 16:18:380257デフォルトの名無しさん
2007/01/10(水) 16:25:410258デフォルトの名無しさん
2007/01/10(水) 20:00:56現在、perl(HPUX)とNet-Telnet-3.03を利用してtelnet接続しているのですが、
telnet中にESCキーを入力させる事は可能なのでしょうか?
perl:v5.8.0 built for PA-RISC1.1-thread-multi
telnet:Net-Telnet-3.03
対話式なプログラムを実行していき、途中で
どうしてもESCキーが必要になりました。
$telnet->print("\x1B");
こんな感じで文字コード入力でもダメでした。。
0259韋駄天はふと考えた
2007/01/10(水) 23:02:232回もパソコンをウイルスによって不調になり使えなくなりました。
私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を
あまりにも野放にしすぎました。
その結果が自作自演ウイルスバラ撒きの悪徳商法です。
703 :韋駄天はふと考えた :2007/01/10(水) 22:11:17 ID:ZKnpXOph
ノートンがウイルスを検出しました。
あなたのパソコンを60日間に渡り78250個ものウイルスから守ってきました。
もうすぐ無料期間が終わりますので、ウイルス対策有料ソフトを購入してください。
はぁ????なにいってんの?なんで、たった60日間で78250個ものウイルスが進入してくんだよ?
明らかに自作自演目的の業者の仕業じゃねえか?
犯人はおまえらだろが!この犯罪者かぶれの集団が!!
あちこちのサイトを開く度にコンピューターウイルスがパソコンにバンバン進入してくる。
おまえらな!自分で作ったサイトにコンピューターウイルスを混ぜて、他人の
何十万台ものパソコンを不調にさせたり故障させて、ウイルス対策ソフトを
高額で売りつけてまで儲けたいのかよ?
自転車屋が地域の自転車をパンクさせて回ったり、消防士が管轄地域で放火して
回るのと同じ犯罪をおまえらがやっているんだよ!
てめえらで新たなコンピューターウイルスを次々に作ってはバラ撒いては、ウイルス対策ソフトを
高値で売りつける自作自演商売しやがって!
この腐れ外道共が! 恥知らずの犯罪者共めが!
0260デフォルトの名無しさん
2007/01/10(水) 23:06:09でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)
0261デフォルトの名無しさん
2007/01/11(木) 00:08:30公式のらくだの絵をちょっと使って作ってみました。
>>256
あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。
>>260
一応Perlの文字を入れました。
どうもでした。
0262デフォルトの名無しさん
2007/01/11(木) 01:01:46seek , getc等で1文字単位で読むしかないかな?
0263デフォルトの名無しさん
2007/01/11(木) 01:09:57つFile::ReadBackwards
0264デフォルトの名無しさん
2007/01/11(木) 01:15:30ありがとうございます。
0265デフォルトの名無しさん
2007/01/11(木) 17:03:13aを1文字の文字列、$bを数字とし、上の行から$aを$b回と表示していき、3角形を描くプログラム。
というのが出ています。
print "a? ";
chomp($a=<stdin>);
print "b? ";
chomp($b=<stdin>);
でaに+をいれ、bに5といれると
+
++
+++
++++
+++++
こんな感じで表示させたいです。
for文の入れ子でやると思うのですが、表記がわかりません。
ヒントだけでもいただけないでしょうか?
0266デフォルトの名無しさん
2007/01/11(木) 17:09:130267デフォルトの名無しさん
2007/01/11(木) 17:19:33おぞましいコードを期待してるかもしれないんだけど
for (my $line=1; $line <= $b; ++$line) {
for (my $num=1; $num <= $line; ++$num) {
print $a;
}
print "\n";
}
こういう風に簡潔にかける。
for my $num (1..$b) {
print $a x $num, "\n";
}
0268デフォルトの名無しさん
2007/01/11(木) 17:21:580269265
2007/01/11(木) 17:33:51できました。ありがとうございます。
入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw
もし入れ子でやるとしたら
入れ子の方の後半部分の
print $a;
}
print "\n";
}
はどういうことでしょうか?
0270デフォルトの名無しさん
2007/01/11(木) 17:34:370271デフォルトの名無しさん
2007/01/11(木) 17:54:510272デフォルトの名無しさん
2007/01/11(木) 18:12:08お決まりなんだけどね。
0273デフォルトの名無しさん
2007/01/11(木) 18:21:320274デフォルトの名無しさん
2007/01/11(木) 18:58:59いっそのことCPANで(笑
0275267
2007/01/11(木) 19:02:50(${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g;
こうですか?わかりません><
0276デフォルトの名無しさん
2007/01/11(木) 19:17:380277デフォルトの名無しさん
2007/01/11(木) 19:26:010278デフォルトの名無しさん
2007/01/11(木) 20:25:300279デフォルトの名無しさん
2007/01/11(木) 20:27:110280デフォルトの名無しさん
2007/01/12(金) 02:12:36不毛だ…
0281デフォルトの名無しさん
2007/01/12(金) 02:31:38以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも
データを取得してしまいます。
このような2バイト文字を取得しないようにするには
どの様に修正すればいいですか?
if ( $_ =~ "@" ) {
$data[$i++] = $_;
}
0282デフォルトの名無しさん
2007/01/12(金) 03:56:45当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
0283デフォルトの名無しさん
2007/01/12(金) 04:00:480284デフォルトの名無しさん
2007/01/12(金) 04:08:40orz
CGIはスレ違いだったんですね。本当にごめんなさい。
一日考え続けてて疲れてたのか、>>1を確認するのを失念してました。
向こうの初心者質問スレで質問してくる事にします。
スレ汚し失礼しました。
0285デフォルトの名無しさん
2007/01/12(金) 04:14:03まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=http://www.xxx.com/index.php?%A5%AC%A5
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「http://www.xxx.com/index.php?%A5%AC%A5」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
0286デフォルトの名無しさん
2007/01/12(金) 04:20:09ありえない誤爆・・・。
ほんっとうにごめんなさい・・・。
0287デフォルトの名無しさん
2007/01/12(金) 04:23:330288281
2007/01/12(金) 04:29:08おさわがせしました。
0289デフォルトの名無しさん
2007/01/13(土) 00:44:28うーんうーん悩んでいた時のことを思い出した。
そういや、半角英字を全角英字に置換することってできるの?
0290デフォルトの名無しさん
2007/01/13(土) 00:53:020291デフォルトの名無しさん
2007/01/13(土) 01:42:350292デフォルトの名無しさん
2007/01/13(土) 22:09:16こちらでお聞きします。
キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?
0293デフォルトの名無しさん
2007/01/13(土) 22:10:05そのころと比べるとかなりPerlは寂れた?
0294デフォルトの名無しさん
2007/01/13(土) 22:34:22Term::Getch
0295デフォルトの名無しさん
2007/01/14(日) 00:42:13ここから、1位=N、2位=S、3位=E、4位=W、という結果を出したいと思っています。
得点が同点の場合、E→S→W→Nの順で優先となります。
とりあえず、$rank{E}='15000',$rank{S}='20000',,,として、
if(($rank{E}>=$rank{S})&&($rank{E}>=$rank{W})&&($rank{E}>=$rank{N})){
#E=1位
#SとWとNで2位以下の判別
#何かと何かで3位と4位の判別
} elsif (($rank{S}>=$rank{W})&&.......
#S=1位
#EとWとNで2位以下の判別
#何かと何かで3位と4位の判別
}elsif(..
と、やり始めましたが、とてつもない作業になりそうです。
何か、よい解決法がございましたらご示唆お願いします。
0296デフォルトの名無しさん
2007/01/14(日) 00:49:18@result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;
0298デフォルトの名無しさん
2007/01/14(日) 01:06:36# こんな配列
my @results = ("E:15000", "S:20000", "W:15000", "N:50000");
# 得点が同点の場合の順
my %prio_of = (
E => 0, S => 1, W => 2, N => 3,
);
my @s_results = map { $_->[0] }
sort { $b->[2] <=> $a->[2] || $prio_of{$a->[1]} <=> $prio_of{$b->[1]} }
map { [ $_, (split/:/=>$_)] } @results;
0299デフォルトの名無しさん
2007/01/14(日) 01:23:07随分長い間Perlから離れてるので間違ってるかも知れないけど
$foo = '2000';
と文字列にしておいて、その後で $foo を数値として使った場合、
スカラ変数の構造体は、
文字列型のものから、数値も文字列も両方入る奴に切り替わる。
構造体切り替えの手間もあるし、構造体のサイズも大きくなるから非効率
…だったような気がする。
0300295
2007/01/14(日) 01:43:35>>296 様
すみません、説明が不足していました(ということに気づくのに、いただいた式を
眺めながらかなり時間がかかりました・・・)。実は、EやSが変数の中に出てくる
順番は毎回変わる可能性がありました。申し訳ありません。
>>298 様
欲しい結果が出せました。ただ、内容の理解には私にはまだまだ時間がかかりそうです・・
なんとか少しずつ、吟味していきたいと思います。
>>297 様
わかりましたか。そのとおりです。
皆様、すばらしいご教授、どうもありがとうございました。
0301デフォルトの名無しさん
2007/01/14(日) 01:59:22perl は型はなしでしょ。
$foo = '2000';
も
$foo = 2000;
は同じでしょ。
0302デフォルトの名無しさん
2007/01/14(日) 02:13:38つ [perlguts]
つ [Devel::Peek]
0303デフォルトの名無しさん
2007/01/14(日) 02:45:43もちっと教えてくれんかのう。
perldataには
「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、
あるいはその他の型であるように宣言する方法はありません。」
とあるかんだけど、それとは違うレベルで何かあるのか?
0304デフォルトの名無しさん
2007/01/14(日) 03:03:20> Double-Typed SVs
> スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、
> 蓄積されている型から要求されている型へ、自動的に変換を行ないます。
0306303
2007/01/14(日) 03:57:55どうもありがとう。
文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。
しかし、シンタックス上
$foo = '2000';
と
$foo = 2000;
に違いがあるとは読み取れませんでした。
#$foo = '2000' . '';
#と
#$foo = 2000 + 0;
#が違うのはわかりますよ。
0307303
2007/01/14(日) 04:24:03$foo = 2000;
の場合数値コンテキストになるんだ。(そりゃそうか)
0308デフォルトの名無しさん
2007/01/14(日) 13:40:27ワロタ
なんていわれたの?w
0309デフォルトの名無しさん
2007/01/14(日) 14:38:20先生がこのスレを見ていたか
どっちかな
0310デフォルトの名無しさん
2007/01/14(日) 14:54:53>半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
>うーんうーん悩んでいた時のことを思い出した。
>そういや、半角英字を全角英字に置換することってできるの?
次スレのテンプレ予定の>>115に忠実に従えば、
tr/a-zA-Z/a-zA-Z/
でできる。
0311デフォルトの名無しさん
2007/01/14(日) 14:58:44こういうテクニック(?)を思い出したんですけど、どこに書かれていたものでしょうか。
0312デフォルトの名無しさん
2007/01/14(日) 15:01:00use Devel::Peek;
$foo1 = '2000';
Dump $foo1;
$foo2 = 2000;
Dump $foo2;
↓
SV = PV(0x363bc) at 0x18aef9c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x3dc2c "2000"\0
CUR = 4
LEN = 8
SV = IV(0x18a68b8) at 0x18af02c
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2000
0313299
2007/01/14(日) 20:42:44use Devel::Peek;
$foo = '2000';
Dump $foo;
$foo += 1;
Dump $foo;
SV = PV(0x1801660) at 0x180b5a8
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5
SV = PVIV(0x1801a20) at 0x180b5a8
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2001
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5
この状態でFLAGSをC側からいじると、
文字列として表示した時と、数値として使った時で別の値を出すスカラ
とか作れちゃうんだよね。
0314デフォルトの名無しさん
2007/01/14(日) 22:35:50実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
ttp://search.cpan.org/~dconway/Contextual-Return-v0.1.0/lib/Contextual/Return.pm
use Contextual::Return;
$contextual = NUM { 10 } STR { 'abc' };
print $contextual . '';
print $contextual + 0;
0315314
2007/01/14(日) 22:43:39313はスカラを作ると言うことで代入した別の値を保持まで出来たりするのかな
0316デフォルトの名無しさん
2007/01/14(日) 23:55:020317デフォルトの名無しさん
2007/01/14(日) 23:56:11ttp://search.cpan.org/~gbarr/Scalar-List-Utils-1.19/lib/Scalar/Util.pm
0318デフォルトの名無しさん
2007/01/14(日) 23:59:37スルーしてた。xs を使って実現したのが Scalar::Util の dualvar ってことっすね。
0319デフォルトの名無しさん
2007/01/15(月) 00:09:24作った後で代入し直したら、片方だけ(数値だけ or 文字列だけ)になっちゃった。
ということは、xsでフラグいじって IOK, POK 両方立てても
代入したら片方になっちゃうということか。
オブジェクトにして代入まで見張れば良いんだろうけど。
0320デフォルトの名無しさん
2007/01/15(月) 01:57:29method=getで受けとった部分が文字化けしてしまいます。method=postは大丈夫でした。
よろしくお願いします。
↓の一番下の部分も参考にしましたが直りませんでした。
http://tech.bayashi.net/pdmemo/chara2.html
apache perlは↓のサイトを参考に構築してあります。
http://www.y-kit.jp/saba/
------------------------------
環境
Apache/2.0.59 (Win32) PHP/5.1.4
------------------------------
コード例
require './jcode.pl';
#GET用
$myindata=$ENV{'QUERY_STRING'};
#POST用
#read( STDIN, $myindata, $ENV{ 'CONTENT_LENGTH' } );
#$myindata =~ tr/+/ /;
#$myindata =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;
&jcode'convert( *value, 'sjis' );
print "Content-type: text/html\n\n";
print $myindata;
------------------------------
getデータ
http://localhost/bbsmt/write.cgi?name=a&mail=&message=あいうえお&a=11
表示データ
name=a&mail=&message=???¢???|?¨&ip=&a=11
0321デフォルトの名無しさん
2007/01/15(月) 02:03:070322デフォルトの名無しさん
2007/01/15(月) 12:39:35そのまま別のサーバに移動したら読み込めなくなりました。
dbmファイルは.dirと.pagの2つじゃない方(1つのファイル)です。
古いサーバはもう使えません。新しいサーバでdbmファイル
を読む方法はないでしょうか…。
0323デフォルトの名無しさん
2007/01/15(月) 14:43:05質問する時はまず環境を説明しろ!
(古い方と新しい方それぞれのOSの種類とバージョン,Perlのバージョン)
あと、読めなくなったってのはどんなエラーメッセージが来てるのかも報告汁
0324デフォルトの名無しさん
2007/01/15(月) 19:18:22ヒントになるかわからんが
NDBM_File
DB_File
GDBM_File
SDBM_File
ODBM_File
0325320
2007/01/15(月) 20:46:350326322
2007/01/15(月) 20:58:26dbmファイルはテキストなどに書き出しておかないとバイナリでサーバを移しても
読めないのだと思っていました。dbmopen()で読み書きしていたので、どの
形式のDBMかわからなかったのです。
0327デフォルトの名無しさん
2007/01/16(火) 05:56:00指定されたディレクトリのディレクトリハンドルを開いて
ディレクトリ内のファイル名を取得するスクリプトを書いたのですが
名前が長いファイルがあるとそのファイルと、それ以降のエントリが
ディレクトリハンドルから取得できないんだけど
なんで?これどうすれば回避できる?
環境: Windows XP + ActivePerl5.8.8 build819
0328デフォルトの名無しさん
2007/01/16(火) 07:04:48お前の書いたスクリプトを透視した上で回答してくれるのを待つことだ
0329327
2007/01/16(火) 10:55:47再現スクリプトを下記に示します。
DirHandle以外にopendirでディレクトリハンドル開いたり、
globを使ってみたけど結果はおんなじでした。
----
#!/usr/local/bin/perl
use strict;
use utf8;
use warnings;
use FindBin;
use DirHandle;
use Data::Dumper;
my $dh = DirHandle->new($FindBin::Bin) or die $!;
my @entries = $dh->read;
print Dumper(\@entries);
__END__
----
0330デフォルトの名無しさん
2007/01/16(火) 10:58:290331デフォルトの名無しさん
2007/01/16(火) 11:02:27foreach( sort(glob("*")) ){
if(-d){
@local_dir = (@local_dir,$_) ;
}elsif(-f){
@local_file = (@local_dir,$_) ;
}else{
print "Not Support Format -> $_\n" ;
}
}
ファイルとディレクトリに分けたいのですが、
ローカルだと上記のようにできますが、(他にスマートなやり方があるかもしれませんが。。)
ftp上のファイルを区別する方法はありますでしょうか。
以下ではどちらも同じファイルを取得してしまいます。
use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach( $ftp->ls("./") ){
print "$_\n" ;
}
foreach( $ftp->dir("./") ){
print "$_\n" ;
}
$ftp->quit;
■ このスレッドは過去ログ倉庫に格納されています