質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1729閲覧

perlで文字を2文字ずつに区切る

yooashleaf

総合スコア32

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/01/26 15:33

編集2019/01/27 04:20

perlで文字を2文字ずつに区切るには以下の様に配列に入れると思うのですが、
なぜか02というものを含むときにうまくいきません。

$str = "010286FP";
@array = $str =~ /.{2}/g;

foreach (@array) {
print "$_<br>";
}

結果->
01
0
2
86
FP

となり、なぜか02が0と2で分割されてしまってます。
これは何が原因として考えられるでしょうか?

追記:
確かにこのままコピペすると正常に動作します。
実は$strはフォームのcheckboxで受け取った数字なのですが、その値を分割するとこうなります。
フォームの部分の受け取りがおかしいのでしょうか?

▼HTML
<input type="checkbox" name="data" value="01">01
<input type="checkbox" name="data" value="02">02
<input type="checkbox" name="data" value="86">86
<input type="checkbox" name="data" value="FP">FP

▼perl
&decode;
$str = $in{'data'};
@array = $str =~ /.{2}/g;

foreach (@array) {
print "$_<br>";
}

sub decode {
local($key,$val);

&ReadParse; while (($key,$val) = each %in) { if ($key !~ /^upfile/) { &jcode'convert(*val, 'sjis'); $val =~ s/<>/&LT;&GT;/g; $val =~ s/&/&amp;/g; $val =~ s/"/&quot;/g; $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; } $in{$key} = $val; }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

目に見えないデータが文字列の中に入り込んでいる(見た目と実際が一致していない)可能性はありますね。日本語対応が十分ではない環境下でエディタで全角文字を半角文字に置き換える編集を行った際にそういう目にあったことがあります。

print join(' ', unpack('C*', $str))

これで本来なら

48 49 48 50 56 54 70 80

となるはずですが、たぶん途中に余計なものが挟まったりしているのではないでしょうか。

投稿2019/01/27 13:09

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yooashleaf

2019/01/27 19:34

unpack関数ですか! やはりそういう事象は有り得ますよね。 取り急ぎ問題は解決しましたが、引き続き検証してみます! ありがとうございました!
guest

0

再現しませんので、タイプミスか、勘違いでしょう。

投稿2019/01/26 15:41

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/01/26 16:14

質問のコードをコピペして実行しても現象が出ますか?
yooashleaf

2019/01/27 04:21

確かにこのままコピペすると正常に動作します。 質問文に追記しましたので、ご確認頂けますでしょうか?
otn

2019/01/27 05:04

$strの値が期待通りで無いと言うことでしょう。
KojiDoi

2019/01/27 11:14

%inはどうやって作ったのでしょうか?
yooashleaf

2019/01/27 11:52

otn様 チェックボックスをすべてチェックし print "$in{'data'}"; とすると 010286FP となります KojiDoi様 ReadParseについてはよく理解していないのですが、フォームの値を受け取る時にこのようにしております。
otn

2019/01/27 12:08

$strの中身が、"010286FP" であればちゃんと分割できたわけなので、 そうならないということは、中身が違うと言うことです。
yooashleaf

2019/01/27 12:43

確かにそうですよね.. 取り急ぎ以下の様に、valueにカンマを加え、それをsplitで分割するとうまくいきました。 <input type="checkbox" name="data" value="01,">01 <input type="checkbox" name="data" value="02,">02 <input type="checkbox" name="data" value="86,">86 <input type="checkbox" name="data" value="FP,">FP $str = "$in{'data'}"; chop($str); @array = split(/,/, $str); 取り急ぎ解決はしましたが、 なぜ、文字の間に何か含まれているような挙動をしたのかは疑問です。 文字コードの問題なのでしょうか... 自己解決ではなく、追ってベストアンサーとさせて頂きます。 ご協力ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問