Perlについての質問箱 29箱目at TECH
Perlについての質問箱 29箱目 - 暇つぶし2ch263:デフォルトの名無しさん
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にして解凍すればソースを取り出すことが可能。


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

380:デフォルトの名無しさん
07/01/19 00:33:42
>>379
@KINTAMA_STRとかあってワロス

381:361
07/01/19 09:54:34
>>373
拡張なんですね。。
>>372->>380
$ftp->dir("./")で取得するとサーバによってこんな風になるんですよね。
表示が英語か日本語だけならまだ対応出来るんですが
日本語で去年のファイルになると時間が年表記になって
時間が取り出せないorz

drwxrwxr-x 2 user group 1024 Dec 5 00:03 dir_name

drwxr-xr-x 5 user group 512 3月 29日 2006年 dir_name

何か他に日付とサイズ取得できるのないかな。

382:デフォルトの名無しさん
07/01/19 10:18:31
>>381
> 日本語で去年のファイルになると時間が年表記になって
> 時間が取り出せないorz

いや、UNIXのlsコマンドの詳細表示は、半年以上過ぎるとそういう表示になる
仕様だというだけ。それを反映しているのでしょう。英語でもそうなるはず。
っていうか、そうなるのがある、か。

383:デフォルトの名無しさん
07/01/19 13:16:05
>>379
これぐらいの物ならPerlで作らなかった方が良かったのにね。。
コメントとテストコードが残っている事以外に関して言えば
別に酷いコードじゃないと思うけど、フォレンジック技術について言えば;;
文字連結が好きだって事は分かった。

384:デフォルトの名無しさん
07/01/19 14:01:44
> 別に酷いコードじゃないと思うけど、
マジで?

385:デフォルトの名無しさん
07/01/19 14:07:39
112 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:23:40 ID:p3fP2iOG0
sub pf_check_p2p{
if ($_[0]=~/winny\.exe/i){add_ctime($_[0],$WINNY,"WINNY");}
if ($_[0]=~/winnyp\.exe/i){add_ctime($_[0],$WINNYP,"WINNYP");}
if ($_[0]=~/Share\.exe/i){add_ctime($_[0],$SHARE,"SHARE");}
if ($_[0]=~/PERFECT DARK\.EXE/i){add_ctime($_[0],$PD,"PD");}
if ($_[0]=~/cabos\.exe/i){add_ctime($_[0],$CABOS,"CABOS");}
if ($_[0]=~/limewire\.exe/i){add_ctime($_[0],$LIMEWIRE,"LIMEWIRE");}
if ($_[0]=~/BITTORRENT\.EXE/i){add_ctime($_[0],$BIT,"BIT");}
if ($_[0]=~/BITCOMET\.EXE/i){add_ctime($_[0],$BIT,"BIT");}
}

(;^ω^)


139 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:35:19 ID:p3fP2iOG0
なんか製品版も同じな気がする…
だってp2ptest.plの30行辺り見ると…

my $kin="\x5b\x90\x6d\x8b\x60\x82\xc8\x82\xab\x83\x4c\x83\x93\x83\x5e\x83\x7d\x5d";

ついでにこれってShift_JISで見ると [仁義なきキンタマ] なんだよね

386:383
07/01/19 14:20:43
>>384
苦なく読めるという点で。改良点を挙げようとすればそりゃ出てくるがな。

387:デフォルトの名無しさん
07/01/19 15:04:42
>>385
これだけ見ても何が面白いのかワカランだろ。まぁ、十分ヘタクソなコードだけど。
これが商用のソフトのファイル共有ソフトの検出処理だってのが凄い。
URLリンク(72.14.253.104)

388:デフォルトの名無しさん
07/01/19 15:15:48
Prefetchに気づいてる香具師が一人しかいないそのスレも大分痛い

389:デフォルトの名無しさん
07/01/19 15:37:59
>>388
ニュー速だぞ?w

390:デフォルトの名無しさん
07/01/19 16:29:43
>>379
調査員が、PC操作してる俺の隣に座って
監視するわけじゃないのか。 じゃイラネ。

391:デフォルトの名無しさん
07/01/19 16:41:48
人件費が馬鹿にならんだろそれじゃ

392:デフォルトの名無しさん
07/01/19 17:08:45
マwジwレwwスwww

393:デフォルトの名無しさん
07/01/19 17:12:31
391に突っ込むって
どんだけ2ch初心者なんだよ

394:デフォルトの名無しさん
07/01/19 17:19:27
2chw初w心ww者www

395:デフォルトの名無しさん
07/01/19 17:56:46
はいはい
vipに帰りな

396:デフォルトの名無しさん
07/01/19 18:00:16
はwいwwはwwwいwwwww
いい加減自演疲れただろうパトラッシュ

397:デフォルトの名無しさん
07/01/19 19:04:24
>>393
熟練の方ですか?wwww

398:デフォルトの名無しさん
07/01/19 19:05:06
          ばばばばばばっ
    w      w  _  _   w   w
        w   ヽ(・ω・)ノ   w    w
         w .(( ノ(  )ヽ )) w
wwwwwwwww..............┛┗...........wwwwwwwww

399:デフォルトの名無しさん
07/01/19 20:11:44
言い負けてからが長い

400:デフォルトの名無しさん
07/01/20 00:53:18
2chViewer ●にログインして、過去ログをひたすら(ウェイトは挟みつつ)取得するスクリプトを書いたのですが、
●ログインは出来るものの、肝心の過去ログが取得できません。gzip圧縮された「-ERR もう つかえません」と言うメッセージが取得されるだけです。
●アカウントそのものは既成の専用ブラウザ(OpenJane 0.1.12.6b)で生きていることを確認しています。
コーディングの問題なのか、2chの●過去ログ取得の仕様にあっていないための不都合なのか、自分では切り分けが出来ませんでした。

ソースはこれです。 URLリンク(sub.jetabbs.org) (コメント・メッセージがキモくてごめんなさい)
スレ違いでしたら誘導をお願いします。


401:デフォルトの名無しさん
07/01/20 15:39:22
>>400
ソースは読んでいないけど、
それって、Perlの問題というより、2ちゃんねるの認証の問題だね。
専用ブラウザ以外のソフトで過去ログを取得しようとすると、拒否する
ように設定していると聞いた覚えがある。
あとは、こちらのスレで聞いたほうがいいよ ↓

monazilla Part 5
スレリンク(tech板)l50


402:デフォルトの名無しさん
07/01/20 15:51:03
専用ブラウザでのやりとりをキャプチャして同じリクエスト投げるようにすればいいんじゃね?
暗号化されてたらシラネ

403:401
07/01/20 15:51:23
>>400
あと、Snifferというソフトを使って、専用ブラウザが出しているIPパケットと、
自作のスクリプトが出しているIPパケットとを比べれば解決するかもしれないよ。

404:デフォルトの名無しさん
07/01/20 22:02:59

use threads;
use threads::shared;

# 終了の合図
my $kill:shared = 0;

# スレッド作成
my $thread = threads->new(\&loop);

処理...

$kill = 1;
$thread->join;

sub loop {
  while (!$kill) {

    処理...

    sleep(60);
  }
}

