[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 04/04 01:09 / Filesize : 256 KB / Number-of Response : 807
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Perlについての質問箱 41箱目



1 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 03:03:00 ]
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: pc11.2ch.net/php/)

CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

www.perl.org/get.html
● 2009/08/07 現在の最新版: 5.10.0

▼ 前スレ
Perlについての質問箱 40箱目
pc12.2ch.net/test/read.cgi/tech/1243631674/

リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-6 あたり

669 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 07:53:07 ]
>>668
XSが何か分かってないだろ。
ちゃんとPerlの質問だ。

質問にも答えたいが朝食を作らないと。

670 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:24:05 ]
>>667
SvPOK_onlyかSvPOK_only_UTF8が必要なんじゃね?

671 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:26:25 ]
>>666
あーちなみに文字列の突っ込み方は合ってるし、
そっち方面の質問がメインならC/C++のスレに行きな。ちなみに勘だが、

SV *
hoge()

ここがおかしいんじゃないか?SV *返すことってできたっけ?
インクルードファイルやMODULE行がないのは端折ってるだけだよな?

672 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:32:21 ]
5バイトしか取ってないのにNULLを6バイト目に入れてるけどいいの?

673 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:32:52 ]
あ、いいのか。

674 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:33:11 ]
>>672
6バイト取ってるでしょ。マニュアル嫁

675 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:34:07 ]
先越されるとは思わんかった。>>673>>671へだ。SV *自体問題ない。

676 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 09:46:21 ]
newSVpvと文字列コピーするところ以外は
やりたいことは一緒なんだから比べてみ。

677 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 10:10:11 ]
SVの実体が何か明示する前に文字列と決め付けてるからまずいんじゃないか。
いきなりnewSVみたいな低レベルの関数使うと怪我をするよ。
SV *string = newSVpv(" ", 5);としたらどうなる?



678 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 12:52:54 ]
スペースは5個な。まあ6バイトallocしてくれてるはずだから、
初期化するまで値が不定になるだけで実害はないと思うが

679 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:23:46 ]
>>668
たしかにコードはC++チックですね。コメントが // だったり、変数宣言が先頭になかったり。

>>669
668さんはXSが何かわかったうえでの発言だと思いますよ?

>>670
RETVALUE = string;
の行の前に
SvPOK_only_UTF8(string);
を追加してみましたけど、状況は変わらずでした。

>>677
newSVpvn(" ", 5) ですよね。それだとうまくいくんですが、これだとコピー元の文字列を
あらかじめ用意してないといけないので、今回の目的には適合しませんでした。

で、いろいろ調べて、New() と Safefree() と newSVpvn() を使うことにしました。
でもこれだと New() でバッファを用意して、文字列を埋めて、newSVpvn() でコピーして、・・・と
しなきゃいけないから、newSVpvn() でコピーするのが無駄かなあとは思うんですけど、
これしかうまくいかないので、そうします。
アドバイスいただいたみなさん、ありがとうございました。




680 名前:uy50% ◆e6.oHu1j.o mailto:sage [2009/10/02(金) 23:15:29 ]
ラリーウォールさんの書いたperlのソースってどこかで見れませんか?
どんなものでもいいです

681 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 23:26:04 ]
www.wall.org/~larry/

682 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 01:34:21 ]
Mail to larry@wall.org

このメアドがまたすげー

683 名前:uy50% ◆e6.oHu1j.o mailto:sage [2009/10/03(土) 02:33:27 ]
>>681
見つからないんですが、どこのページに?

684 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 04:31:47 ]
mapのような書き方をするメソッドを実装したいんですが、
もしかして第一引数に勝手にインスタンスが入るのでsubが省略できなかったりしますか?

685 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 04:32:13 ]
あ?

686 名前:デフォルトの名無しさん [2009/10/03(土) 05:06:10 ]
>>679
どうせnewSVpvn使うならこれでどうだ?。ナルストリングで文句があるならもう知らん。
newSVpvは初期化文字列が空でもちゃんと6バイト確保してくれるところがミソだ。

普通ならまず(char *)sを作ってnewSVpv(s, 5)すりゃ何の問題もないんだが、それだと
困るんだよな?

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

MODULE = Foo PACKAGE = Foo

SV *
hoge()
 CODE:
  int i = 0;
  char c = (char)0;
  SV *string = newSVpv((char *)&c, 5);
  char *s = SvPVX(string);

  for (i = 0; i < 5; i++) s[i] = 'x';
  s[i] = (char)0;

  RETVAL = string;
 OUTPUT:
  RETVAL


