Perlについての質問箱 ..
[2ch|▼Menu]
237:デフォルトの名無しさん
07/01/08 16:52:09
>>230
1: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz <perl@bike-nomad.com>
Provide: Archive::Zip version 1.18
Require: File-Which
Require: PathTools
Repo: trouchelle
CPAN: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
2: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Adam Kennedy (cpan@ali.as)
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: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
3: Archive-Zip
Provide an interface to ZIP archive files.
Version: 1.18
Author: Ned Konz (perl@bike-nomad.com)
Require: Compress-Zlib
Repo: bribes
CPAN: URLリンク(search.cpan.org)
Installed: 1.18 (perl)
こんな感じです。

238:デフォルトの名無しさん
07/01/08 17:32:10
>>227
おもったが、他の文字コードに変換して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);


239:デフォルトの名無しさん
07/01/08 17:41:21
たまに思うのだが、単なる文字列のスカラを
"$file" とかって、ダブルクォートで括って書くの無駄だよね。
全く同じ内容の、新しい文字列を生成してる訳でしょ?
だったら単に $file って書いた方が効率良いのに。

KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。
こういう書き方してる人が、どこで習ってくるのか知りたい。


240:デフォルトの名無しさん
07/01/08 17:51:09
>>238
$in{'test'}が正規表現の場合の話か。

EUCにするくらいなら、変換に多少コストが掛かるがUTF-8にして処理したほうがいいと思う。
今度は>>176こういう問題が発生する。SJISでも率は低いが起こるけれどね。

ってもしかして元質問も正規表現を入力する質問だったんだろか…
indexの代わりにマッチングを行ってるだけかと思って\Q\Eで答えちゃったけれども

>>239
最近は見ないけれど
print "@hoge";
とやっておいてなんか表示が変だと質問してくる人までいるから困る。

ついでにperlfaq
URLリンク(www.kt.rim.or.jp)

241:デフォルトの名無しさん
07/01/09 00:43:01
>>239
あ、それ昔やってた。
なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。

242:デフォルトの名無しさん
07/01/09 00:46:26
#俺にも
print $a, $b; #とすればいいところを
print $a . %b; #としていた時代や
print "$a$b"; #としていた時代があったなあ

243:デフォルトの名無しさん
07/01/09 01:05:55
カンマは直接に文字連結の意味じゃないから余り好きじゃないなぁ。。
そっちの方が速いんだけどね。

244:デフォルトの名無しさん
07/01/09 01:39:08
強制的に文字列コンテキストに変えたいときとか。
オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。

245:244
07/01/09 01:46:32
ちゃんと読んでなかった。スマソ

246:デフォルトの名無しさん
07/01/09 12:09:24
>>243
散々既出だが、一応突っ込んどく。カンマの方が遲い

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)

247:243
07/01/09 13:10:54
>>246
初心者でゴメン。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を書いた。
なんで結果違くなっちゃうのか誰か教えて〜。

248:243
07/01/09 13:29:23
あー、わかった。Perlでの出力処理はcommaの方が速いけど、
systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。>>246
Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。
ここらへんはLinuxとWindowsで違うんだろうね。

249:デフォルトの名無しさん
07/01/09 14:06:58
>>246
うんにゃ。

8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。
$hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。

250:デフォルトの名無しさん
07/01/10 01:42:28
>>248
いや、>>246はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。

STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。
なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。
他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。

251:デフォルトの名無しさん
07/01/10 04:22:12
えっちだから遅いんだね。

252:デフォルトの名無しさん
07/01/10 15:25:22
フリーウェアのソースを眺めてると、一つのファイルにやたらと機能を詰め込んでるのが
多いように感じるんだけど、これってどうなんだろう。
掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。
意見求みまする。

253:デフォルトの名無しさん
07/01/10 15:43:02
>>252
インスコするファイルがたくさんあるとお子様が混乱してしょうもない
質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル
では得らしい。


254:デフォルトの名無しさん
07/01/10 15:51:55
コーディング外の質問です。
今、plファイルのwindows向けのアイコンを何となく作っていますが、
真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?

255:デフォルトの名無しさん
07/01/10 16:07:31
当然らくだ

256:デフォルトの名無しさん
07/01/10 16:18:38
PARのparl.exe

257:デフォルトの名無しさん
07/01/10 16:25:41
>>256

