10/12/15 23:23:42
判別させるんじゃなくて渡すときに数値/文字列を決めてやるのではだめなのかな。
888:nobodyさん
10/12/17 16:39:29
文字列を連結させてprintする場合は、下記のAとBどちらを使うべきでしょうか?
my $str1 = "あ";
my $str2 = "い";
print "$str1$str2";#・・・A
print $str1 . $str2;#・・・B
889:nobodyさん
10/12/17 17:36:30
>>888
実行環境と渡す内容によるし、繋げずに渡してもいい。
print $str1, $str2;
強いて言うなら、特定の条件下でカリカリにチューニングしたいわけでないなら
「読みやすいように」書くといい。
890:888
10/12/17 17:43:29
>>889
ケースバイケースって事ですね。
ありがとうございます。
891:nobodyさん
10/12/18 00:07:20 qL35dvRo
1、入力された数値の数だけフレーム分割した画面を表示したいです。
2、テキストタイプのinputで数字をname="number"で受け取り
cgiで<frame>のタグを繰り返すという内容にしたつもりです。
(内容は下記の状態になってます。)
3、しかし、実行結果のページでは何も表示されません。
何がいけないのかご指摘お願いします。
read(STDIN,$str,$ENV{"CONTENT_LENGTH"});
$str=~tr/+/ /;
$str=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c",hex($1))/eg;
foreach (split(/&/,$str)){
my ($key,$value)=split(/=/,$_);
$input{$key}=$value;
}
$height=100/$input{number};
print "<html>\n";
print "<head><title>first_result</title></head>\n";
print "<frameset rows=\""."$height%,"x($input{number}-1)."$height%\">\n";
for($n=0;$n<$input{howmany};$n++){
print "<frame src=\"second_part.html\" name=\"second\">\n";
}
print "</frameset>\n";
print "</html>\n";
892:nobodyさん
10/12/18 04:56:26
$input{howmany}でループを回しているから
893:nobodyさん
10/12/18 05:40:58
そういうつまらんミスで時間を無駄にしないためにも
せめて use strict; くらいは使おうぜ
894:Perl忍者 ◆M5ZWRnXOj6
10/12/18 14:12:29 lZZb3And
perlのスレってネトゲみたい
895:nobodyさん
10/12/18 22:45:42 eFFNyC2E
正規表現について質問です
以下のソースを実行しているのですが…
#========
my $text = "10a|10b|10c";
$text =~ /(10.)/g;
print $1;
print $2;
print $3;
#========
「"10"で始まり、その次の1文字まで含めた値」を全て取得したいのですが、
出力されるのは何故か$1だけで、$2以下は「Use of uninitialized value」とエラーが出てしまいます
マッチした部分は特殊変数$1、$2、$3…と順次格納されると考えていたのですが…
どの部分がおかしいのでしょうか?
896:nobodyさん
10/12/18 23:05:25
>>895
パターン内にあるキャプチャ用のカッコが1つだけだから $2 以降は使われないよ。
my @matches = $text =~ /(10.)/g;
print "@matches\n";
こんな風に配列に入れたらどうかな。
897:nobodyさん
10/12/18 23:12:09 eFFNyC2E
>>896
自分の正規表現の理解が間違っていたようです
配列で取得する必要があったのですね
ありがとうございました
898:nobodyさん
10/12/19 01:56:11
一括取得ではなく順ぐりに1つずつ処理でもいいなら
while($text=~/(10.)/g){print $1;}
以上蛇足
899:nobodyさん
10/12/19 17:16:51
i
900:nobodyさん
10/12/20 04:07:28
>>890
速度的には「,」繋ぎが速いらしいね
""でくくると変数の範囲をチェックするし、「.」で繋ぐと変数の中身を判断するんで、その分遅くなるのだそうな
901:nobodyさん
10/12/20 12:51:46 klkFZZbW
perl5.8.8で、use utf8としてutf8でソースを書いています。
その中で文字列を生成→出力と単純な処理を行っているのですが、文字列がある一定の長さを
越えた辺りで、iso-2022-jpで出力するとその長さ前後の数文字だけ\b{xxxx}の形に文字化けします。
eucやutf8で出力すると、化けません。
また、適当な長さのところに改行を入れると、iso-2022-jpでも文字化けしません。
これってどういう現象なのでしょうか..解決先を御存じ、または同じ現象に遭遇した方いらっしゃいますでしょうか。
902:nobodyさん
10/12/20 12:57:22 klkFZZbW
>901
すいません、化け方は\x{xxxxx}の間違いです。やはり直前の改行以降300文字前後で化けます。
903:nobodyさん
10/12/20 13:06:16 klkFZZbW
>901
実験にこんなプログラムを書きましたが、再現しました。340文字で改行するとOKでした。
#!/usr/bin/perl
use strict;
use Encode;
use utf8;
binmode STDOUT,":encoding(iso-2022-jp)";
my $x;
for(my $i = 0; $i < 1000;$i++){
$x .= "あ";
}
print $x . "\n";
904:nobodyさん
10/12/20 14:28:44
>>903
手元のlinux上の5.10.1で動かしてみたが別に変なことはないけどな。
プログラムは特になんの変哲もないから、現象が本当ならなにかの
バグぐらいしかおもいつかない。バージョンや環境は?
905:nobodyさん
10/12/20 14:32:42 klkFZZbW
>904
RedHat ES4 + perl-5.8.5と、FreeBSD 5-STABLE + perl 5.8.8の2つの環境で
確認しました。
perlのバグですかね・・・。うーん。
906:nobodyさん
10/12/20 15:19:18
Encode.pm で落ちてるみたいだけど・・。
does not map to euc-jp at /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/Encode.pm line 158.
途中で euc にマッチするコードになるんだろうか?
binmode を使わないで、最後の方をこうするしかないみたい。
-------------
utf8::encode($x);
Encode::from_to($x, 'utf8', 'iso-2022-jp');
print $x . "\n";
-------------
907:nobodyさん
10/12/20 15:25:33 klkFZZbW
>906
最新のEncode.pm(2.40)でもdoes not map to euc-jpと出ました。
5.10.1でOKということはEncode.pmの問題じゃなくて本体の方の問題ですかね。
>binmode を使わないで、最後の方をこうするしかないみたい。
なるほど、確かにこちらならOKでした。
出力先がフィルターやファイルなのでこのまま書き直してうまく行くか確認が
必要ですが、こちらの方で動くか試してみます。ありがとうございます!