687 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:13:25 ]
>>686
あなたには答えてほしくありません。



688 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:20:57 ]
>>684
日本語がよくわからんが....。map { some_code } @foo;のようなことがしたいなら、

my_map(&@){ ... }
:
my@bar = my_map { some_code } @foo;

で出来る。
map BLOCK LIST
map EXPR, LIST
の2つの書式を満たす方法は知らん。

689 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:23:18 ]
>>687
回答者を選ぶなら質問するな。
そもそも俺が何番の人か分かってるのかなこの人。勘違いだと思うんだが。
何番かアンカー晒してみ。

690 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:24:10 ]
あー>>687が質問者じゃなくて単なる煽りの可能性もあるな。だったらすまん>>687

691 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 05:47:31 ]
普通に考えてそうだろ.

692 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 07:03:49 ]
 CODE:
  int i = 0;
  SV *string = newSV(0);
  char *s = (char *)malloc(6);

  for (i = 0; i < 5; i++) s[i] = 'x';
  s[i] = (char)0;

  sv_setpv(string, s);
  free(s);

  RETVAL = string;


693 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 13:40:30 ]
>>688
すみません、サブルーチンの場合にそう書けるのは知ってます
クラスをオブジェクトとして作ったときに、$hoge->map({ $_ =~ /hoge/} @huga) というmapメソッドを書く方法はないのか知りたかったのです
しかしこのとき実装側では sub map($&@){… としなければいけないため、呼び出し側のsubが省略できないじゃないですか
なので、これをなんとかできないものかと思いまして…

694 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 14:08:52 ]
メソッドの呼び出しはプロトタイプ効かないから無理くさくね?

695 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 14:13:13 ]
やはりそうですか…
ありがとうございました

696 名前:デフォルトの名無しさん [2009/10/03(土) 14:26:36 ]
ttp://deepneko.dyndns.org/kokotech/2009/06/mecabwikipedia.html
このサイトに書いてあるようにしたのですが、rubyで書かれています。これ(下のプログラム)をperlで書き換えたいのですが、分かる方が居たらお願いします。

#!/usr/bin/ruby

open($*[0]).each do |line|
title = line.strip

next if title =~ /^\./
next if title =~ /[0-9]{4}/
next if title =~ /^[-.0-9]+$/

score = [-36000.0 ,-400 *(title.size**1.5)].max.to_i
print "#{title},0,0,#{score},名詞,一般,*,*,*,*,#{title},*,*,wikipedia_keyword,\n" if title.size > 9
end

697 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 15:17:11 ]
>>696
これなら初心者の自分でも書き直せるYO
エレガントな回答は上級者にまかすけど。

#!/usr/bin/perl

use List::Util qw(max);

open my $fh, $ARGV[0] or die $!;
while ( my $line = <$fh> ) {
my $title = $line;
$title =~ s/^\s*(.*?)\s*$/$1/;

next if $title =~ /^\./;
next if $title =~ /[0-9]{4}/;
next if $title =~ /^[-.0-9]+$/;

my $score = int max(-36000.0 ,-400 *((length $title)**1.5));
print "$title,0,0,$score,名詞,一般,*,*,*,*,$title,*,*,wikipedia_keyword,\n" if length $title > 9;
}
close $fh;




698 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 15:49:41 ]
>>693
map $hoge (....)とは書けるんだがな。
メソッド呼び出しはリストしか受けないから無理でしょ。

699 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 22:35:23 ]
WWW::SourceforgeJP ver.0.0.1 リリース
acapulco.dyndns.org/blog/2009/10/03/wwwsourceforgejp

700 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 23:25:10 ]
正規表現でマッチした文字列そのものを取得したいです

例えば
"hoge huga" =~ /(\s|\d)/
という正規表現があったとき、
' 'ではなく'\s'を取得したいです

可能でしょうか

701 名前: ◆TWARamEjuA mailto:sage [2009/10/03(土) 23:30:31 BE:1307243-BRZ(10101)]
可能でしょうねぇ。。。

702 名前:デフォルトの名無しさん [2009/10/03(土) 23:36:15 ]
700じゃないけど、どうすればできるか知りたい。
役に立つ気はしないけど。

703 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 23:46:01 ]
(?{})とか(??{})を駆使すればいけるかもしれないけど
デフォでそんなインターフェイスは用意されてないっしょ

704 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 00:03:31 ]
>>703
??{}ですか
参考になりました、調べてみますね
ありがとうございました

705 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 00:03:35 ]
おれも知りたい。

706 名前:700 mailto:sage [2009/10/04(日) 01:55:44 ]
こういう感じで元の文字列を取ることができました
ありがとうございます