少し長くてすみません…。
マルチスレッドでwaitを挟みつつ処理を行い
任意のタイミングで終了させるプログラムを組んでいるのですが、
このコードだと終了用の変数をセットしてから処理が戻るまで60秒もかかってしまいます。
何かいい方法はないでしょうか
よろしくお願いします。

405:デフォルトの名無しさん
07/01/20 22:24:10
>>400
UAをMonazilla/1.00にするとか

406:デフォルトの名無しさん
07/01/20 22:47:00
>>404
threads::sharedにcond_ナントカというのがいくつかあるので
よく説明読め。たぶんお前が求めているものはそれだ。


407:デフォルトの名無しさん
07/01/20 22:55:23
>>406
ありがとうございます
調べてみます

408:デフォルトの名無しさん
07/01/20 23:33:03
Perl Hacks
URLリンク(www.amazon.co.jp)

これ今日発売だけど買った奴居る?
中身どうですか?

409:デフォルトの名無しさん
07/01/20 23:57:59
そんな本が出るこそさえ知らなかったわさ

410:デフォルトの名無しさん
07/01/21 00:14:29
>>406
cond_timedwait
cond_signal
を併用する事でできました
昨日からずっと悩んでいたので助かりました
ありがとうございました

411:デフォルトの名無しさん
07/01/21 00:19:55
>408
O'Reillyで目次見れるから、だいたい判断つくんじゃない?
俺は英語版持ってるから買わないけど。
URLリンク(www.oreilly.co.jp)

412:デフォルトの名無しさん
07/01/21 00:54:41
第1章の1項ってテクニック?

413:デフォルトの名無しさん
07/01/21 01:23:23
1章2章はツールの話だろ

414:デフォルトの名無しさん
07/01/21 01:24:15
「firefoxから簡単にCPAN検索できるようにする」だからテクニックといえばテクニックだろ。
俺はsleipnirもfirefoxもCPAN検索できるようにしてある。
あとはローカルにppmリポジトリを立てればすごく便利。

415:デフォルトの名無しさん
07/01/21 05:57:20
>>408
買った買った。ペラペラとめくってからほぼ衝動買い。
お前も買え。

416:デフォルトの名無しさん
07/01/21 12:10:31
すみません

@week = ("Sun","Mon","Tue","Wed","Thr","Fri","Sat");
$i = 0;

for($i=0; $i <= 7; $i++){
print $week[${i}];
}

このソースで-wオプション付けて実行すると
Use of uninitialized value in print at ./hairetu.pl line 7.
と警告が出るのですが何故でしょうか?
見たところ変数はきちんと初期化していると思うのです。

417:デフォルトの名無しさん
07/01/21 12:12:55
わかりました
7じゃなくて6ですた…
自己解決染ました

418:デフォルトの名無しさん
07/01/21 12:41:03
>>417
> 7じゃなくて6ですた…

植木算のミスといいます。そして Perl では「必要がなければ添え字を扱わない」ことで、このリスクを回避できます。

foreach my $wday (@week) {
    print $wday;
}

あるいは、

print for @week;


419:デフォルトの名無しさん
07/01/21 13:30:56
すごい省略できるんですね…

420:デフォルトの名無しさん
07/01/21 16:25:18
Perlの省略記法は、芸術ですから。
いろいろ言われるところもあるけど、ラリー・ウォール先生もPGは傲慢であれとおっしゃっていることだし。
うん。大丈夫。半年前に書いたスクリプトがさっぱり分からなくても大丈夫。泣くことなんて無いよ。

421:デフォルトの名無しさん
07/01/21 16:39:35
> foreach my $wday (@week) {
> print $wday;
> }

"my" なんて入れる必要ないだろ

422:デフォルトの名無しさん
07/01/21 16:45:32
PBP6.9に入れた方がいいと書いてあるだろ

423:デフォルトの名無しさん
07/01/21 18:36:44
自分のフォルダのtextファイル(1000行~1500行)を

ひとつの変数に入れる方法を教えてください


open(IN,"< foo.txt");
foreach(IN){ ・・・
}

のように一行づつ処理ではなく、全部の行をまとめて処理したいのです。
(正規表現で複数の行に渡って処理したいため)

何かいい方法はないでしょうか?
よろしくお願いします

424:デフォルトの名無しさん
07/01/21 18:40:53
read関数

425:デフォルトの名無しさん
07/01/21 18:47:46
my $txt = join('', (<IN>)[999 .. 1499]);

426:423
07/01/21 18:49:16
>>424
>>425
ありがとうございます。
無事解決できました

427:デフォルトの名無しさん
07/01/21 19:00:13
いいのかおい

428:デフォルトの名無しさん
07/01/22 23:22:29
正規表現の量指定子{}に変数は使えますか?

429:デフォルトの名無しさん
07/01/22 23:25:53
すいません、自己解決しました
てか自分で試せばよかった・・・

430:デフォルトの名無しさん
07/01/23 17:27:38
すみません。
教えてください。

my @aaa = () ;
my @bbb = () ;
for(my $i=0;$i<5;$i++) {
@aaa = ($i,$i+1) ;
@bbb = (@bbb,\@aaa) ;
}
foreach(@bbb){
print "$_\n" ;
}
foreach(@bbb){
foreach(@$_){
print "$_\n" ;
}
}

上を実行すると下の結果になります。

ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
ARRAY(0x13c93c)
4 5
4 5
4 5
4 5
4 5

>>↓に続く

431:430
07/01/23 17:28:11
>>↑の続き

出力させたい結果は以下なのですがどうも
リファレンスの中がARRAY(0x13c93c)で全て同じになってしまっているようです。
(同じ@aaaという配列名をリファレンスしているせい?)
ループさせてリファレンスを増やしていきたいのですが
どのようにしたら下記のような出力結果に出来ますでしょうか。

0 1
1 2
2 3
3 4
4 5

432:デフォルトの名無しさん
07/01/23 17:40:06
レキシカルスコープ

433:デフォルトの名無しさん
07/01/23 17:41:40
>>430-431
ループのなかでmyするようにする。
my @aaa = ($i,$i+1) ;

若しくは無名配列のコンストラクタを使う。
@bbb = (@bbb,[@aaa]) ;

ループの外では@aaaを使っていないのだから、
スコープをループ内に縛る前者をお勧めする。

434:デフォルトの名無しさん
07/01/23 17:48:50
質問です。

テキストファイルから顔文字を除去しようと考えていますが、いい方法がみつかりません。
正規表現でうまく除去する方法というのはないでしょうか?