258:デフォルトの名無しさん
07/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");
こんな感じで文字コード入力でもダメでした。。

259:韋駄天はふと考えた
07/01/10 23:02:23
あなた達も↓のような経験が一度や二度あるでしょう。私はわずか4年の間に
2回もパソコンをウイルスによって不調になり使えなくなりました。
私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を
あまりにも野放にしすぎました。
その結果が自作自演ウイルスバラ撒きの悪徳商法です。

703 :韋駄天はふと考えた :2007/01/10(水) 22:11:17 ID:ZKnpXOph
ノートンがウイルスを検出しました。
あなたのパソコンを60日間に渡り78250個ものウイルスから守ってきました。
もうすぐ無料期間が終わりますので、ウイルス対策有料ソフトを購入してください。

はぁ????なにいってんの?なんで、たった60日間で78250個ものウイルスが進入してくんだよ?
明らかに自作自演目的の業者の仕業じゃねえか?

犯人はおまえらだろが!この犯罪者かぶれの集団が!!

あちこちのサイトを開く度にコンピューターウイルスがパソコンにバンバン進入してくる。

おまえらな!自分で作ったサイトにコンピューターウイルスを混ぜて、他人の
何十万台ものパソコンを不調にさせたり故障させて、ウイルス対策ソフトを
高額で売りつけてまで儲けたいのかよ?

自転車屋が地域の自転車をパンクさせて回ったり、消防士が管轄地域で放火して
回るのと同じ犯罪をおまえらがやっているんだよ!

てめえらで新たなコンピューターウイルスを次々に作ってはバラ撒いては、ウイルス対策ソフトを
高値で売りつける自作自演商売しやがって!

この腐れ外道共が!    恥知らずの犯罪者共めが!

260:デフォルトの名無しさん
07/01/10 23:06:09
>254
でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)

261:デフォルトの名無しさん
07/01/11 00:08:30
>>255
公式のらくだの絵をちょっと使って作ってみました。
>>256
あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。
>>260
一応Perlの文字を入れました。

どうもでした。

262:デフォルトの名無しさん
07/01/11 01:01:46
ファイルを最終行から順にさかのぼって読む方法ないですか?
seek , getc等で1文字単位で読むしかないかな?

263:デフォルトの名無しさん
07/01/11 01:09:57
>>262
つFile::ReadBackwards

264:デフォルトの名無しさん
07/01/11 01:15:30
>>263
ありがとうございます。


265:デフォルトの名無しさん
07/01/11 17:03:13
課題で
aを1文字の文字列、$bを数字とし、上の行から$aを$b回と表示していき、3角形を描くプログラム。
というのが出ています。

print "a? ";
chomp($a=<stdin>);
print "b? ";
chomp($b=<stdin>);

でaに+をいれ、bに5といれると

+
++
+++
++++
+++++

こんな感じで表示させたいです。
for文の入れ子でやると思うのですが、表記がわかりません。
ヒントだけでもいただけないでしょうか?

266:デフォルトの名無しさん
07/01/11 17:09:13
bに1を足してaをb個並べてプリントしたら改行を繰り返す

267:デフォルトの名無しさん
07/01/11 17:19:33
forの入れ子でやるとかいうと、もしかしたらこういう
おぞましいコードを期待してるかもしれないんだけど
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";
}

268:デフォルトの名無しさん
07/01/11 17:21:58
あと $a と $b は sort とかで使われるから使うなといっとけ

269:265
07/01/11 17:33:51
>>267
できました。ありがとうございます。
入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw

もし入れ子でやるとしたら
入れ子の方の後半部分の
print $a;
}
print "\n";
}
はどういうことでしょうか?

270:デフォルトの名無しさん
07/01/11 17:34:37
すぐ答え出す奴ってなんなの・・・

271:デフォルトの名無しさん
07/01/11 17:54:51
漁師さん

272:デフォルトの名無しさん
07/01/11 18:12:08
こういう場合は普通、for文を使わずにトリッキーなコードを書いてあげるのが
お決まりなんだけどね。

273:デフォルトの名無しさん
07/01/11 18:21:32
print map { $a x $_ . "\n" } 1..$b;