perl -e '
use re "eval";
$hoge = q/ho..(?{$str="ho.."})|hu..(?{$str="hu.."})/;
"huga" =~ /$hoge/;
print "1:$str\n";
"hoge" =~ /$hoge/;
print "2:$str\n";
'
1:hu..
2:ho..

やりたかったのは
%hash = (
   '\s+' => 'space',
   '\d+' => 'number',
   '\w+' => 'word',
);

という感じのハッシュのキーを合成して、一番最初にマッチしたものの名前を返す関数の作成だったので、
これでいけそうです


707 名前:700 mailto:sage [2009/10/04(日) 03:45:43 ]
なんか変にハマったのでもう一度質問させてください。。。
下のような関数を作りました

sub match($@){
   use strict;
   use re "eval";
   my $str = shift;
   my @member = @_;

   my $regex = join("|", map{ "$_(?{\$ret = q{$_}})"} @member);
   my $ret;
   $str =~ /$regex/;
   return $ret;
}

以下の呼び出しを行うと、

print match("hoge 123", qw(\d \w \s)), $/; #=> \w
print match(" 123hoge", qw(\d \w \s)), $/; #=>
print match("123 hoge", qw(\d \w \s)), $/; #=>

となり、思った結果を返してくれませんでした
ですが、match関数に渡す配列の順番を変えたところ、

print match("hoge 123", qw(\d \w \s)), $/; #=> \w
print match(" 123hoge", qw(\w \d \s)), $/; #=> \s
print match("123 hoge", qw(\d \w \s)), $/; #=> \d

と、期待通りの結果を返してくれました
これは一回通った正規表現に対してはサブパターンは呼び出されないということなんでしょうか。。。



708 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 04:32:58 ]
レキサ作ってんのか。。。

709 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 10:06:58 ]
>>707
>>706のレス見たときに、関数化してハマるんだろうなーと思ったらマジでハマっててワロタ

my $regex → local our $regex
my $ret → local our $ret
これでどうかな?
昔、そういうプロギラムを書いていたときには、こいつで回避出来たよ

多分、正規表現リテラルは初回の正規表現コンパイル時に、クロージャのようにローカル環境をキャプチャするけど
再度、同じ正規表現を与えてリテラルのパスを通ってもキャプチャが発生しない
なので、正規表現の中ではmy変数は使わず、グローバル変数を使えばOKと

710 名前:700 mailto:sage [2009/10/04(日) 14:05:04 ]
>>709
おお!いけました!
ありがとうございます

use strictすることでこんな罠が生まれていたとは思いもしませんでした
正規周りは魔物が住んでますね…

711 名前:デフォルトの名無しさん [2009/10/04(日) 16:12:52 ]
utf8で書かれた文章をeuc-jpで新しく保存しようとすると開けなくなります
何が原因でしょうか。また解決するにはどうすれば良いでしょうか?

712 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 17:21:40 ]
777

713 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 17:25:40 ]
>>711
use utf8とかその辺りが原因の気が。

714 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 20:45:37 ]
>>713
csvファイルなのですがutf8のtext.csvを
nkf -e test.csv > test2.csv
で変換すると、開けなくなります。

715 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 21:42:37 ]
おいおい、言ってることがめちゃくちゃだな。
何をしようとして、何をしたら、どうなって欲しいのに、どうなったか、具体的にキチンと書いてみ。

716 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 22:00:58 ]
Web::Scraperでデータの抽出しているのですが
XpathをFirebugで取得してWeb::Scraperに処理させると、Xpathがずれてしまいます。
Firefoxのレンダリングでタグが追加変更されているのが原因みたいです。

PerlからFirefoxでレンダリング済みのタグを取得することはできないのでしょうか?
よろしくお願いします。

717 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:34:57 ]
ttable を除去すればいけるけど…
そういうことじゃなくて?



718 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:42:14 ]
>>717
tbody以外にもページによって
tr[2]をtr[3]に変えたりとか
/table/tbody/tr/tdが追加されてたりとか
center/div/div/fontが追加されたりとか

単純なパターンで取れない感じがするので、いっそのことFirefoxでレンダリング済みのソースを
perlから取れないかな?と思ったのです。


719 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 16:57:25 ]
卒業研究でperlを使うことになったんですが、
linux環境でMeCab.pmのperlモジュールを使用するにはどうしたらいいのでしょうか?
linuxはvine3.2です。

720 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 18:33:11 ]
フロストバイトエンジンがPC版でどのくらい綺麗になるのか見てみたい