現在考えていますのが、括弧の中に記号あると顔文字であると判断するとしています(例=(゜Д゜) (ノ∀`*) など。
この正規表現を書く場合全ての記号を書かないといけないでしょうか?

質問が2つとなりましたが、よろしくお願いします

435:デフォルトの名無しさん
07/01/23 17:52:37
>>434
まず正規表現を勉強しろ。

顔文字のリスト作ってそれと比較するのが単純で速いと思うが。

436:デフォルトの名無しさん
07/01/23 17:55:52
(゜o゜)これはおk?
(TへT)これもおkだね

437:434
07/01/23 17:57:28
>>435
リスト作ったほうが早いですか。

その場合、リストにない顔文字は一致しませんけど、しょうがないか…
全部の顔文字をうまく除去するなんて、難しいですよね

438:デフォルトの名無しさん
07/01/23 18:01:19
上手く作ったとしても
 テンプレート・ツールキット(TT)
なんて文脈じゃ誤判定は避けられないな

439:デフォルトの名無しさん
07/01/23 18:04:54
>>437
"ヽ(`Д´)ノ"
とかが、"ヽノ"になってもいいのかってこったわな。
結局は、顔文字の辞書ファイルを保守するしかないだろ。


440:434
07/01/23 18:18:05
"ヽ(`Д´)ノ"の場合は前後が記号ならそれも弾くとか考えてたんですよね

まぁ、ノのほうが記号じゃないんで、残りますが。

顔文字の辞書作ってるけど。結構メンドクセ

441:430
07/01/23 18:21:54
>>433
解決しました。
ありがとうございました。

>>432
こういうのをレキシカルスコープって言うんですね。
ありがとうございます。

442:デフォルトの名無しさん
07/01/24 01:40:36
文字の置換の際に、「マッチした文字列になんらかの処理をする」ということは可能でしょうか?

$str = "ABCDEF";
$str =~ s/(B)/&conv($1)/;

のように、マッチした文字列を、関数を使って、返り値で置換したいのですが・・・
(ちなみの、このコードだと、
A&conv(B)CDEF
という文字列になってしまいました。。。)

443:デフォルトの名無しさん
07/01/24 02:25:10
e

444:デフォルトの名無しさん
07/01/24 04:16:24
v

445:デフォルトの名無しさん
07/01/24 06:30:30
>>442
Windowsならコマンドプロンプト開いて
perldoc perlre
でperlの正規表現のドキュメント読めるよ。
ドキュメントにざっと目を通してれば人に質問するような内容じゃないぞ。

446:4442
07/01/24 07:16:24
>443
>445
ありがとうございます。 /e で、できました。

ドキュメントを確認せずに質問してしまって
済みませんでした。
プログラミングPerlにも、 /e が載ってました・・・

447:デフォルトの名無しさん
07/01/24 14:10:56
CGI作るつもりでperl始めたんだけど、テンプレにあるようなCGIとは無関係な使い方ってどんな使い方するの?
例えばどんな仕事でどう使うとか教えてほしい

448:デフォルトの名無しさん
07/01/24 14:14:36
>>447
スクリプトとして使えるじゃん。 バッチ処理とかさ。

449:デフォルトの名無しさん
07/01/24 14:26:58
>>447
CGIと関係なく、データベースとのやりとりとか。

450:デフォルトの名無しさん
07/01/24 14:27:35
>>447
えーと、えーと

451:デフォルトの名無しさん
07/01/24 14:29:52
こんな質問するやつに教えても理解できないと思うよ

452:デフォルトの名無しさん
07/01/24 14:31:22
エロ画像エロ動画収集に決まってるだろ

453:デフォルトの名無しさん
07/01/24 14:32:40
分類したエロ画像ファイルをリネームする

454:デフォルトの名無しさん
07/01/24 15:02:24
CUIだから単純で且つ面倒くさい処理やらせてる。すぐ書けるしね
>>452
漏れ以外にPerlをエロ収集に使おうと考える奴がいるとは・・・

455:デフォルトの名無しさん
07/01/24 16:01:07
>452-454
あれ、俺が何人もいる…

456:デフォルトの名無しさん
07/01/24 17:03:32
たしかにエロ収集に便利、というよりエロ収集してる時が一番はかどるな。

457:デフォルトの名無しさん
07/01/24 17:06:36
組みたくなってきた・・・
エロパワーは絶大だな

458:デフォルトの名無しさん
07/01/24 17:31:07
 ▀▄    ▀▄      ▄█    ▄█  ▀▀▀▀█
   ▀▄    ▀▄   ▄▀█   ▄▀█     ▄▀
    ▄▀    ▄▀ ▄▀ █  ▄▀ █     █
  ▄▀    ▄▀   ▀▀▀█▀ ▀▀▀█▀   █
 ▀     ▀        ▀     ▀    ▀

   █ ▄▄▄   █    ▀▀▀▀    ▄      ▄█ █
  █  █▄▄ █ █  ▄▄▄▄▄▄▄   █  ▄▄▄▄█▄▄
 ▀█ ▄█ █ █ █      ▄▀    █      █
  █ ▀ █▀ █ █    ▄▀▀▄    █   ▄▄▄█
  █  ▄▀    █  ▄▀   █    █  █   █▀▄
  ▀  ▀    ▀▀ ▀      ▀▀▀ ▀   ▀▀▀

こんなスレアラシに使える。

459:デフォルトの名無しさん
07/01/24 18:27:19
正規表現が使いやすいからPerlで組んだ
でもCUIなのがなぁ

460:デフォルトの名無しさん
07/01/24 18:34:47
Perlでは、ワンライナーか数行程度のスクリプトでテキストをいじったりとか
しかしてないが
Unicode対応がボミョウなので、たまに困ったことになる

use encoding('cp932')とかって、-n/-pスイッチとかと一緒に使うと
うまく動かなくね?つか、これって基本的に非推奨なんだべ?

Unicode文字列のリテラルや正規表現を直接記述できないので、
use encoding()しないとなると途端にウザい事態になるわPerlは

461:デフォルトの名無しさん
07/01/24 18:39:55
スクリプトをutf8で書けばuse encodingいらないし特に問題ないけどね。


462:460
07/01/24 18:43:07
>>461
それはスクリプトも入力もUTF-8を仮定できるときだけだべ?
少なくともWindows環境でそれは仮定できないなぁ
UTF-8なファイル名でファイル開いたりできないし

463:デフォルトの名無しさん
07/01/24 19:11:42
>>115

464:デフォルトの名無しさん
07/01/24 21:44:41
>462
URLリンク(aspn.activestate.com)

465:460
07/01/24 23:34:35
>>463
-pスイッチや-nスイッチを使わない場合はそれで上手く行くようです。
そもそも毎度毎度こんなに長いのではワンライナーは書けませんし、
簡単な仕事を簡単にやっつけられないのなら、Perlとしての魅力は
激減ですが。

やっつけ仕事によく使う-pスイッチや-nスイッチと
use utf8を共存させる方法はありますか。
#!/usr/bin/perl -pi.bak
なスクリプトで>>115の方法を試すと全くおかしなことになります。

>>464
なるほど、便利なモジュールがあるのですね。

466:デフォルトの名無しさん
07/01/25 00:31:18
間違いなく合ってない。
煽りとかではなく。
別の言語にしたほうが幸せになれるとおもうよ。

467:デフォルトの名無しさん
07/01/25 01:21:17
Perl/Tk で GUI でエロ画像を集めてるよ。

468:デフォルトの名無しさん
07/01/25 02:46:48
エロのエネルギーはおよそ12kW/hです。

469:デフォルトの名無しさん
07/01/25 09:55:07
質問
use strict; warn $c;
だとstrictが効くのに
use strict; warn $a;
だとstrictが効かないのはなぜ?
$bも効かない

470:デフォルトの名無しさん
07/01/25 10:04:09
sort() で使われるから例外扱い
perlvar嫁

471:デフォルトの名無しさん
07/01/25 10:16:32
質問します。

for(my $i=0;$i<=$#aaa;$i++){
$out = $aaa[$i] ;
if( $aaa[$i+1] ){
while($aaa[$i+1] =~ /^\+/){
$i++ ;
$out = "$out $aaa[$i]" ;
}
}
print "$out\n" ;
}

これのforをforeachで書いたらどんな記述でかけますでしょうか。
やりたいことは、ある要素のアタマに"+"があれば
その要素は一つ前の要素とつなげようとしています。
foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。

472:デフォルトの名無しさん
07/01/25 10:18:14
from>>469 to>>470

perldoc perlvar
$a
$b Special package variables when using sort(), see "sort" in perlfunc. Because of this specialness $a and $b don’t need to
be declared (using use vars, or our()) even when using the "strict ’vars’" pragma. Don’t lexicalize them with "my $a" or
"my $b" if you want to be able to use them in the sort() comparison block or function.

thx!


473:デフォルトの名無しさん
07/01/25 10:27:06
>>foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。

foreachでは今アクセスしている要素が何番目かを知ることはできない。
もちろん、中で別に変数を$i++とかすりゃ別。

俺ならこんな感じに書く。

foreach (@aaa) {
if (/^\+/) {
$out[-1] .= " $_";
} else {
push @out, $_;
}
}


474:デフォルトの名無しさん
07/01/25 10:34:48
すまん、なぜかソラ目でprintがpushに見えていた。

printだとこうかな。printが2つあるのがいまいち気に入らないが...

my $buf = undef;
foreach (@aaa) {
if (/^\+/) {
$buf .= " $_";
} else {
print $buf, "\n" if defined $buf;
$buf = $_;
}
}
print $buf, "\n" if defined $buf;

475:デフォルトの名無しさん
07/01/25 10:38:17
>>473 の後
print map { "$_\n" } @out; でもすりゃいいんだから別にいいんじゃ

476:デフォルトの名無しさん
07/01/25 15:20:56
print "$_\n" for @out;
このほうが短い。

477:デフォルトの名無しさん
07/01/25 15:30:03
print join "\n", @out;
の方がわかり安い

478:デフォルトの名無しさん
07/01/25 15:49:57
どれが速いんですかね^^

479:デフォルトの名無しさん
07/01/25 16:05:03
>>477
ダウト。それだと最後の要素の後に改行が出ない。

480:471
07/01/25 16:31:27
>>473
できました!!
すっきりしてわかりやすくなりました。
ありがとうございます。

481:デフォルトの名無しさん
07/01/25 16:40:25
>>479
そういう細かい部分ってすっごい大事だよね
後で泣き見たりする
しかし「ダウト」って使う人はあんまり見たことが無い

482:デフォルトの名無しさん
07/01/25 18:24:14
クイズのゲームを作っているのですが、問題を回答したら次ってどんどん進んでいき
正解したら各問ごとに正解数をカウントしていってりうのですちゃんとカウントされません。

perlはテキストでも作ってそれに書き込んでそのあと読み込んでしないと記憶した
変数が消えるのですか・・・?
変な質問ですみません。HSPからperlに乗り換えてみたんですが混乱してしまって

483:デフォルトの名無しさん
07/01/25 18:28:08
>>482
日本語でおk
HSPで作ったほうがいいんじゃね?

484:デフォルトの名無しさん
07/01/25 18:30:01
>>483
perlの勉強をしてみたいと思いましたので・・・

myで定義をしてるんですけど、なんかいろいろと定義の仕方があるみたいですねperlは

485:デフォルトの名無しさん
07/01/25 18:32:17
さっさとソースを見せろ

486:デフォルトの名無しさん
07/01/25 18:45:37
if($tugi eq "Q1"){
if($toi eq "t"){
$sum=$seikai+1;
}
&mon0;
}
if($tugi eq "Q2"){
if($toi eq "t"){
$sum=$seikai+1;
}
&mon1;
}
if($tugi eq "Q3"){
if($toi eq "t"){
$sum=$seikai+1;
}
&goukei;
}

sub goukei{
print "正解は"+$sum+"個";
}


487:デフォルトの名無しさん
07/01/25 18:45:40
次の問題へ進むたびに正解数を my してるんだろうな

488:デフォルトの名無しさん
07/01/25 18:47:08

sub mon0{
print "<P>";
print "<SELECT name='answer' size='3'>";
print "<OPTION value='true'>みかん</OPTION>";
print "<OPTION value='false'>アップル</OPTION>";
print "<OPTION value='false'>ばなな</OPTION>";
print "</SELECT>";
print "</P>";
print "<INPUT type=hidden name=tugi value=Q2>";
print "<P><INPUT type='submit' value='次の問いへ'></P>";
}
sub mon0{
print "<P>";
print "<SELECT name='answer' size='3'>";
print "<OPTION value='false'>インコ</OPTION>";
print "<OPTION value='true'>ふくろう</OPTION>";
print "<OPTION value='false'>鳩</OPTION>";
print "</SELECT>";
print "</P>";
print "<INPUT type=hidden name=tugi value=Q3>";
print "<P><INPUT type='submit' value='次の問いへ'></P>";
}

こんな感じです

489:デフォルトの名無しさん
07/01/25 18:48:04
webprogでやれ

490:487
07/01/25 18:49:27
はずした。

> $sum=$seikai+1;

491:デフォルトの名無しさん
07/01/25 18:49:59
$sum=$sum+1
じゃないの?

492:デフォルトの名無しさん
07/01/25 18:53:22
>>491
そこは修正しました。
上のほうで
my $sum;
と定義してるのが問題なんでしょうか?

493:デフォルトの名無しさん
07/01/25 18:57:38
上のほうで、とか言われてもわからないから全部見せろ

494:デフォルトの名無しさん
07/01/25 18:58:39
そもそもCUIなのかCGIなのか

495:デフォルトの名無しさん
07/01/25 18:59:02
↓こっちのがいいんでね?
スレリンク(php板)

496:デフォルトの名無しさん
07/01/25 19:08:30
URLリンク(www.vipper.net)
ここに書き込むと長いのでアップしてきました

497:デフォルトの名無しさん
07/01/25 19:19:26
htmlなんだろw

498:デフォルトの名無しさん
07/01/25 19:22:30
板違いっぽいですね(--

499:デフォルトの名無しさん
07/01/26 05:44:42
>>477 は最後の改行もそうだが、メモリ内で一旦展開するから、
効率よくないんでない?


500:デフォルトの名無しさん
07/01/26 07:40:35
さらに、文字列を連結するためにメモリの再割り当てが何度も起きる悪寒

501:デフォルトの名無しさん
07/01/26 11:44:01
UTF8 で並んでいる名前の一覧があるのですが、それをあいうえお別に分類したいのですが
どういう方法が良いでしょうか。

青木 -> @AGyou へ
斉藤 -> @SaGyou へ
という感じにしたいとおもいます。

502:デフォルトの名無しさん
07/01/26 12:04:33
読み仮名付けなきゃ無理だね

503:デフォルトの名無しさん
07/01/26 12:07:36
>>502
お返事ありがとうございます。やっぱり難しいですね orz
別の手段を考えて見ます。

504:デフォルトの名無しさん
07/01/26 12:10:01
>>503
> 別の手段を考えて見ます。

なんで? 読みがなつければいいじゃん。


505:デフォルトの名無しさん
07/01/26 12:13:15
>>504
表現が悪くてすいません。別の手段 → 読み仮名をつけることです。

506:デフォルトの名無しさん
07/01/26 12:32:13
読みがなをつけるモジュールって、あっても良さそうなもんだけどね。
mecabにぶっ込めば一発か?

507:デフォルトの名無しさん
07/01/26 12:35:47
>>506
あ~それ欲しいですね。

508:デフォルトの名無しさん
07/01/26 13:24:24
不確実すぎるだろ・・・

509:デフォルトの名無しさん
07/01/26 14:09:40
すべて登録されているとは限らないし ―特に名前の方、
読みがアンビなのもあるから、必要なのは、読みがなふり支援ツール
じゃなかんべか。

510:デフォルトの名無しさん
07/01/26 15:48:49
漢字にふり仮名を自動でつけるのは
ある程度は自動化できるが
同じ字で読みが違う場合もあるので(ex.徳沢 => とくさわ,とくざわ etc.)
完全な精度では無理。

511:デフォルトの名無しさん
07/01/26 18:19:13
URLリンク(www.alles.or.jp)
684万人を調べて、約7万8千種の名字ランキングを公開している人がいるぞ。
そのデータを使うのが手っ取り早いと思われる。
....しかし、ヒマ人だな~。


512:デフォルトの名無しさん
07/01/26 19:17:30
読みを当てはめるのも結局確率だから
↑のデータ使ってもやっぱ無理っしょ

513:デフォルトの名無しさん
07/01/26 20:45:14
そこでAIの出番なわけだ

514:デフォルトの名無しさん
07/01/26 20:52:49
そこでエスパーの出番なわけだ

515:デフォルトの名無しさん
07/01/26 20:57:04
WindowsXP上でActivePerlを使ってるんですが、USBデバイスをコントロールする方法はありますか?
学習リモコンのクロッサム2+USBとデータをやりとりしたいんですが。

516:デフォルトの名無しさん
07/01/26 21:07:32
>>511のリンク先より引用
----
名字 ふりがな 人数 順位 累積人数  累積比率
鈴木 スズキ 139,627 1  139,627 2.04029%
鈴木 ススギ 25 13,107 6,517,718 95.2398%
鈴木 ススキ 7 27,840 6,723,557 98.2476%
鈴木 スズノキ 3 41,426 6,795,040 99.2922%
鈴木 スズ 2 47,333 6,812,494 99.5472%
鈴木 スズシ 2 47,333 6,812,506 99.5474%
鈴木 スヅキ 2 47,333 6,812,518 99.5476%
鈴木 スス 1 56,150 6,832,142 99.8343%
鈴木 ススヘキ 1 56,150 6,832,147 99.8344%
鈴木 ススリキ 1 56,150 6,832,148 99.8344%
鈴木 スズギ 1 56,150 6,832,151 99.8344%
鈴木 ズスキ 1 56,150 6,832,308 99.8367%
鈴木 ズズキ 1 56,150 6,832,309 99.8367%
鈴木 ヌズキ 1 56,150 6,836,957 99.9047%
----

姓しかわからない状況で確実に読み仮名をつける方法は
>>513のAIじゃなく >>514のエスパーだな。
AIについて無知な>>513はAIと書けばかっこいいと思ってるのか?

517:デフォルトの名無しさん
07/01/26 21:11:14
ヌズキはねーよw どう考えても書き間違いだろwww

あ、ヌズキさん見てたらごめんなさい><

518:ヌズキ
07/01/26 21:24:52
呼んだ?

519:デフォルトの名無しさん
07/01/26 21:26:36
名前の仮名振りは、人間がやってもかなり難しい。
自動化なんてとても無理。 入力補助が限界でしょうね。

520:デフォルトの名無しさん
07/01/26 21:50:28
あと「ズスギ」さんと「ズズギ」さんが入れば
濁点のあるなしの組み合わせがそろうのにな

521:デフォルトの名無しさん
07/01/26 22:00:02
読みが存在しない漢字が存在する

522:デフォルトの名無しさん
07/01/27 00:46:22
たとえば、「東」と書いて「あずま」「ひがし」「とう」と、読み方がいろいろある。
漢字だけからは読み方は判別できない。
そのため、正しい読み方は、本人にしかわからない。

523:デフォルトの名無しさん
07/01/27 00:52:27
同じクラスに五島(ごとう)と五島(ごしま)が居たことあるよ。

524:デフォルトの名無しさん
07/01/27 01:09:35
>>523
おまえ、ひょっとして1年2組の時の近藤(こんどう)か?
おれ隣のクラスの権藤(ごんどう)だよ。おぼえてるか?

525: ◆TWARamEjuA
07/01/27 01:37:47 BE:4356285-BRZ(6761)
住基ネットワークに問い合わせれば総て解決♪

526:デフォルトの名無しさん
07/01/27 15:01:28
>>515
キミの質問は、2つに切り分けないといけない。
1.クロッサム2のDLLのインターフェースが公開されているかどうか。
2.ActivePerl から DLLを呼び出せるかどうか。

両方とも「YES」だからできるのだが、質問の切り分けができず、
「1」の当否を回答者に調べさせるキミには無理だ。

527:デフォルトの名無しさん
07/01/27 15:20:23
>>525
スーパーハッカーキタ━━━(゚∀゚)━━━ !!

528:デフォルトの名無しさん
07/01/27 16:01:58
あふぉか
姓しかわからないデータと住基ネットのデータをどうリンクするんだよ。
>>525=>>527か?
くだらないネタにみんなスルーしてるわけだが、
自作自演するほど反応してほしかったのか?


529:デフォルトの名無しさん
07/01/27 16:22:13
ネタだと思っているなら何故あふぉとか言ってマジ突っ込みするんだろう。分裂気味?
まぁ大方、真相がネタでもマジでも恥かかないよう工夫したら前後で矛盾が出たってとこか。

530:デフォルトの名無しさん
07/01/27 17:17:34
まぁ未承諾さんだし。

531:デフォルトの名無しさん
07/01/27 18:02:01
>>526
もちろんDLLとかWindowsの約束とかよく分かっておりません。
そのあと、mrccom.dllを見つけてWin32::APIでimportを試すところまで来ましたが、
unknown errorでimport出来ず\(^o^)/。どなたか気が向いたら教えてください。

532:デフォルトの名無しさん
07/01/27 20:09:12
>>528
サブイ

533:デフォルトの名無しさん
07/01/27 22:26:03
>>527,>>529,>>532
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ


534:デフォルトの名無しさん
07/01/27 22:45:22
>>528=533 別に君以外誰も文句も言ってないし、しきりも頼んでないけど。
頓珍漢レスを>>529に指摘されて逆ギレしてる張本人乙にしかみえないよ?w

535:デフォルトの名無しさん
07/01/27 22:52:37
粘着だが逆ギレだか知らんが、
PerlのスレでPerlの話をしないやつはすべて平等に価値がない

536:デフォルトの名無しさん
07/01/27 23:29:55
ここは批判されると30分以内に逆切れコメントする527を観察スレですか?

537:デフォルトの名無しさん
07/01/28 00:35:56
>>531
>どなたか気が向いたら教えてください。
まず、C++を勉強しろ。C++でDLLを扱えるようになること。
PerlでDLLを扱う話はそれからだ。

538:デフォルトの名無しさん
07/01/28 01:35:42
>>533
ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ

539:デフォルトの名無しさん
07/01/28 02:58:29
    __
    |   |
    |   |   ___                  ___
    |   | .  /     |  __    _____   / _  \
    |   |  /  /|  |  /  /   / ____/  / /  >  l
    |   |. /  / .|  |. /  /   / /..   _    /   ̄  /
    |   |/  /  |  |/  /   /   ̄ ̄_/   /      \
    |       /.   |     /   / / ̄ ̄ __   /  / ̄ ̄>  |
    |    /   |___/  ./   ̄ ̄ ̄ /  /    ̄ ̄  /
     ̄ ̄ ̄             ̄ ̄ ̄ ̄ ̄     ̄ ̄ ̄ ̄ ̄     _____      ___ ___    ___
    ______                             /__  __/ [][] _| |_| |__ _| |_
     |  ___  \                               / /     |    _  | |_  レ'~ ̄|
     |  |    \  l                              |  |_      ̄|  | / / /   /| |
     |  |____/  /                             \__|      |  |  ̄ /_  /.  | |_
     |  ____/ ___  __    __/ヽ                    |_|.     |__|.   \/
     |  |     /`、_/_/ / _ ヽ  / _  /
     |  |     ヽ  /   | l   l l  | l   l l
     |  |       | l     ヽ  ̄ /  ,ヽ  ̄ /
      ̄          ̄      ̄ ̄  / __ ヽ
                        | l     l l
                        ヽ  ̄ ̄ /
                         ~ ̄ ̄~

540:デフォルトの名無しさん
07/01/28 03:41:10
それ、もう少し小さくならんか。

541:デフォルトの名無しさん
07/01/28 04:14:20
  Web
      でやれ
  Prog

542:デフォルトの名無しさん
07/01/28 04:16:24
vv3bpr0gマ”ゃれ

543:デフォルトの名無しさん
07/01/28 21:16:33
Image::Magickで32bit(RGBA)のpngを読み込んで、24bit(RGB)のpngに書き出したいんだけど、
どうやればいいか教えてください。

544:デフォルトの名無しさん
07/01/28 21:39:34
URLリンク(mechanics.civil.tohoku.ac.jp)
convertで24bit Raw RGBで出力して
それを再度pngで出力すればいいんでね?

545:543
07/01/29 00:12:46
もう少し調べてみたら、
$im->Set(matte => 0);
で解決できました。スレ汚しごめんなさい。

546:デフォルトの名無しさん
07/01/30 20:26:33
threads::shared なんですが、
例) $var : shared;
と言うのは、文法的にどういう意味なのでしょうか?
threadsだけに許された特殊な文法なのでしょうか?

547:デフォルトの名無しさん
07/01/30 21:18:54
attributes

548:デフォルトの名無しさん
07/01/30 22:02:55
>>547
ありがとうございます
CPANで見ても英語がさっぱりで…
分かり易く解説されているページ等はないでしょうか
はてなのは見ましたがさっぱりです

549:デフォルトの名無しさん
07/01/31 17:01:01
質問です
UNIX系OSやWindowsで
.soや.dllを利用したいのですが、
どうするのが一般的でしょうか?
出来れば日本語の解説ページをお願いします

550:デフォルトの名無しさん
07/01/31 23:53:20
質問です
コマンドラインでカウントダウンってできますか?

C:\>perl hoge.pl
次の処理まで待ち時間: 5秒...

のところ “5”の部分のみが 4 3 2 1... と更新されていくようにしたいのです
いちおー system "cls (もしくは) clear "でスクリーンごと更新とかは なしで

Activeperlですが cpanで解決するなら cpanでも結構です

よろしく~

551:デフォルトの名無しさん
07/02/01 00:00:31
>>550
¥b


552:デフォルトの名無しさん
07/02/01 00:05:34
>551
うおっ! ありがとうございます!!
さっそくそのキーワードで調べてみます!!

553:デフォルトの名無しさん
07/02/02 13:47:58
perlでISHテキスト←→バイナリ変換するモジュールってある?
一通りCPANしたりぐぐったりしてみたが見つからなかったんだけど。

554:デフォルトの名無しさん
07/02/02 15:02:25
質問です。
項目数(列数)が多いCSVのデータを読み込んで処理するとき、皆さんはどうしてますか?

私は10項目くらいでしたら
my($id, $name, $age, ..) = split /,/;
と、それぞれ変数を用意するのですが、

100項目を超えるような場合、項目名を要素とする配列を用意しておき
@col_name = qw(id name age ..);

連想配列に格納して
my @array = split /,/;
my %hash = ();
for(0..$#col_name) {
  my $key = $col_name[$_];
  my $val = $array[$_];
  $hash{ $key } = $val;
}
$tel = $hash{tel};

今扱ってるCSVはデータの件数(行数)が500件あって、上記の連想配列の格納をその件数分繰り返し行なっています。



555:554
07/02/02 15:03:04
「項目名 => 項目番号」の連想配列を用意しておくのがいいのかなとも思うのですが、
%col_no = (
  id => 0,
  name => 1,
  ...,
  );
$tel = $array[ $col_no{tel} ];
↑ちょっと読みづらいかなとも思います。

項目数・項目名が変わる可能性は低いです。
効率よりも読みやすさ重視です。

よろしければ、ご意見お聞かせください。


556:デフォルトの名無しさん
07/02/02 15:07:30
$tel = $array->[$i]->{'col_no'}->{'tel'};

557:デフォルトの名無しさん
07/02/02 15:09:34
$tel = $array->[$i]->{'tel'};
これでいいのか
入れ方は任せる

558:デフォルトの名無しさん
07/02/02 18:22:13
@col_name = qw(id name age); # member

$_ = "1,hiroyuki,30"; # csv
@$record{@col_name} = split /,/;


#
print $$record{id},"\n";
print $$record{name},"\n";
print $$record{age},"\n";

559:デフォルトの名無しさん
07/02/02 21:32:19
利便性の為にハッシュを使わざるを得ないのが気になってるんじゃないの?
配列でやりたいなら、こんなことしちゃったり:

my $r = MyRecord->new(split /,/);
print("$r->name\n");

package MyRecord;
BEGIN {
my $i = 0;
my @col_name = qw(id name age); # カラム名を設定。
for my $n (@col_name) {
eval qq{ sub $n :lvalue { \$_[0][$i] }};
$i++; }}

sub new { bless [@_[1..$#_]], $_[0]; }

560:デフォルトの名無しさん
07/02/02 21:34:18
ミス。
print("$r->name\n")
修正 → print($r->name, "\n")

561:デフォルトの名無しさん
07/02/02 22:02:33
>>559
evalで作るのと、*{...} = sub{}で作るのどっちがスマートなんだろ。

562:デフォルトの名無しさん
07/02/02 22:22:43
evalはパーサが動く分遅くはなりそうだけど
通常の定義と見た目が一貫してるから読みやすいかも。

シンボルテーブル+クロージャだと、クロージャ作る側のレキシカルな環境?も意識しないとならないし、ちょっと嫌。

563:554
07/02/03 10:09:16
>>556-562
ご回答ありがとうございます。

いろいろ方法があるのですね。
まだご回答の内容が理解できていないので、勉強してきます。

564:デフォルトの名無しさん
07/02/04 09:24:15
他人が作った、FTPで複数のファイルを受信する為の処理に手を入れなくては
いけないのですが、元のソースにエラー時の処理が全く入っていません。

$ftpcmd = ○○○ #<-ftpコマンドが記述されたテキストファイル
system("ftp -n < $ftpcmd);

対象ファイルは複数あって mget logfile*.* で取って来ています。
ファイルが取って来れなかったり、相手に接続できなかったりといったような
エラーが起きた事を判定するにはどのようにすればいいのでしょうか?
PerlもLynuxも初めてなので、出来るだけ簡単な方法を教えていただけると
ありがたいです。

よろしくお願いします。

565:デフォルトの名無しさん
07/02/04 13:04:46
Net::FTP で書き直したらいいんじゃないかな。

566:デフォルトの名無しさん
07/02/04 15:35:04
>>564
Net::FTPでスクリプト書く例
URLリンク(search.cpan.org)

モジュールが入ってなかったら「perl CPAN」でググってCPANの使い方覚えていれろ

567:デフォルトの名無しさん
07/02/04 16:26:22
Lynuxはおらも初めてだ

568:デフォルトの名無しさん
07/02/04 17:13:07
>>565-566
そのやり方で書き直してみます。
ありがとうございました。

>>567
Linuxの打ち間違いですね。

569:デフォルトの名無しさん
07/02/05 23:30:35
>>565-566

教えていただいた方法で組んでみたのですが、複数のファイルをワイルドカードで
指定して取って来るにはどうしたらよいのでしょう?

対象のファイル名には出力された日付と時刻が含まれていて、個数も名前も不定
なのです(○○○YYYYMMDDHHMM.logのようなファイル名で、日付部分が
当日のものだけ取って来たいのです)。

何度もすみませんがよろしくお願いします。



570:デフォルトの名無しさん
07/02/06 01:45:03
sub mget {
   my($ftp,$pattern) = @_;
  foreach my $file ($ftp->ls($pattern)) {
     $ftp->get($file) or warn $ftp->message;
  }
}


571:デフォルトの名無しさん
07/02/06 23:22:19
>>570
どうもありがとうございます。
上手く持ってこれました。



572:デフォルトの名無しさん
07/02/07 11:31:08
希望結果を得たいのですが、実行結果の通りになります
以下のソースで実行結果になることは納得できるのですが、
希望結果を得るためにはどうすれば良いのでしょうか?

●ソース
@$data=(
{'name'=>'test1','pay'=>'1000','cancel_flg'=>'0','create_date'=>'20070131','cancel?date'=>''},
{'name'=>'test2','pay'=>'2000','cancel_flg'=>'1','create_date'=>'20070110','cancel_date'=>'20070120'},
{'name'=>'test3','pay'=>'100','cancel_flg'=>'0','create_date'=>'20070201','cancel_date'=>''},
);
foreach(@$data){
push(@lst,$_);
if($_->{cancel_flg}){
$_->{create_date}=$_->{cancel_date};
$_->{pay}="-".$_->{pay};
push(@lst,$_);
}
}
print "$_->{name}\t$_->{pay}\t$_->{create_date}\n" foreach(@lst);

●実結果
test1 1000 20070131
test2 -2000 20070120
test2 -2000 20070120
test3 100 20070201

●希望結果
test1 1000 20070131
test2 2000 20070110
test2 -2000 20070120
test3 100 20070201

573:デフォルトの名無しさん
07/02/07 11:44:59
foreach(@$data){
push(@lst, {%$_});

574:デフォルトの名無しさん
07/02/07 11:55:08
>>573
ありがとうございます
希望どおりの結果を得られました
ハッシュ内のデータを1つずつ別のハッシュに移し替えることで回避していましたが
これからはソースがスマートになりそうですw
私が無知なだけだと言う話かも知れませんが、勉強になりました

575:デフォルトの名無しさん
07/02/07 12:23:24
こういうことだな。
$X = ['A'];
$Y = $X; #リファレンスデータのポインタ(?)だけをコピーして、データそのものはコピーしてない。
$X->[0] = 'B';
print $Y->[0];

結果「B」

576:デフォルトの名無しさん
07/02/07 12:36:30
ちょっとCPANで調べるとStorableのdcloneとか、
Clone(::More/Fast/PP/Any...)とかなんかたくさんあるんだけど
どれを使うのがいいんだよ

577:デフォルトの名無しさん
07/02/07 12:39:19
俺は年寄りなのでcancelないときもコピーすんのもったいないと思ってしまう


578:デフォルトの名無しさん
07/02/07 13:56:18
辞書みたいなものを作っているのですが、見出し語にダブりが多数あります。
こんな感じで。

<midashi>kuki</midashi>
茎とはクキである。・・・・・

<midashi>kuki</midashi>
  茎とはクキである。・・・・・

見出し部分タグ内が同じ場合のみ、一つ残してダブりのぶんは見出しも本文も消す、
という作業を行いたいのですが、perlで出来ますか? 
何を勉強すればよいのか、示唆頂ければありがたいです。

579:デフォルトの名無しさん
07/02/07 14:05:52
xmlなら、専用のエディタ使う方がよっぽど早くて安全だと思うのだが。

580:デフォルトの名無しさん
07/02/07 16:05:05
ファイルのパースさえ出来れば楽勝だろうけどたぶんそこが一番の問題だと思う
機械読み取りを考慮した仕様になってればいいんだが

581:デフォルトの名無しさん
07/02/07 22:15:16
配列を初期化したいのですが、どのようにすればいいのでしょうか?

引き渡したパスにあるファイル名を配列に入れて、そのファイル1つ1つを順繰りに
処理していきたいのですが、1度処理をした後でもう1度処理を行うと、最初に配列
にセットしたファイル名が配列に残ってしまっています。
下のソースだと、「1回目」と「2回目」のところでは同じ内容のファイル名が表示
されます(2回目では何も表示されないで欲しいです)。
どこがおかしいのでしょうか?ご指導を宜しくお願いします。

sub aa{
($path) = @_;
@localfl;
@dir;

opendir(DIR,$path) || return(-1);
@dir = readdir(DIR);
foreach $f (@dir){
if($f =~ /^\.\.?/){ next;}#親&カレントフォルダ(.と..)を除外
$localfl{$f} = $f;
}
foreach $f (sort(keys(%localfl))){
print("1回目 $f\n");
}
undef @localfl;#これでクリア?
@localfl = ();#これでクリア?
foreach $f (sort(keys(%localfl))){
print("2回目 $f\n");
}
}

582:デフォルトの名無しさん
07/02/07 22:20:07
@localfl と %localfl は別物ですよ

583:デフォルトの名無しさん
07/02/07 22:55:59
なぜに Perl4 …
変数全部グローバルだし

584:デフォルトの名無しさん
07/02/07 23:05:43
>>582
@localflには最初から何も入ってなくて、%localflをクリアしてないから
前の中身が残ってるということでしょうか?
%localflの中身をクリアすればOKですか(%localfl=""; とか・・?)

>>583
すみません、まだPerl触り出して1週間のド素人なもので・・。


585:デフォルトの名無しさん
07/02/07 23:30:02
%localfl = ();

586:582
07/02/07 23:36:52
とりあえず >>585 の %localfl = (); または undef %localfh; で意図する結果が得られます

バグの温床になるのを防ぐために use strict; と use warnings; をお薦めします
変数を宣言するときは my を使ってください
適当に書き直したらこんな感じでしょうか

use strict;
use warnings;
sub aa {
my ($path) = @_;
opendir(my $dh, $path) or return -1;
my @localfl = sort grep { ! /^\.\.?/ } readdir($dh);
foreach my $f (@localfl) {
print("1回目 $f\n");
}
}

587:デフォルトの名無しさん
07/02/08 00:19:07
>>585
>>586

丁寧に教えていただきありがとうございました。
参考にさせていただきます。

588:デフォルトの名無しさん
07/02/08 20:09:30
Encodeモジュール使い方を勉強中です。
なんとか試行錯誤しながらやってるんですが、
Data::Dumper がやたら文字化けします。
Dumper無しで出力すると化けないので
エンコードの部分は間違ってないと思うのですが。

589:デフォルトの名無しさん
07/02/08 20:16:37
use strict;
use utf8;
use Data::Dumper;
binmode STDOUT,":encoding(cp932)";
my $str="あああ";
print Dumper $str;
print $str;
以上をutf8で書いて実行すると
$VAR1 = "\x{3042}\x{3042}\x{3042}";
あああ
となります
どうにかして日本語をDumperする方法はないでしょうか?

590:578
07/02/08 20:17:25
ありがとうございました。
XML エディタ で検索してみましたが、どうもよく分かりませんでした。
ちなみに見出しは全部でaからzまで数十万あります。
ダブり語は多分、数千種類が各2~7個くらいダブっています。
差し支えなければ、使えそうな専用エディタを教えて頂けないでしょうか?

ファイルのパースさえ出来れば楽勝だろうとおっしゃるのは素晴らしいです。
ちなみに楽勝というのはperl で、ですか? 
機械で読むというのがよく分からないのですが(すみません)、多分txt形式で
50MBくらいのファイルになりそうで、そこまでは出来ます。

591:588=589
07/02/08 20:19:08
ちなみに環境は WindowsXP sp2 上で、ActivePerl Build 819 使用しています。

592:デフォルトの名無しさん
07/02/09 02:39:44
なんとなくWebProgからきました。取り留めもない質問なんですがお願いします。

WEBの掲示板などでよく、特定のタグだけ書き込み許可してますよね。それを実現するのに
下記のようなコードを書きました。最近、WEBに限らず、テキスト系の処理は何するにも
こんな感じでsplitして再帰する書き方に固執してしまってます。
字ヅラ的には短くて気に入ってるんですが、処理的には効率悪い気がしてならないのです。
もっとうまい方法があるでしょうか。

sub escape_limited {

my %args = (str => '', @_);

$exception = q!</?(?:a|img|blockquote|pre|code|span)(?:\s[^>]*)?>!;

my @scraps = split(/($exception)/im, $args{'str'}, 2);

if ((scalar @scraps) == 3) {

return &escape(%args, str => $scraps[0]). $scraps[1]. &escape_limited(%args, str => $scraps[2]);
}

else {

return &escape($args{'str'});
}
}

593:デフォルトの名無しさん
07/02/09 04:00:04
sub escape_limited {
  my %args = (
    str     => '',
    allowed => qr{a|img|blockquote|pre|code|span},
    @_
  );
  my $text = $args{str};
  $text =~ s{( < (?! /? (?:$args{allowed}) \b ) [^>]* > )}{ escape($1) }iegx;
  return $text;
}

とかでどう?

594:デフォルトの名無しさん
07/02/09 09:53:04

$LT = quotemeta escape("<");
$GT = quotemeta escape(">");

($str = escape($str)) =~s/$LT\/?(a|img|b|blockquote|pre|code|span)\b.*?$GT//ig;

とかねー。多分軽いよ。

タグ内に'<' '>' が無いことを前提にしてるみたいだけど、大丈夫?
属性も調べないと、スタイルシートとかスクリプトとか埋め込まれる可能性もあるし。

595:デフォルトの名無しさん
07/02/09 10:35:31
うおっ、間違えた。正規表現のリテラルのトコ…。
s/$LT(\/?(?:a|img|b|blockquote|pre|code|span))\b(.*?)$GT/<$1$2>/ig

だわな。スマソ

596:デフォルトの名無しさん
07/02/09 13:59:17
試しました。
592(私):スプリット型
593:一発置換型
594:例外事後処理型

マッチングがひとつもない場合
592:速い
593:圧倒的に遅い
594:速い

マッチングがある場合
592:圧倒的に遅い(しかも多重再帰の警告でまくり)
593:少し速い
594:速い

一旦、なりふり構わず置換してから例外を元に戻すってのは、
分かりやすいだけで処理的に気持ち悪いと思ってましたが、
意外と効率いいんですね。


597:デフォルトの名無しさん
07/02/09 14:07:03
お礼を忘れました。みなさんありがとうございます。
ひとつ、事後処理型の場合、対象文字列に最初からエスケープ文字が
含まれてるケースを考慮する必要がありますね。これが一番やっかいかなあ。


598:デフォルトの名無しさん
07/02/09 14:10:29
いや、一旦、二重エスケープになって元に戻るからいいのか。
混乱してきたので仕事に戻ります。


599:デフォルトの名無しさん
07/02/09 15:02:53
>>590
テキスト読み込んで処理はPerlの得意とする分野なので楽勝

タグは<midasi></midasi>だけなのか?その他のタグがあったとして処理する必要はないのか?
複数の同じ見出しに対し残す本文はどれでもいいのか?
本文中にタグや特殊文字があったりした場合は?一意に判別できるエスケープの仕様はある?

あたりの仕様さえ確定できればファイル読み込みのやりかた、正規表現、ハッシュあたり覚えればできるっしょ
ちゃんとしたXML形式になってるなら専用のパーサ使えば楽が出来るが、正規表現でも十分なように思える

600:デフォルトの名無しさん
07/02/09 23:36:51
ちゃんとしたXMLになってなくても、XML::Liberal使えばわりといける。

601:デフォルトの名無しさん
07/02/10 03:35:34
wxperlを使ってGUIのメモ帳を作っています。ファイルを新規に保存するとき
ファイルと同名のフォルダをつくりたいのですがなぜかうまくいきません。
my $filename = $saveasdialog->GetPath;  
$this->{text_ctrl_1}->SaveFile($filename);
mkdir($filename);

このスクリプトで、一行目でwxperl filedialogオブジェクトにより
ファイル名が取得され$filenameに入ります。2行目でsavefileメソッドで
テキストが$filenameの通りに名前がつけられ保存されます。これは正常にいきます。
しかし、3行目のコードではフォルダが作成されません。

wxperl固有というよりもperlのコードの書き方に問題があるような気がするのですが、
アドバイスがあったらお願いします。

602:デフォルトの名無しさん
07/02/10 03:46:04
> ファイルを新規に保存するときファイルと同名のフォルダをつくりたい

なんじゃそりゃ??


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