Perlについての質問箱 48箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/08/20(土) 20:36:37.25CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
http://www.perl.org/get.html
● 2011/08/20 現在の最新版: 5.14.1
▼ 前スレ
Perlについての質問箱 47箱目
http://hibari.2ch.net/test/read.cgi/tech/1306333092/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り
0153デフォルトの名無しさん
2011/09/02(金) 13:57:22.51use utf8 してれば、各関数はそれぞれ下の1行で済む。
pops → substr($str, 0, 1);
pushs → $str .= 'TEST';
もっと付加価値を付けなきゃ作る意味が無いよ。
0154デフォルトの名無しさん
2011/09/02(金) 15:47:46.46$_[0]が引数のエイリアスだからそれを操作すれば呼び出し元を操作したことになるよ
sub pops ($) {
my @t = split // , $_[0] ;
pop @t ;
$_[0] = join "", @t ;
}
0155デフォルトの名無しさん
2011/09/02(金) 16:27:18.62> 1998年リリースの5.005から
おお。ありがとう。
手元の「新Perlの国へようこそ Perl5対応版」には (?<= ) と (?<! ) は載ってなかった。
かわりに ?PATTERN? なんてのを再発見。こんなの使ったことなかったなあ。
いい機会なんで正規表現の仕様を見直して覚え直しておきます。
0156デフォルトの名無しさん
2011/09/02(金) 16:30:51.290157デフォルトの名無しさん
2011/09/02(金) 16:36:34.01(?<= ) と同じような機能で量指定子も使える\Kというのも最近できたよ
0158デフォルトの名無しさん
2011/09/02(金) 16:40:03.27/^(?!.*?fuga)(?=.*?hoge)/
でどう?
>>154
返り値は?
0159デフォルトの名無しさん
2011/09/02(金) 22:45:51.20どうしても lookahead で表現したいとなると、以下みたいな超絶マゾ正規表現になる。
メリット皆無。
while( <DATA> ){
chomp ;
if (m{ (?: # キャプチャしない。
(?<=(?!fuga).{4}) # fuga じゃない 4 文字 の右にカーソル
| # か、
(?<=^.{3}) # 行頭の任意の 3 文字 の右にカーソル
| # か、
(?<=^.{2}) # 行頭の 2 文字 の右にカーソル
| # か、
(?<=^.) # 行頭の 1 文字 の右にカーソル
| # か、
(?<=^) # 行頭の 0 文字 の右にカーソル
)
hoge # で且つ hoge
}x ){
print "$_: hit!\n" ;
}
}
__DATA__
fugahoge
hoge
dhoge
ddhoge
dddhoge
ddddhoge
dddddhoge
0160デフォルトの名無しさん
2011/09/02(金) 23:06:02.145.14.1だと、m{\K(?:(?!fuga).{4}|^.{0,3})hoge} で行けるみたい。
へ〜
0161デフォルトの名無しさん
2011/09/03(土) 00:35:11.960162デフォルトの名無しさん
2011/09/03(土) 01:03:35.710163デフォルトの名無しさん
2011/09/04(日) 14:22:30.05imgタグでdata-src属性のURLが特定の正規表現にマッチするもののみを、全て抽出することは出来るでしょうか?
imgタグのsrc属性であれば$mech->find_all_images(url_regex => qr//)としてやることで出来ると分かったのですが、
data-src属性の場合のやり方がわかりません。どなたかご助言していただけると幸いです _ _
0164デフォルトの名無しさん
2011/09/04(日) 18:39:36.69聞いたことないんだが。
0165デフォルトの名無しさん
2011/09/04(日) 19:15:05.120166デフォルトの名無しさん
2011/09/04(日) 21:38:51.91$mech->content()を別のパーザに突っ込むしかない。
0167デフォルトの名無しさん
2011/09/04(日) 22:43:02.41しかしHTML5ってまだ勧告レベルでもないんだろ。(2014年仕様確定予定らしい)
世の中気の早い奴が多すぎるわな。
0168163
2011/09/05(月) 09:10:35.64>>165 ありがとうございます。なるほど・・・
>>166 ありがとうございます!そうしますー
>>167 ですねー
ありがとうございました!
0169デフォルトの名無しさん
2011/09/05(月) 19:14:38.22最近のメールフォーム用CGIは機能が多すぎてJqueryのバリデーションと機能が被ってしまいます。
そこでJqueryでバリデーションしてデータだけをpostさせたいのですが、ただデータを送るだけのメールフォームCGIはどういうふうに書けばいいのでしょうか。
0170デフォルトの名無しさん
2011/09/05(月) 19:19:38.27>>1
webprogへ行け
0171デフォルトの名無しさん
2011/09/05(月) 21:34:28.95既存のCGIからバリデーション部分を削除すれば目的は達せられる。
だがJavaScript(jQuery)の動作しない環境から送られたデータはどうするつもりだ。
あるいは悪意をもって偽装したデータを投げてくる奴がいないとも限らないぞ。
スレ違いでアレだが、送信されてきたデータは常に疑ってかかれ。検証しろ。
問題ないシロモノという前提で扱ってるといつか痛い目をみるぞ。
0172デフォルトの名無しさん
2011/09/05(月) 22:11:49.39171さんはmalaさんですか???
まじ頭がセキュオタになってますよ
0173デフォルトの名無しさん
2011/09/05(月) 22:14:18.160174171
2011/09/05(月) 22:35:02.65いや、セキュオタ(?)でなくてもこれくらいは普通に気を使うでしょ?JK
ユーザが自分だけなら多少のコーディングの手抜きは運用でカバーもできるけど。
受付フォーム(を受け取るCGI)なんて誰がどう使うかわかんないんだからさ。
0175デフォルトの名無しさん
2011/09/05(月) 22:36:28.720176デフォルトの名無しさん
2011/09/05(月) 22:44:39.38誘導されてるんだから煽りにかまってないで放置でおk
0178Perl忍者
2011/09/05(月) 22:52:25.12なにを今更感でっぱなし
0179デフォルトの名無しさん
2011/09/05(月) 22:54:42.610180Perl忍者
2011/09/05(月) 22:54:50.430181デフォルトの名無しさん
2011/09/06(火) 00:37:35.040182デフォルトの名無しさん
2011/09/06(火) 01:49:50.970183デフォルトの名無しさん
2011/09/06(火) 03:20:52.67何が原因なんでしょうか? 技術面、それとも人的資源面?
ttp://strawberryperl.com/
リポジトリもコミットが途絶えているみたいですし、心配です。
ttp://hg.curtisjewell.name/Perl-Dist-Strawberry-BuildPerl-5140
ttp://hg.curtisjewell.name/Perl-Dist-Strawberry-BuildPerl-5141
ここでもドンピシャな回答はなかったみたいです。
ttp://www.perlmonks.org/?node_id=910099
0184デフォルトの名無しさん
2011/09/06(火) 06:31:53.13放置放置
0185デフォルトの名無しさん
2011/09/06(火) 15:19:26.18どのようにしたら良いのでしょうか?
ためしにglobで拾ってみると下記のようになります。
�@の部分をデスクトップディレクトリにしたいのですが、どう書けばよいのでしょうか?
use utf8;
use Encode;
#拾える(Documents and SettingsをDocuments*としてスペースを書かない)
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', "/Documents*/user/デスクトップ/*" ) ) ];
#拾えない
my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', "/Documents and Settings/user/デスクトップ/*" ) ) ];
my $outPath = "�@どう書いたらいい???";
open(OUT, ">$outPath")
print OUT encode('utf8', "あああああ");
close(OUT);
0186185
2011/09/06(火) 15:27:11.93今ググっていたらeclipseの問題のような気がしてきた。。
0187デフォルトの名無しさん
2011/09/06(火) 16:02:43.691ハッシュとは別にキーの配列作る
2ハッシュの持つ要素に順序数を含める
どっちがよさそうですか?
1は
@key=(qw/aaa bbb ccc/);
@hash{@key} = (9,8,7);
2は
$hash{aaa}=[0, 9]
のような感じです
それとも単純に[0, 'aaa', 9]と全部配列にまとめてしまうのがいいでしょうか?
0188デフォルトの名無しさん
2011/09/06(火) 16:07:20.10http://perldoc.jp/docs/perl/5.10.1/perlfaq4.pod#How32can32I32always32keep32my32hash32sorted63
0189デフォルトの名無しさん
2011/09/06(火) 17:45:02.85個数が変化するので$1などは使えないです。
m|value=([^ ]+)|gxms;
0190デフォルトの名無しさん
2011/09/06(火) 18:32:17.11while等でループまわして$1を適当な配列にpush
0191デフォルトの名無しさん
2011/09/06(火) 18:34:40.102.はhash呼ぶ度に、sort かけなきゃいけないから、
頻繁に呼ぶ場合にはメリットがない
for ( sort keys %hash ){ #normal
for ( sort { $hash{$a}->[0] <=> $hash{$b}->[0] } keys %hash ){ #順序数を含める
1.は良く使う手段。
>>188はウィザードのやる事で、
>本当にこれが必要ですか? :)
てーのは、1.みたいな手段を念頭に入れた上での記載。と、いらぬフォロー。
>>189
my @dat = m|value=([^ ]+)|gxms;
my @dat = ( $hoge =~ m|value=([^ ]+)|gxms ) ;
0192デフォルトの名無しさん
2011/09/06(火) 18:41:30.76my $str = <<'EOD';
value=foo
value=bar value=baz
value=
quux
value=
lvalue=corge
rvalue=grault
EOD
my(@v1, @v2);
push @v1, "[$1]\n" while $str =~ m|value=([^ ]+)|gxms;
push @v2, "[$1]\n" while $str =~ /\bvalue=(\S+)/g;
print @v1, "---\n", @v2;
0193デフォルトの名無しさん
2011/09/06(火) 19:47:00.69my $path = [ map{ encode('utf8', decode('cp932', $_ ) ) } glob( encode('cp932', q{"/Documents and Settings/user/デスクトップ/*"} ) ) ];
my $outPath = "/Documents and Settings/user/デスクトップ/foo.txt";
0194185
2011/09/07(水) 01:10:47.58一つ目は出来ました。
二つ目はやはりできないようです。
eclipseでググッたらスペースうんたらとあるのでやはりeclipseの問題のようです。
ありがとうございました。
0195デフォルトの名無しさん
2011/09/07(水) 02:36:27.74perlは、SJIS、EUC、UTF-8の3つの文字コードの中で何が一番適しているのですか?
それぞれの良い点と悪い点も教えていただきたいです。
もし、ほとんど差がないとすれば、ホームページをつくる上でこれから主流になると
考えられる文字コードがどれか教えてください。よろしくお願いします。
0196デフォルトの名無しさん
2011/09/07(水) 02:42:19.81あとは内部表現でggr
0197デフォルトの名無しさん
2011/09/07(水) 03:39:06.29今のPerlはUTF-8(かLatin-1かascii)で書くことが前提なのでUTF-8一択。
他のコードで書けなくもないけど実行前にフィルターかけるだけでいろいろ問題がでるので強く非推奨とされている。
ホームページ → 個人的な感触では既にUTF-8が主流
0198デフォルトの名無しさん
2011/09/07(水) 08:27:35.87-------------------
AAAA_A9999.jpg
AAAA_B1111.jpg
AAAA_C0000a.jpg
-------------------
といった感じでファイルがあるんですが、
これを _[ABC]以降の文字列でソートした結果を得たいです。
AAAA_C0000a.jpg
AAAA_B1111.jpg
AAAA_A9999.jpg
が期待する結果
dir /b | perl -ne "〜"
とワンライナーで行いたいです、ご教授お願いします。
0199デフォルトの名無しさん
2011/09/07(水) 08:46:47.40http://perldoc.jp/docs/perl/5.10.1/perlfaq4.pod#How32do32I32sort32an32array32by32anything41
dir /b | perl -e "@i=map/(?<=_[ABC])(.+)/,@f=<>;print@f[sort{$i[$a]cmp$i[$b]}0..$#i]"
0200デフォルトの名無しさん
2011/09/07(水) 08:47:27.920201デフォルトの名無しさん
2011/09/07(水) 09:59:03.82$outPathをencodeし忘れてない?
0203デフォルトの名無しさん
2011/09/07(水) 14:53:17.89'"document files"'
0204194
2011/09/07(水) 16:47:53.40おおおーーー!!
出来ました。
冷静に考えればglob()の時encodeしてるんだからopen()の時もencodeしないとですね。
スコーンと抜けてました。
ありがとうございます。
0205デフォルトの名無しさん
2011/09/08(木) 00:54:41.53大文字や小文字を同一視したり、
9の次に10が来たりするような感じの
0206デフォルトの名無しさん
2011/09/08(木) 01:21:17.16使ったことはないけど
0207デフォルトの名無しさん
2011/09/08(木) 18:58:02.37何時間ぐらいで身につくの?
やる気さえあれば
0209デフォルトの名無しさん
2011/09/08(木) 19:13:46.16トリッキーなやり方気にしないなら数時間〜数十時間?
当分の間はファニー文字付け忘れてコンパイラに怒られると思うがw
0210デフォルトの名無しさん
2011/09/08(木) 19:30:43.370211デフォルトの名無しさん
2011/09/08(木) 19:45:28.90最初のうちは???だろうなあ
0212デフォルトの名無しさん
2011/09/08(木) 20:08:31.890213デフォルトの名無しさん
2011/09/08(木) 20:26:09.450214デフォルトの名無しさん
2011/09/09(金) 02:16:57.82その流れからか、% や @ を使わずに、無駄に
$data = []
とか、
$data = {}
とかやるクセが付いたw
0215デフォルトの名無しさん
2011/09/09(金) 07:21:31.560216デフォルトの名無しさん
2011/09/09(金) 09:17:53.500217デフォルトの名無しさん
2011/09/09(金) 12:27:31.840218デフォルトの名無しさん
2011/09/09(金) 12:33:28.67use lib qw(/cgi-bin/mycpan/);
use URI::Escape;
use SHA::PurePerl qw(hmac_sha256_base64);
なぜかこれが通りません
Escape.pmは/cgi-bin/mycpan/URI/に
PurePerl.pmは/cgi-bin/mycpan/SHA/に入っており、実行ファイル(test.cgi)は/にあります。
/ test.cgi
└cgi-bin−mycpan┬SHA−Escape.pm
└URI−PurePerl.pm という感じになっています。
これだけでエラーの原因が分かる方いませんか?
0219デフォルトの名無しさん
2011/09/09(金) 12:34:49.640220デフォルトの名無しさん
2011/09/09(金) 12:44:57.740221デフォルトの名無しさん
2011/09/09(金) 12:47:42.11だから困っていて・・・
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, xxx@xxx and inform them of the time the error occurred,
and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
0222デフォルトの名無しさん
2011/09/09(金) 12:56:10.32下記よりシンプル&同等以上の速度で処理するにはどのように書けばよいでしょうか?
my @hoge = ( "AAA","BBB" )
my @fuga = ();
map{ push( @fuga, { NAME => $_ } ) } @hoge;
0223デフォルトの名無しさん
2011/09/09(金) 12:57:00.58板違いだからwebprog板へどうぞ。
ブラウザの結果じゃなくて鯖側にエラーログのファイルがあるから探すように。
0224デフォルトの名無しさん
2011/09/09(金) 12:58:50.71失礼しました
0225デフォルトの名無しさん
2011/09/09(金) 13:06:07.88文面どおりに解釈すると
my @fuga = ( {NAME=>'AAA'}, {NAME=>'BBB'} );
とか?
でも速度の問題は実際に計ってみないとわからないし、そんな些細な部分の速度を気にしても費用対効果が悪すぎる。
>>222の書き方でも十分シンプル&高速だと思うよ。
0226デフォルトの名無しさん
2011/09/09(金) 13:28:50.21速度はほとんどかわらないが(ちょっとだけ速かった)、シンプルはシンプル。
my @fuga = map {NAME => $_}, @hoge;
0227デフォルトの名無しさん
2011/09/09(金) 13:54:03.030228デフォルトの名無しさん
2011/09/09(金) 14:11:01.97うん。そゆこと。
2個ぐらいなら、普通に Hoge($opt1, $opt2, $opt3) とか渡してるんだけど、
3個以上になったり、その戻り値をそのまま他の関数に渡したいときはハッシュのリファレンスが
もの凄く楽ちん。
0230デフォルトの名無しさん
2011/09/09(金) 18:13:32.03if($LOGIN==0){
print "location:login_form.cgi\n";
}
print "\n";
if($FORM{'soushin'} ne ""){
&toukou_write; #投稿の書き込み
}
書き込みのsoushinボタンを押したとき、ログインしてないときはログインフォームに飛ばすようにしていますが
ログインフォームに飛んだはずなのに投稿の書き込みが実行されてしまいます。
locationで飛んだらそれ以降は実行されないんじゃないんですか?
0231デフォルトの名無しさん
2011/09/09(金) 18:20:05.47誘導も面倒だから答えてあげるけど
Content-typeの記述したらそうなるさ。
0232デフォルトの名無しさん
2011/09/09(金) 18:25:30.020233デフォルトの名無しさん
2011/09/09(金) 18:39:24.00#perlでは全てが文字列
use strict ;
use warnings ;
my $s = 4 ;
my $t = 7 ;
print $s . $t,"\n"; # 「47」を出力 (文字列として結合)
print $s + $t,"\n"; # 「11」を出力 (数値として足し算)
print $s x $t,"\n"; # 「4444444」を出力 (文字「4」を7回出力)
print $t x $s,"\n"; # 「7777」を出力 (文字「7」を4回出力)
0234デフォルトの名無しさん
2011/09/09(金) 18:55:17.30全て文字列…ではないぞ
. + x といった演算子が文字列として解釈するだけだ
0235デフォルトの名無しさん
2011/09/09(金) 23:55:58.630236デフォルトの名無しさん
2011/09/10(土) 01:19:17.94これに5を足して下記のようにしたいのですが、シンプルに書くとどんな感じになりますか?
mapあたりを活用するんでしょうか。
my $aaa = [ '01:00', '02:00', '04:00',〜,〜 ];
my $bbb = 〜
結果→ $bbb = '06:00;07:00;0900;〜;〜'
0237デフォルトの名無しさん
2011/09/10(土) 01:35:23.270238236
2011/09/10(土) 01:47:53.41どんな書き方になりますか?
今はこんなどんくさいことになっています。。↓
my $aaa = [ '01:00', '02:00', '04:00',〜,〜 ];
foreach( @$aaa ){
if( m|^(\d+):(\d+)$|xms ){
$time .= sprintf(",%02d:%02d",$1+5,$2);
}
}
$time =~ s/^,//xms;
0239デフォルトの名無しさん
2011/09/10(土) 03:16:52.14$bbb =~ s/([0-9]{2}):/sprintf '%02d:', $1 + 5/ge;
こんな感じでどう?
19時以降だとありえない時間になるけどw
0240デフォルトの名無しさん
2011/09/10(土) 03:58:39.44my $bbb = join(';',
map{
m/(\d\d):(\d\d)/ ? sprintf("%02d:%02d", ($1 + 5) % 24, $2) : $_
} @{$aaa}
);
0241デフォルトの名無しさん
2011/09/10(土) 06:17:52.52その m// と s/// についてる xms ってオプション、すげー気持ち悪いんだけど…。
0242デフォルトの名無しさん
2011/09/10(土) 06:30:16.08strict, warnings と同様、空気同然に付ける人もいる
0243デフォルトの名無しさん
2011/09/10(土) 06:31:08.890244デフォルトの名無しさん
2011/09/10(土) 07:18:08.96/x 使ってる割には空白も入れてないし、
/m 使うんなら ^ $ と \A \z の使い分けも普段から正確にしといたほうがいい
0245デフォルトの名無しさん
2011/09/10(土) 07:20:03.080246デフォルトの名無しさん
2011/09/10(土) 08:05:06.641つのスカラー変数に文字列と数値が共存してるから各々を使い分けたりもできるね
404 Blog Not Found:perl - Scalar::Util::dualvar()
http://blog.livedoor.jp/dankogai/archives/51129553.html
0247デフォルトの名無しさん
2011/09/10(土) 09:29:42.31バイナリデータと文字列って区別つくの?
0248デフォルトの名無しさん
2011/09/10(土) 10:21:18.940249デフォルトの名無しさん
2011/09/10(土) 10:37:44.32つまり一般的に
文字列 ⊆ バイナリデータ
が成り立つ。
これを
文字列 = バイナリデータ
とするのが、UNIX に古くから伝わるテクニック
で、UNIX 版の Perl は binmode 関数を必要と
していない。binmode 関数はDOS系のOS、あるいは
DOS系OS用スクリプトと互換性を持たせたい場合
に用意されている。
0250デフォルトの名無しさん
2011/09/10(土) 10:47:39.10テキストデータとバイナリデータの区別はつくのかという一般的な命題?
0251デフォルトの名無しさん
2011/09/10(土) 11:31:15.68そうそう。文字列はバイナリデータと違ってメタ情報を含んでいる。
バイナリデータは単なるバイトの並びだが、文字列は、文字コードというメタ情報
1文字を構成する要素(1文字=何バイトか)とかそういう情報を含んでいる。
だから、数値はどの文字コードでも1バイトで同じコードであるように(文字コード側が譲歩して)
作られているから数値も文字列で扱うのは可能だけど、少なくともバイナリと文字を見分けるための
型情報が必要になるのではないかと。
数値は同じコードって書いたけどJIS系は同じコードで数値じゃない場合もあるか。
でも、JISは最初は(エスケープシーケンスがでるまでは)ASCIIモードであると定義されているよね。
ということで、バイナリデータを扱うなら全部文字列として扱うってのは不可能でしょ?
型情報が必要になる。
0252デフォルトの名無しさん
2011/09/10(土) 11:56:35.15メタ情報はおれ達の頭の中にあるんじゃないか。
■ このスレッドは過去ログ倉庫に格納されています