721 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 18:35:36 ]
>>720
ごめん、ごばった

722 名前: ◆TWARamEjuA mailto:sage [2009/10/05(月) 18:36:03 BE:1742382-BRZ(10101)]
>>719
ググればすぐに出てくるんですけれども。。。
ttp://www.alwaysfine.jp/2008/03/spamassassin_32wo.html

いわゆる犬学生なんでしょうね。。。

723 名前:デフォルトの名無しさん [2009/10/06(火) 10:51:28 ]
. 1. HTML    で検索した結果 1〜10件目 / 約5,040,000,000件
. 2. PHP      で検索した結果 1〜10件目 / 約2,970,000,000件
. 3. Java......   で検索した結果 1〜10件目 / 約 835,000,000件
. 4. Forth.    で検索した結果 1〜10件目 / 約 323,000,000件
. 5. Ruby..    で検索した結果 1〜10件目 / 約 275,000,000件
. 6. perl.....    で検索した結果 1〜10件目 / 約 245,000,000件
. 7. Python...   で検索した結果 1〜10件目 / 約 204,000,000件
. 8. pascal...   で検索した結果 1〜10件目 / 約 170,000,000件
. 9. Delphi    で検索した結果 1〜10件目 / 約 127,000,000件
10. VisualBasic...で検索した結果 1〜10件目 / 約 121,000,000件
11. lisp...      で検索した結果 1〜10件目 / 約.  26,700,000件
12. fortran     で検索した結果 1〜10件目 / 約.  21,300,000件
13. COBOL    で検索した結果 1〜10件目 / 約.  18,500,000件
14. HSP      で検索した結果 1〜10件目 / 約.  12,300,000件
15. FreeBasic.. で検索した結果 1〜10件目 / 約   6,320,000件
16. Tcl/Tk.     で検索した結果 1〜10件目 / 約   4,940,000件
17. QBasic     で検索した結果 1〜10件目 / 約   4,190,000件
18. VisualC....  で検索した結果 1〜10件目 / 約   1,360,000件
19. DarkBASIC. で検索した結果 1〜10件目 / 約   1,320,000件
20. BasicStudio で検索した結果 1〜10件目 / 約    304,000件
21. N88basic.   で検索した結果 1〜10件目 / 約    215,000件
22. f-basic     で検索した結果 1〜10件目 / 約    109,000件
23. ActiveBasic で検索した結果 1〜10件目 / 約.     89,800件
24. 99BASIC.... で検索した結果 1〜10件目 / 約.     11,500件

3Dprogramming で検索した結果 1〜10件目 / 約794,000件
2Dprogramming で検索した結果 1〜10件目 / 約. 57,400件

intel で検索した結果 1〜10件目 / 約729,000,000件
amd で検索した結果 1〜10件目 / 約355,000,000件

724 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 11:01:41 ]
>>715
保存でeuc-jp指定とnkfで-eとは違うのですか?
無知ですみません。

725 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 11:37:51 ]
>>724
出力はeucって指定してるけど、入力の指定は?
もとのファイルがUTF8だということをnkfに教えてやらなければダメなのかもね。
nkfの説明書をよく読んでみてよ。

726 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 12:06:40 ]
ある2種類の要素数が同じ配列データがあって
片方は末尾までデータが入っているのですが
もう片方は末尾に半角スペース1個だけが入っています

この配列をファイルに書き出す際、前者は全て書き出し、後者は最後の配列のみ書き出さないようにしたいのですが、うまくいきません

ループ中に配列aの最後n番目が半角スペースなら書き出さない場合、
if($a[$n] eq " "){
last;
}
では駄目なのでしょうか
携帯からなので読みにくいですがよろしくお願いします

727 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 12:40:35 ]
デバッグという概念が失われて久しい……



728 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 13:18:59 ]
改行が入ってんだろ

729 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 14:04:23 ]
>>726
デバッグしろ。

if($a[$n] eq " ") がヒットしているか調べろ。$a[$n]の中身を調べろ。

730 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 16:09:48 ]
perl のデバッガって何がおすすめですか。

731 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 16:17:19 ]
Data::Dumperでデータの中身見てDevel::Peekでutf8フラグ見るくらいしかやったことないな

732 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 18:55:01 ]
ifの前ぐらいに
print "!!! HELLO !!! $n='$a[$n]'\n";
って書いておくといいよ。