274:デフォルトの名無しさん
07/01/11 18:58:59
チューニングした答え書いて分かるかよ。
いっそのことCPANで(笑

275:267
07/01/11 19:02:50
$a='+';$b=5;$t=0;
(${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g;

こうですか?わかりません><

276:デフォルトの名無しさん
07/01/11 19:17:38
$^Nなんて使ってるのはじめてみた(笑)

277:デフォルトの名無しさん
07/01/11 19:26:01
(笑)なんて使ってるのはじめてみた(笑)

278:デフォルトの名無しさん
07/01/11 20:25:30
確かにな(藁

279:デフォルトの名無しさん
07/01/11 20:27:11
まぁ、ありえない

280:デフォルトの名無しさん
07/01/12 02:12:36
print map "$_¥n", unpack +( join '', map "A${_}X${_}", 1..$b ), $a x $b ;
不毛だ…

281:デフォルトの名無しさん
07/01/12 02:31:38
$_が半角文字"@"(0x40)を含むときのみデータを取得したいのですが、
以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも
データを取得してしまいます。
このような2バイト文字を取得しないようにするには
どの様に修正すればいいですか?

if ( $_ =~ "@" ) {
 $data[$i++] = $_;
}


282:デフォルトの名無しさん
07/01/12 03:56:45
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=URLリンク(www.xxx.com)
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「URLリンク(www.xxx.com)」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。

283:デフォルトの名無しさん
07/01/12 04:00:48
>1に全てが隠されているんじゃないだろうか。

284:デフォルトの名無しさん
07/01/12 04:08:40
>>283
orz
CGIはスレ違いだったんですね。本当にごめんなさい。
一日考え続けてて疲れてたのか、>>1を確認するのを失念してました。
向こうの初心者質問スレで質問してくる事にします。
スレ汚し失礼しました。

285:デフォルトの名無しさん
07/01/12 04:14:03
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz

CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。

具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=URLリンク(www.xxx.com)
と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。

渡されてきたURLを「URLリンク(www.xxx.com)」のように、
そのまま表示するにはどうしたらいいでしょうか?

一応書いておくと、スクリプトはUTF-8Nで書いています。

286:デフォルトの名無しさん
07/01/12 04:20:09
ぎゃー!!!
ありえない誤爆・・・。

ほんっとうにごめんなさい・・・。

287:デフォルトの名無しさん
07/01/12 04:23:33
>1に全てが隠されているんじゃないだろうか。

288:281
07/01/12 04:29:08
自己解決しました。
おさわがせしました。

289:デフォルトの名無しさん
07/01/13 00:44:28
>>281見てて、ふと、半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
うーんうーん悩んでいた時のことを思い出した。
そういや、半角英字を全角英字に置換することってできるの?

290:デフォルトの名無しさん
07/01/13 00:53:02
use utf8やるとか。

291:デフォルトの名無しさん
07/01/13 01:42:35
EncodeもあるしUnicode::Japaneseもあるし。

292:デフォルトの名無しさん
07/01/13 22:09:16
WebProg板に書いたけど、こっちの方がふさわしそうなので
こちらでお聞きします。

キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、
C言語でいうところの、getch() に相当する関数はないでしょうか?

293:デフォルトの名無しさん
07/01/13 22:10:05
4年前ぐらいまでPG兼SEをしていたのだが、
そのころと比べるとかなりPerlは寂れた?


294:デフォルトの名無しさん
07/01/13 22:34:22
>>292
Term::Getch

295:デフォルトの名無しさん
07/01/14 00:42:13
こんな配列 @result=("E:15000", "S:20000", "W:15000", "N:50000")を作りまして
ここから、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(..
と、やり始めましたが、とてつもない作業になりそうです。
何か、よい解決法がございましたらご示唆お願いします。



296:デフォルトの名無しさん
07/01/14 00:49:18
普通にソートすりゃいいやん

@result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;

297: ◆TWARamEjuA
07/01/14 01:04:42 BE:1633853-BRZ(6701)
とん・なん・しゃー・ぺー♪

298:デフォルトの名無しさん
07/01/14 01:06:36
use strict;
# こんな配列
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;


299:デフォルトの名無しさん
07/01/14 01:23:07
数値として使う予定の変数を、文字列で宣言するのって確か非効率だよね。

随分長い間Perlから離れてるので間違ってるかも知れないけど
$foo = '2000';
と文字列にしておいて、その後で $foo を数値として使った場合、
スカラ変数の構造体は、
文字列型のものから、数値も文字列も両方入る奴に切り替わる。
構造体切り替えの手間もあるし、構造体のサイズも大きくなるから非効率

…だったような気がする。

300:295
07/01/14 01:43:35
すばやいご提示、ありがとうございます。
>>296
すみません、説明が不足していました(ということに気づくのに、いただいた式を
眺めながらかなり時間がかかりました・・・)。実は、EやSが変数の中に出てくる
順番は毎回変わる可能性がありました。申し訳ありません。
>>298
欲しい結果が出せました。ただ、内容の理解には私にはまだまだ時間がかかりそうです・・
なんとか少しずつ、吟味していきたいと思います。
>>297
わかりましたか。そのとおりです。

皆様、すばらしいご教授、どうもありがとうございました。


301:デフォルトの名無しさん
07/01/14 01:59:22
>>299
perl は型はなしでしょ。
$foo = '2000';

$foo = 2000;
は同じでしょ。

302:デフォルトの名無しさん
07/01/14 02:13:38
>>301
つ [perlguts]
つ [Devel::Peek]

303:デフォルトの名無しさん
07/01/14 02:45:43
>>302
もちっと教えてくれんかのう。
perldataには
「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、
あるいはその他の型であるように宣言する方法はありません。」
とあるかんだけど、それとは違うレベルで何かあるのか?

304:デフォルトの名無しさん
07/01/14 03:03:20
提示されている情報ぐらい見なさい。
> Double-Typed SVs
> スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、
> 蓄積されている型から要求されている型へ、自動的に変換を行ないます。

305:265
07/01/14 03:39:50
>>275 を提出したんですが、授業後
せんせから呼び出し受けました。

306:303
07/01/14 03:57:55
>>304
どうもありがとう。
文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。
しかし、シンタックス上
$foo = '2000';

$foo = 2000;
に違いがあるとは読み取れませんでした。

#$foo = '2000' . '';
#と
#$foo = 2000 + 0;
#が違うのはわかりますよ。

307:303
07/01/14 04:24:03
試してみれば良いんだね。
$foo = 2000;
の場合数値コンテキストになるんだ。(そりゃそうか)

308:デフォルトの名無しさん
07/01/14 13:40:27
>>305
ワロタ
なんていわれたの?w

309:デフォルトの名無しさん
07/01/14 14:38:20
先生が読めなかったか
先生がこのスレを見ていたか

どっちかな

310:デフォルトの名無しさん
07/01/14 14:54:53
>>289
>半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
>うーんうーん悩んでいた時のことを思い出した。
>そういや、半角英字を全角英字に置換することってできるの?

次スレのテンプレ予定の>>115に忠実に従えば、
tr/a-zA-Z/a-zA-Z/
でできる。

311:デフォルトの名無しさん
07/01/14 14:58:44
print "@{[1+1]}", "${\(1+1)}";

こういうテクニック(?)を思い出したんですけど、どこに書かれていたものでしょうか。

312:デフォルトの名無しさん
07/01/14 15:01:00
>>306
use 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

313:299
07/01/14 20:42:44
やっぱりPVIVになった。どうやら >>299 に書いた記憶通りだったみたい。

use 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側からいじると、
文字列として表示した時と、数値として使った時で別の値を出すスカラ
とか作れちゃうんだよね。

314:デフォルトの名無しさん
07/01/14 22:35:50
>>313
実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
URLリンク(search.cpan.org)
use Contextual::Return;

$contextual = NUM { 10 } STR { 'abc' };
print $contextual . '';
print $contextual + 0;

315:314
07/01/14 22:43:39
ああ、失敗。よく考えたら流石に代入は無理だな。…Tie使ったら或いは出来たりしそうな気もしないでもない。
313はスカラを作ると言うことで代入した別の値を保持まで出来たりするのかな

316:デフォルトの名無しさん
07/01/14 23:55:02
Scalar::Utils の dualvar は?

317:デフォルトの名無しさん
07/01/14 23:56:11
ごめん、Scalar::Util だった。
URLリンク(search.cpan.org)

318:デフォルトの名無しさん
07/01/14 23:59:37
>実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。
スルーしてた。xs を使って実現したのが Scalar::Util の dualvar ってことっすね。

319:デフォルトの名無しさん
07/01/15 00:09:24
dualvar でスカラ作ってみたけど、
作った後で代入し直したら、片方だけ(数値だけ or 文字列だけ)になっちゃった。

ということは、xsでフラグいじって IOK, POK 両方立てても
代入したら片方になっちゃうということか。
オブジェクトにして代入まで見張れば良いんだろうけど。

320:デフォルトの名無しさん
07/01/15 01:57:29
webサーバをan httpdからapacheに変更したところ文字化けする部分が出てきました。
method=getで受けとった部分が文字化けしてしまいます。method=postは大丈夫でした。
よろしくお願いします。
↓の一番下の部分も参考にしましたが直りませんでした。
URLリンク(tech.bayashi.net)
apache perlは↓のサイトを参考に構築してあります。
URLリンク(www.y-kit.jp)
------------------------------
環境
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データ
URLリンク(localhost)あいうえお&a=11
表示データ
name=a&mail=&message=???¢???|?¨&ip=&a=11

321:デフォルトの名無しさん
07/01/15 02:03:07
>1に全てが隠されているんじゃないだろうか。

322:デフォルトの名無しさん
07/01/15 12:39:35
以前使っていたサーバでdbmファイルを使っていたのですが、
そのまま別のサーバに移動したら読み込めなくなりました。
dbmファイルは.dirと.pagの2つじゃない方(1つのファイル)です。
古いサーバはもう使えません。新しいサーバでdbmファイル
を読む方法はないでしょうか…。

323:デフォルトの名無しさん
07/01/15 14:43:05
>>322
質問する時はまず環境を説明しろ!
(古い方と新しい方それぞれのOSの種類とバージョン,Perlのバージョン)

あと、読めなくなったってのはどんなエラーメッセージが来てるのかも報告汁

324:デフォルトの名無しさん
07/01/15 19:18:22
>>322
ヒントになるかわからんが
NDBM_File
DB_File
GDBM_File
SDBM_File
ODBM_File

325:320
07/01/15 20:46:35
別のとこで質問してきます。

326:322
07/01/15 20:58:26
読めなかったと思ったら読めました。お騒がせしました。
dbmファイルはテキストなどに書き出しておかないとバイナリでサーバを移しても
読めないのだと思っていました。dbmopen()で読み書きしていたので、どの
形式のDBMかわからなかったのです。

327:デフォルトの名無しさん
07/01/16 05:56:00
perlerのエロイ人教えて!ワッフルワッフル

指定されたディレクトリのディレクトリハンドルを開いて
ディレクトリ内のファイル名を取得するスクリプトを書いたのですが
名前が長いファイルがあるとそのファイルと、それ以降のエントリが
ディレクトリハンドルから取得できないんだけど
なんで?これどうすれば回避できる?

環境: Windows XP + ActivePerl5.8.8 build819


328:デフォルトの名無しさん
07/01/16 07:04:48
esperのエロイ人が来て
お前の書いたスクリプトを透視した上で回答してくれるのを待つことだ

329:327
07/01/16 10:55:47
>>328
再現スクリプトを下記に示します。
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__
----

330:デフォルトの名無しさん
07/01/16 10:58:29
名前が長いファイルの例は何ですか?

331:デフォルトの名無しさん
07/01/16 11:02:27
質問します。

foreach( 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;

332:327
07/01/16 11:19:46
>>330
全角数字0から9を繰り返すのを160文字 + .txt
のファイル名を用意したら再現しました。
全角数字100文字の場合はファイル名が取得できました。
パスは
D:\test
で実験しました。
95系は絶対パスで255byte以下、
NT系は絶対パスで255文字以下と認識してるのですが
このへんの絡みですかね?


333:327
07/01/16 11:26:39
>>331
Net::FTP::Fileにisfileとisdirってメソッドあるよ。
インスコするかインスコできないならCPANでソース閲覧して参考にすればいけるのでは

334:327
07/01/16 12:18:54
似たケースを見つけた。
ActivePerlのバグ?
URLリンク(www.namazu.org)


335:デフォルトの名無しさん
07/01/16 12:31:39
バグではなく仕様。
WinAPIでも使っとけ。

336:331
07/01/16 13:23:32
>>333
出来ましたー。
最初ソース見て作ろうと思いましたが
面倒臭くなって結局インスコしましたw
ありがとうございます。

337:327
07/01/16 13:44:46
>>336
もめでとう! こっちはいまだにはまり中 orz

>>335
バグじゃなくて仕様なの?
ちなみにWin32::APIを使ってみたけどなぜか取得できない。。。

338:327
07/01/16 13:51:26
Win32::APIを使った再現スクリプト

----
#!/usr/local/bin/perl
use strict; use utf8; use warnings;
use Data::Dumper; use Encode; use File::Spec; use FindBin; use Win32::API;
Win32::API::Struct->typedef('FILETIME', qw(
DWORD dwLowDateTime; DWORD dwHighDateTime;)) or die $!;
Win32::API::Struct->typedef('WIN32_FIND_DATA', qw(
DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow;
DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[260];
TCHAR cAlternateFileName[14];)) or die $!;
my $FindFirstFile = Win32::API->new('kernel32', 'FindFirstFile', 'PS', 'N') or die $!;
my $FindNextFile = Win32::API->new('kernel32', 'FindNextFile', 'NS', 'I') or die $!;
my $FindClose = Win32::API->new('kernel32', 'FindClose', 'N', 'I') or die $!;
my $path = File::Spec->catdir($FindBin::Bin, '*');
my $FindData = Win32::API::Struct->new('WIN32_FIND_DATA') or die $!;
my $hFind = $FindFirstFile->Call($path, $FindData);
$hFind == -1 and die $!;
my @list = ($FindData->{cFileName});
push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData;
$FindClose->Call($hFind);
print Dumper(\@list);
__END__


339:327
07/01/16 13:56:10
書込み時に改行多いって怒られたから改行を削ってたら
FindNextFileの閉じ括弧までまちがえて削っちゃった orz
>>338のソースは

×push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData;
○push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData);

でお願いします。 m(_ _)m

340:デフォルトの名無しさん
07/01/16 13:56:31
この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。
この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、
パスの前に "\\?\" という接頭辞を追加してください。
詳細については、MSDN ライブラリの「File Name Conventions」(ファイル名の規則)を参照してください。

341:327
07/01/16 14:45:03
>>340
どもです、自分もおんなじ情報に行き当たりました ;p
URLリンク(mag.autumn.org)

Find(?:First|Next)FileじゃなくてFind(?:First|Next)FileWを使えってことなんですね。。。
ディレクトリのファイル一覧を取得する部分だけで苦労するな。。。

342:デフォルトの名無しさん
07/01/16 14:51:49
>>327
URLリンク(msdn2.microsoft.com)
typedef struct _WIN32_FIND_DATA {
...
TCHAR cFileName[MAX_PATH];

343:デフォルトの名無しさん
07/01/16 23:00:35
作ってもらった

    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~

344:デフォルトの名無しさん
07/01/16 23:04:28
ちょっとでかいな

345:327
07/01/17 01:05:42
ActivePerlではうまくいかないみたい。。。
URLリンク(aspn.activestate.com)

346:327
07/01/17 06:15:16
URLリンク(aspn.activestate.com)
こちらのやり方で取得出来ました。

何度も自己レスすみませんでした m(_ _)m


347:デフォルトの名無しさん
07/01/17 18:25:14
Perl 覚えたらこんなもの作れるようになりました。


 █   █   █      █          █▀▀▀▅
 ▀▅ ▅▀▅ ▅▀ ▅▅▅  █▅▅▅       █   █ ▅ ▅  ▅▅▅   ▅▅▅▅
  █ █ █ █ █▅▅▅█ █   █      █▀▀▀  █▀  █   █ █▅▅█
  ▀▅▀ ▀▅▀ █   ▅ █   █      █     █   █   █ █▅▅▅
   ▀   ▀   ▀▀▀  ▀▀▀▀       ▀     ▀    ▀▀▀  ▀▅▅▅▀

     ▅▅▅▅▅▅   ▅    ▅      █
 ▀▀▀▀ ▅▀  ▅   █ ▅▅▅█▅▅  ▀▀█▀▅▀▀▀▅
     █  █ ▀ ▀▀▀█      █  ▅█▀    █
     █         █   ▅▅▅▀ ▅▀█     █
     ▀▅         █       ▀ █     █ ▅
       ▀▀▀      ▀         ▀      ▀


348:デフォルトの名無しさん
07/01/17 19:19:36
URLリンク(perldoc.jp)
どうすればファイルハンドルをサブルーチンに局所化できますか?〜
の項目にあるサンプルコードの
local $_; # ← とても重要
の意味は一体なんでしょうか。

349:デフォルトの名無しさん
07/01/17 19:31:19
sub owata {
  # local $_;
  $_ = "\(^o^)/";
}

$_ = "/(^o^)\";
owata;
print;


local $_; の行をコメントアウト/インして実行してみよう!

350:デフォルトの名無しさん
07/01/17 19:48:51
ありがとうございます。でも余計にわからなくなったorz
実はこんなコード書いて試してみたんですがlocal $_;あっても無くても同じように動くんですよね

# lstはファイル名のリスト
open (FH, '< lst') or die;
while (<FH>) { print; &localtest }
close FH;

sub localtest
{
local *FH;
open (FH, $_) or die;
#local $_;
while (<FH>) { print }
}

何が違うのかも教えていただけたらうれしいです。

351:デフォルトの名無しさん
07/01/17 19:58:12
$_はグローバルだから他で使われてるかもしれない。特に
左辺値でないもののaliasだったりすると値を書き換えることも
できないしな。

foreachのときは暗黙にlocalにしてくれるけど。

352:デフォルトの名無しさん
07/01/17 21:12:34
>>350
localtest 呼び出しの後 $_ は書き換わってるけど、
すぐに次のループに入るので問題がないだけ。

while (<FH>) { print "begin: $_"; &localtest; print "end: $_" }

とかやってみると、違いがわかると思うよ。

353:350
07/01/17 23:02:32
ありがとうございます。ようやく理解できました
しかし350のコードはアホですね…何をやっているんだか
この分じゃ他にもいろいろ勘違いしていることありそうで怖いです。
とりあえずほとんど理解せず使ってる型グロブをもうちょっと調べてみよう…

354:デフォルトの名無しさん
07/01/18 00:01:12
間接的なファイルハンドル使おうよ
open my $fh, '<', 'filename' or die;

355:デフォルトの名無しさん
07/01/18 02:29:27
FileHandleやIO::Fileって使わないの?

356:331
07/01/18 09:36:42
331で質問したモノです。
また壁にぶち当たりました。
ftpしたあとのファイル、ディレクトリの日付、サイズを取得したいので調べてましたが
use Net::FTP::File;のNet::FTP::fstatは作りかけのようで使用出来ませんでした。
$ftp->dir(./)で拾って日付を抜こうと思いましたが、日本語環境と英語環境で
表示が異なるので断念しました。
何か取得方法はないでしょうか。

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);

357:デフォルトの名無しさん
07/01/18 09:45:05
>>356
> 何か取得方法はないでしょうか。

マニュアルを見ると分かるんじゃないでしょうか

358:デフォルトの名無しさん
07/01/18 12:07:32
Perlで文字列にunicodeが含まれているかどうかを判断するにはどうすればいいですか?

359:デフォルトの名無しさん
07/01/18 12:20:56
「文字列にunicodeが含まれている」という言い方があいまい杉。

あるバイト列の文字コードがunicode由来のものであることを知りたいのか
(エンコーディングの仕方が何通りもあるので)

→ Encode::Guess。ただし完全な判定は無理。

UTF-8フラグが立った文字列であることを知りたいのか

→Encode::is_utf8(あるいはutf8::is_utf8)

それともぜんぜん別のことなのか


360:デフォルトの名無しさん
07/01/18 12:45:35
>>359
unicode由来のもであるかどうかです
それと環境はPerl5.0でJcode.plです

361:356
07/01/18 13:54:08
調べていたらNet::FTPのmdtmが使えそうだったので
書いてみましたがエラーが出ました。
使い方が間違えているのでしょうか。

$host = "***" ;
$user = "***" ;
$pass = "***" ;

use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach($ftp->ls()){
$aaa = $ftp->mdtm($_) ;
print "$aaa\n" ;
}


362:デフォルトの名無しさん
07/01/18 16:20:51
>>361
Net::FTPの使い方としては間違ってないよ。
エラーってnot a plain fileのことか?
とりあえずエラーの理由知りたけりゃDebug=>1設定しなさい。

363:デフォルトの名無しさん
07/01/18 16:24:58
>>360
jcode.pl は Unicodeには対応していないはず。
Perl 5.0 なんて時代遅れなもの使うのやめたら?

364:デフォルトの名無しさん
07/01/18 16:29:49
時代は6だな

365:361
07/01/18 16:36:17
---------------------------------------------------------------------------
#!/usr/local/bin/perl -w -- # -*-Perl-*-
use strict;
use warnings;
use Net::FTP;

my $host = "txfs02" ;
my $user = "g-fan" ;
my $pass = "fan" ;
my $aaa ;

my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
foreach($ftp->ls()){
$aaa = $ftp->mdtm($_) ;
print "$aaa\n" ;
}
---------------------------------------------------------------------------

↑これを実行すると一つのファイルにつき↓このメッセージが出ます。
色々試してはいますが詰まっていますorz

Use of uninitialized value in concatenation (.) or string at bbb.pl line 15.


366:デフォルトの名無しさん
07/01/18 16:47:09
>>365
>Use of uninitialized value in concatenation ...
何も無いものをprintしようとしたからwarningsが出たわけ
print "$aaa\n";

print "$aaa\n" if $aaa;



367:361
07/01/18 16:52:50
>>366
そうなんです。
全てのファイルのmdtmがundefになってるんですよね。
だいたい”foreach($ftp->ls()){”でファイルを拾っているので
ファイル名を間違えているとかそういうのは無いはずなんですが。


368:デフォルトの名無しさん
07/01/18 17:03:16
Debug=>1にすると俺の環境では

ディレクトリはエラーでnot a plain fileを返してる(undef)
ファイルはtimeを返してる



369:デフォルトの名無しさん
07/01/18 17:07:02
>>367
> ファイル名を間違えているとかそういうのは無いはずなんですが。

「はず」じゃなく確認しる。

とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
成功したりする。なんじゃらほい。

370:デフォルトの名無しさん
07/01/18 17:15:03
>>369
> とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
> 成功したりする。なんじゃらほい。

急いで捕捉すると、テストに使った対象ftpサーバが、複数個をラウンドロビン
していたようた。要するに、ftpサーバソフトウェアによって成功したり
失敗したりしていたようだ。




371:361
07/01/18 17:17:49
>>368
すみません。
Debug=>1の意味が理解できていませんでした。
今調べてDebug=>1で流したらこんなメッセージになっています。

Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.

MDTMというコマンドがないみたいですが↓このファイル見たら_MDTMならあるけど
MDTMはありませんでした。
/usr/local/lib/perl5/5.8.6/Net/FTP.pm

>>369
調べましたがちゃんと見れていました。

372:デフォルトの名無しさん
07/01/18 17:36:30
>>371
> Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
> Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
> Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.

これはひどい(笑) MDTMコマンドが実装されていないのだろうか。

手元でやった例だと
失敗例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 550 Could not get file modification time.

成功例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 212 20060419172149

となります。


373:デフォルトの名無しさん
07/01/18 17:45:44
今ぐぐってみたら
MDTMはFTPの拡張仕様だから対応してない鯖が多いみたいだ
MDTM対応してない鯖は気合でLISTの結果を解析するしかなさそうな感じ

374:デフォルトの名無しさん
07/01/18 18:02:46
LISTのフォーマットもまちまちだから、本当に「気合」が必要だなw

375:デフォルトの名無しさん
07/01/18 18:56:34
普通のftpクライアントはどうやってリスト作成しているんだろうね・・・

#暇なときにffftpのソース眺めてみよう

376:デフォルトの名無しさん
07/01/18 19:01:19
IEもLISTを解析してるらしい
URLリンク(support.microsoft.com)
かなり大変そうだな・・・

377:デフォルトの名無しさん
07/01/18 19:37:54
CPANを漁ったらこんなのがあった。使い物になるかな
URLリンク(search.cpan.org)

378:デフォルトの名無しさん
07/01/18 20:47:53
>>375
悲惨なものよ

379:デフォルトの名無しさん
07/01/19 00:21:38
ファイル交換ソフトの利用履歴を調査するソフト「Winny特別調査員」
URLリンク(internet.watch.impress.co.jp)
>Winny特別調査員は、フォレンジック技術を応用した検査により、Winnyなどのファイル交換ソフトを利用した最終日時を調査するソフト。

これ、デモ版とはいえPerl(PAR)で書かれている珍しい製品
exeの拡張子をzipにして解凍すればソースを取り出すことが可能。


このソースを見てフォレンジック技術と"売り物"のクォリティを感じろ、おまいら


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5369日前に更新/220 KB
担当:undef