733 名前:デフォルトの名無しさん [2009/10/07(水) 01:31:47 ]
>>726
if($a[-1] eq " "){
output @a[0..$#a-1];
}else{
output @a;
}

734 名前:デフォルトの名無しさん [2009/10/07(水) 01:35:46 ]
>>733
pop @a if $a[-1] eq " ";
output @a;


735 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 02:18:49 ]
2行の文字列があって、
1行目の文字列を2行目の文字列の任意の場所に挿入
その後1行目を改行ごと削除
という作業はどう書けばいいでしょうか?

736 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 03:34:48 ]
>>735
splitで切って2つの文字列に分けて、substrで1行目を2行目に入れればいい。

737 名前:デフォルトの名無しさん [2009/10/07(水) 07:10:08 ]
>>735
日本語が妖しいので確認


入力> 2行一組の文字列
出力> それぞれの組を1行にまとめた文字列
処理> 改行を削除した1行目を2行目の任意の場所に挿入






738 名前:デフォルトの名無しさん [2009/10/07(水) 07:46:29 ]
>>736
chomp(@d=<>);
for ($i=0;$i<@d-1;$i+=2){
 $len=length $d[$i+1];
 substr($d[$i+1],rand($len),0)=$d[$i];
 print $d[$i+1]."\n";
}



代入型のsubstrって戻り値は代入後の文字列だっけ?
ググっても見つからなかった。

739 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 10:47:16 ]
> ググっても見つからなかった。

最近の Perl を良く知らないのですが perldoc などのオフィシャルなドキュメントは存在しないのでしょうか?

740 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 11:07:25 ]
>>738
どっちかというとperlop(1)のAssignment Operatorsの方をよく読んだ方が
いいんじゃない?

C と違って、スカラ代入演算子は有効な左辺値を作り出します。代入を修正することは、代入を行なってから、その代入された変数を修正するのと同じことになります。これは、以下のように何かのコピーを変更したいときに便利です:

($tmp = $global) =~ tr [A-Z] [a-z];

(perldoc.jp/docs/perl/5.10.0/perlop.pod)

てことなので、

$tmp = "ABCDEF";
$global = "XYZ";
(substr($tmp, 2, 2) = $global) =~ tr [A-Z] [a-z];

とか試してみれば理解できると思います。

741 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 11:12:40 ]
>>739
あるよ
perldoc -f substr
で調べられる

742 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 13:06:10 ]
正規表現で、abもしくはxyもしくは12を含むは、

/ab|xy|12/

と書きますが、ab、xy、12の全て含むはどう書くのでしょうか?

743 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 13:30:17 ]
>>742
ab,xy,12をすべての順列で並べて

ab.*xy.*12|ab.*12.*xy|...

と書けばいい。

無理に正規表現だけでやらずに

/ab/ && /xy/ && /12/

とした方が楽だと思うけどね。

744 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 13:43:19 ]
>>743
d

745 名前:デフォルトの名無しさん mailto:sega [2009/10/07(水) 14:04:22 ]
ファイルテスト演算子 -T って、
どうやってテキストファイルだと見破ってるの?
その原理とか注意事項ってある?

746 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 14:19:45 ]
>>745
とりあえずperlfunc読め。

ファイルテスト -T と -B の動作原理は、次のようになっています。ファイルの最初の数ブロックを調べて、
変わった制御コードや上位ビットがセットされているような、通常のテキストには現れない文字を探します。
そのような文字が、たくさん (>30%) 見つかるようであれば、そのファイルは -B ファイルであると判断され
ます; さもなければ -T ファイルとなります。最初のブロックにヌル文字が含まれるファイルも、バイナリ
ファイルとみなされます。 -T や -B をファイルハンドルに対して用いると、最初のブロックを調べる代わり
に、IO バッファを調べます。調べたファイルの中身が何もないときや、ファイルハンドルを調べたときに
EOF に達していたときには、-T も -B も「真」を返します。

「通常のテキストには現れない文字ってなんだよ!!」とか言いたくなったら、ソース読むしかないかな。
(pp_sys.cのpp_fttext)

でも結局30%だからあんまりアテにすると痛い目を見そうなんで俺は使わないね〜。

747 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 14:31:29 ]
マニュアル提示サービスはここですか?



748 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 14:36:29 ]
ちがいます

749 名前:デフォルトの名無しさん [2009/10/07(水) 15:16:53 ]
>>747
そうです。
ここは、疑問を書けば、マニュアルの該当部分を張ってくれるスレです。


750 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 15:18:04 ]
ここは質問スレだよ(´・ω・`)

751 名前:デフォルトの名無しさん [2009/10/07(水) 15:22:25 ]
そうです 質問スレです…

752 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 15:35:33 ]
そもそも、マニュアルに書いてあることが質問される時点で異常な状態だということを見失うなかれ。

753 名前:デフォルトの名無しさん [2009/10/07(水) 15:40:44 ]
>>739
オフィシャルなドキュメントには記載が見つからなかったのです

754 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:17:48 ]
>>752
googleで-Tを検索したら何も出てこなかったんだよきっと

755 名前:デフォルトの名無しさん [2009/10/07(水) 22:03:27 ]
>>752
じゃあ、substrに代入したときの返り値を調べてみてよ。


756 名前:741 [2009/10/07(水) 23:02:37 ]
>>755
あぁ、ごめん。741だけど
> 代入型のsubstr
この部分に全く目がいってなかったわ
my $result = (substr($d[$i+1],rand($len),0)=$d[$i]);
この$resultがどうなるかって意味だよね?それなら載ってないかも。俺が普段この書き方しないから空目した

自分で>>735を書くとしたら下のような感じかなぁ
my $str =<< "STR";
abcdef\n123456\nghijklmn\n78910223
STR
warn $str;
my @res;
my @lines = split /\n/, $str;
while (@lines) {
  my $line1 = shift @lines;
  my $line2 = shift @lines;

  print "num?: ";
  my $num = <STDIN>;
  my $length = length $line1;
  my $post = substr $line2, $num, $length, $line1;
  push @res, $line2 . $post;
}
print
  join "\n", @res,
  "\n";

757 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 04:05:10 ]
>>755
なにがどう「じゃあ」なんだよwww




758 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 04:53:55 ]
$ perldoc -f substr
No documentation found for "perlfunc".

^^v

759 名前:デフォルトの名無しさん [2009/10/08(木) 06:39:44 ]
>>756
マニュアルに記載のない使い方はしないほうがよいのか
代入文だからlvalueが保持されると考えるのがよいのかが知りたかった。
多分、後者だね。


コードについては、ヒアドキュメント使うと柔軟性に難があるから、下記のがいいかも。

@lines=<DATA>;

(プログラム末尾)
__DATA__
入力データ
入力データ



あと、入力が偶数行でなかったときはこけるね。
入力の妥当性を調べるのはプログラムの仕事だよ。

それから、任意ってそういうことだったのかな?
もとの要求が謎の多いものだから、こちらは乱数にしたのだけど。

760 名前:デフォルトの名無しさん [2009/10/08(木) 06:46:42 ]
>>756
もう一度プログラム見た。
これ、正しくない。

挿入位置+1行目の長さが2行目の長さより短いと
順がおかしくなる。

761 名前:デフォルトの名無しさん [2009/10/08(木) 09:04:20 ]
>>760
おぉ。ホントだ。台風で午前中休みにして暇になったから直した。
無理やりsubstr使う必要なかったな
my @lines = split /\n/, $str;
die unless $#lines % 2;

my @res;
while (@lines) {
  my $line1 = shift @lines;
  my $line2 = shift @lines;

  print "num?: ";
  my $num = <STDIN>;
  my $post = substr $line2, $num;

  $line2 =~ s/($post)$/$line1$1/xms;
  push @res, $line2;
}

762 名前:デフォルトの名無しさん [2009/10/08(木) 11:53:43 ]
ハッシュ%hogeで
$hoge{$a}{$b}{$c}{$d}...{$n}
を定義した順番でkeyを
keysで取り出したい

普通モジュールの Tie:IxHash を使うらしいけど
それだと最初の$aのkeyだけ定義順番でとりだせて
%{$hoge{$a}}以降の深い構造でのkeyが
順番どうりならず、ばらばらにkeysで取り出されるようになる

どうにかして定義した順番でどの段階でも
取り出せるようにしたいんだけど
おしえて下さい。

763 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 12:04:59 ]
>>762
キーを配列にとっとけ。
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$a, $foobar]);




764 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 12:07:39 ]
$hash{a}{b}に値を入れる前に

tie %{$hash{a}}, 'Tie::IxHash';

しておけば、

keys %{$hash{a}}は順番に取り出せるよ。

765 名前:デフォルトの名無しさん [2009/10/08(木) 15:42:29 ]
一度で深いところの値を定義することになるので
(このように $hoge{$a}{$b}{$c}{$d}...{$n}=1)
>>764はつかえない

あと同じkeyが何回もでてくる可能性があるので>>763
もつかえない
(このように for $a (同じのあり)
        for  $b (同じのあり)
          $hoge{$a}{$b}{$c}{$d}...{$n}++
 )
あとでkeyをとりだすとき何回も同じのがでてきてしまう
>>763

いい方法ないでしょうか

766 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:45:51 ]
>>765
配列だから同じキーが何回出てこようとちゃんと
保存されていて問題ないはずだが?

767 名前:765 [2009/10/08(木) 15:46:38 ]
あと
tie
すると前保持していた値がすべて真っ白になってしまうので
繰り返しのなかに>>764
いれられない状態。
一日なやんでもいい方法が思いつかない



768 名前:デフォルトの名無しさん [2009/10/08(木) 15:52:52 ]
a b c d a b c d e f a g a
という順番でkeyがでてくるとする
とりだすときは
a b c d e f g
でとりだしたいんだけど
できる?>>766


769 名前:デフォルトの名無しさん [2009/10/08(木) 15:57:32 ]
>>762
やり方が悪いので、データ構造を見直すべし。

770 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 15:59:54 ]
>>768
そんなのすでに取り出したかハッシュで管理してとばせばいいだけだろ。

771 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 16:10:42 ]
>>768
それこそハッシュ使って同じキーが出てきたらスキップするようにすればいい。
んで$hoge->{$foo}の階層だけとりだしたいなら、

whlile(@hoge){
  next unless $_->[$foo];
  my @keys = @$_;
}

で取り出せるだろ。あ、あと>>763は間違いがあった。

間違い
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$a, $foobar]);

正しい
$hoge{$fuga}{$foobar} = 'bar';
push(@hoge, [$fuga, $foobar]);

772 名前:デフォルトの名無しさん [2009/10/08(木) 17:35:28 ]
もしかしてこういうのでいいってオチか?

print sort keys %hash;

もしくは

print map $hash{$_}, sort keys %hash;


773 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 18:44:55 ]
よくわからんが、各層のキーをjoinしたものをハッシュキーにして
Tie::IxHashを使えばいいんじゃないのか。

774 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 21:00:34 ]
Perlで/etc/shadowに使うSHA512化されたパスワードを作ろうとしているのですが
/etc/shadowとsaltとpasswordを同じにしても出てくるハッシュが一致しません。

もし他によい方法があれば教えて下さい・・・

#!/usr/bin/perl
use strict;
use Digest::SHA qw(hmac_sha512_base64);

my $sha = hmac_sha512_base64("password","salt");
print "$sha\n";

775 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 22:25:23 ]
Webリソースのバイト数を取得するモジュールって何かありますか?

776 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:12:20 ]
>>775
Webリソースって具体的に何だ?

777 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:20:33 ]
>776
タイミングが悪くて非常に申し訳ない。
自己解決しました^^;

ダウンロード対象のつもりでした。html,zip,etc…



778 名前:デフォルトの名無しさん [2009/10/08(木) 23:21:56 ]
perlってsocks串刺せますか?

779 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:27:55 ]
uaでいいんじゃないのか?

780 名前:デフォルトの名無しさん [2009/10/08(木) 23:28:35 ]
ua…
LWP?とかいうのと関係ありますか?

781 名前:デフォルトの名無しさん [2009/10/09(金) 05:57:46 ]
>>774
目的はクラッキング?
フツウの人はシャドウなんていじらないもんな。

782 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 07:14:21 ]
Pealのデバッガで変数を強制で変えるコマンドってある?

初心者な質問ですまん

783 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 07:45:58 ]
perlな

784 名前:デフォルトの名無しさん [2009/10/09(金) 08:52:12 ]
>>782
普通に代入じゃだめなのん?

785 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 09:14:52 ]
>>774
そういうシステムならcryptもsha512対応してると思うので
そっち使えばいいと思う。同じライブラリ呼ぶので確実な
筈だよ。

print crypt('password', '$6$salt');

786 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 14:08:33 ]
>>774
車道クラックか?

>>777
解決したならそれを書くのが筋。HTTPレスポンスのことならHTTPヘッダの
Content-Length: 行で取れるよな。

>>782
スカラ型の内部値を変えたいのか?質問の意図がよくわからん。
数値にしたけりゃ
$foo += 0;
文字列にしたけりゃ
$foo .= '';
内部的にリファレンスとか整数型にしたいとかだったら簡単な方法は知らん。

787 名前:774 mailto:sage [2009/10/09(金) 17:07:06 ]
>>785
普通にcryptで出来るんですね・・・ありがとうございました。

>>781
>>786
趣味で自宅サーバーをやっているのですが
Perlからsystem関数でuseraddを使うためです。
誤解を招く質問をしてしまい申し訳ありません。



788 名前:777 mailto:sage [2009/10/10(土) 03:46:06 ]
>786
おっしゃる通り、HTTPレスポンスから取得出来ました。
Perlの質問ではありませんでした…

789 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 01:53:02 ]
自己解決しましたっつーのは自分が苦労して答えを導き出せたから
掲示板に答えが書かれてしまうと自分の苦労の価値が下がってしまうから
それを避けるための自慰行為。
「Webリソース」とか書くようなバ力は788なんかじゃなくてwcとかで解決したつもりだろ。


790 名前:デフォルトの名無しさん [2009/10/11(日) 03:25:57 ]
>>787
お陰さまで私も勉強になりました。
今時のシステムはパスワード暗号化にsha512使ってるなんて
知りませんでしたから。
うちのシステムは何を使ってるんだろ?

791 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:13:01 ]
gzファイルをgzopenを使って読み込みこむことはできたんですが
日本語が文字化けしてしまいます
普通のtxtファイルなどは日本語でも文字化けしません
どうしたらいいんでしょうか

792 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:20:33 ]
>>791
使うな。

793 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:25:11 ]
gzopenを使うなってことですか?

794 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 20:54:51 ]
perlを使うな

795 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 21:03:41 ]
perlだとできないんですか?
それじゃphpでやってみます・・

796 名前:デフォルトの名無しさん [2009/10/11(日) 23:57:04 ]
連想配列について質問です。
たとえばkeysでとりだしたハッシュの順序は一定ではないそうですが、
何回もperl *.plで実行しても同じ順序でキーが取り出されます。
ハッシュの順序はOS依存なんですか?それともperlのバージョン依存なんですか?
同じ環境のもとで同じプログラムにした場合はkeysでとりだされるキーも同じ順序になるのですか?

797 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:12:59 ]
ハッシュ依存じゃないの?



798 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:17:12 ]
>一定ではないそうですが

これは誰から聞いたの?

799 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:35:34 ]
別に乱数は使ってないよ

800 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:51:45 ]
一定ではないというのは環境によるんだろうが
ハッシュに順序の保障を求めるべきではないとは思う
順序の保障が欲しければリストを利用/併用すべきだろうな

801 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:24:16 ]
perlのバージョン依存。

perl5.10.0のperldoc -f keysでは、
===========
超訳。
perl5.8.1までは、セキュリティー上の理由から、
keysはプログラムを実行する度に違う順序で取り出されてた。
(順番自体は見た目上ランダムに決定されてる。ただし、
同一プロセス内で、hashに変更が無いならeach, valuesでも
keysと同じ順である事は保証される。)
===========
暗に「より新しいperlではkeysはhashに変更が無いなら
プログラムを複数回実行しても同じ順に取り出される。」
と言ってはいるが、それをkeysのperldocでは明文化は
してない。
ここまで調べて面倒になった。

俺も>>800氏と同じ見解だし。


802 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:32:14 ]
うそっ
わざわざランダムにしてたんだ

for (keys
っていう処理はするけど、大抵はsortとセットだから気にしたこともなかった

803 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:52:49 ]
>>801
逆だ。5.8.0までは特定の順序で取り出されていたのを、
5.8.1以降で変わるようにしたんだ。

perldoc.perl.org/functions/keys.html
> Since Perl 5.8.1 the ordering is different even between different runs of Perl
> for security reasons (see "Algorithmic Complexity Attacks" in perlsec).

perldoc.perl.org/perlsec.html#Algorithmic-Complexity-Attacks
perldoc.jp/docs/perl/5.10.0/perlsec.pod

804 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 03:59:09 ]
セキュリティが理由なら、止めてしまう訳ないしな

805 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 05:43:17 ]
質問です。サブルーチンの途中でreturnせずに戻り値を返すことは可能でしょうか?

長文処理の自作モジュールに引数としてファイル名を渡し、
サブルーチン内でopen、while(各行処理)、closeまで行なっています。

行数が数千行になるので各行で処理を終えたい(@本文のようなリストは作りたくない)のです。
現在サブルーチン内で各行をprintしていますが、どうもスマートではないと思い質問しました。

いまの状態を簡易に書くとこんな感じです。

(呼び出し側)
$foo->get('file')

(package foo内のサブルーチン)
sub get {
my $self = shift;
my $file = shift;
open my $in, "< $file" or die($!);
while (<$in>) {
#ここで各行を処理してprint
}
close $in;
return 1;
}

素直に呼び出し側でファイルを開いて行単位でサブルーチンを呼ぶべきかとも思うのですが、
それもなんかスマートでない気がしてモヤモヤしています。よろしければ方向性だけでも示唆ください。

806 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 06:03:32 ]
コルーチン






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<256KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef